API ব্যবহার করে

Google Civic Information API ব্যবহার করার জন্য আপনার যা জানা দরকার তা এই নথিতে বর্ণনা করা হয়েছে। আপনি এই সিভিক ইনফো API FAQ দেখতে পারেন যেটিতে API সম্পর্কে কিছু প্রাথমিক তথ্যের পাশাপাশি আমাদের ব্যবহারকারী ফোরাম থেকে প্রায়শই জিজ্ঞাসিত প্রশ্ন রয়েছে। উপরন্তু, আপনি একটি নির্বাচনের সময় ভোটার তথ্য খোঁজার জন্য নীচের উদাহরণ দেখতে পারেন।

Google-এ আপনার আবেদন শনাক্ত করা

প্রতিটি অনুরোধের সাথে একটি API কী অন্তর্ভুক্ত করে আপনার অ্যাপ্লিকেশনটি Google Civic Information API-কে অনুরোধ পাঠালে প্রত্যেকবার নিজেকে সনাক্ত করতে হবে।

একটি API কী অর্জন এবং ব্যবহার করা

একটি API কী অর্জন করতে:

  1. API কনসোলে শংসাপত্র পৃষ্ঠা খুলুন।
  2. এই API দুই ধরনের শংসাপত্র সমর্থন করে। আপনার প্রকল্পের জন্য উপযুক্ত যে কোনো শংসাপত্র তৈরি করুন:
    • OAuth 2.0: যখনই আপনার অ্যাপ্লিকেশন ব্যক্তিগত ব্যবহারকারীর ডেটার অনুরোধ করে, তখন অনুরোধের সাথে একটি OAuth 2.0 টোকেন পাঠাতে হবে। আপনার আবেদন প্রথমে একটি ক্লায়েন্ট আইডি পাঠায় এবং সম্ভবত, একটি টোকেন পাওয়ার জন্য একটি ক্লায়েন্ট গোপনীয়তা পাঠায়। আপনি ওয়েব অ্যাপ্লিকেশন, পরিষেবা অ্যাকাউন্ট বা ইনস্টল করা অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 শংসাপত্র তৈরি করতে পারেন৷

      দ্রষ্টব্য: যেহেতু এই API-তে OAuth 2.0 অনুমোদনের প্রয়োজন এমন কোনও পদ্ধতি নেই, তাই আপনাকে শুধুমাত্র API কীগুলি পেতে হবে, যা নীচে বর্ণিত হয়েছে৷ যাইহোক, যদি আপনার অ্যাপ্লিকেশনটি অন্য API কল করে যার জন্য ব্যবহারকারীর অনুমোদনের প্রয়োজন হয়, তাহলে আপনার এখনও OAuth 2.0 শংসাপত্রের প্রয়োজন।

      আরও তথ্যের জন্য, OAuth 2.0 ডকুমেন্টেশন দেখুন।

    • API কী: একটি অনুরোধ যা একটি OAuth 2.0 টোকেন প্রদান করে না একটি API কী পাঠাতে হবে। কী আপনার প্রকল্পকে শনাক্ত করে এবং API অ্যাক্সেস, কোটা এবং রিপোর্ট প্রদান করে।

      API API কীগুলিতে বিভিন্ন ধরণের সীমাবদ্ধতা সমর্থন করে। যদি আপনার প্রয়োজনীয় API কীটি ইতিমধ্যেই বিদ্যমান না থাকে, তাহলে Create Credentials > API কী ক্লিক করে কনসোলে একটি API কী তৈরি করুন। আপনি কীটিকে উৎপাদনে ব্যবহার করার আগে Restrict key-এ ক্লিক করে সীমাবদ্ধতাগুলির একটি নির্বাচন করে সীমাবদ্ধ করতে পারেন।

আপনার API কীগুলি সুরক্ষিত রাখতে, নিরাপদে API কীগুলি ব্যবহার করার জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করুন৷

আপনার একটি API কী থাকার পরে, আপনার অ্যাপ্লিকেশনটি সমস্ত অনুরোধের URL-এ ক্যোয়ারী প্যারামিটার key= yourAPIKey যোগ করতে পারে।

API কী ইউআরএল-এ এম্বেড করার জন্য নিরাপদ; এটা কোন এনকোডিং প্রয়োজন নেই.

API কী সীমাবদ্ধতা

আপনার API কী ডিফল্টরূপে সীমাবদ্ধ নয়, যেটি অনিরাপদ যদি কেউ হয় এই কীটি পড়তে পারে (উদাহরণস্বরূপ, একটি ব্রাউজারের মধ্যে রাখা হয়) বা কীটি স্থাপন করা ডিভাইসটি অ্যাক্সেস করতে পারে। অননুমোদিত ব্যবহার রোধ করতে আমরা আপনাকে এই API কী-তে একটি সীমাবদ্ধতা রাখার পরামর্শ দিই।

একটি সীমাবদ্ধতা যোগ করতে, API কী তৈরি করা ডায়ালগ বক্সের মধ্যে সীমাবদ্ধ কীটিতে ক্লিক করুন। API কী কনফিগারেশন প্যানেল প্রদর্শিত হবে:

আপনি যে ধরনের সীমাবদ্ধতা নির্বাচন করবেন তা নির্ভর করবে আপনার আবেদনের প্রয়োজনের উপর:

  • API-এর সাথে সরাসরি ইন্টারঅ্যাক্ট করা ওয়েব অ্যাপ্লিকেশনগুলি (অর্থাৎ, কোনো ব্যাকএন্ড বা মিডলওয়্যারের মাধ্যমে নয়) একটি HTTP রেফারার সীমাবদ্ধতা যুক্ত করা উচিত। উল্লেখ্য, তবে, এই ধরনের অ্যাপ্লিকেশনগুলি তাদের API কী সর্বজনীনভাবে প্রকাশ করবে; পরিবর্তে একটি পরিষেবা অ্যাকাউন্ট প্রমাণীকরণ স্কিম ব্যবহার করতে পছন্দ করুন৷
  • ব্যাকএন্ড অ্যাপ্লিকেশনগুলি যেগুলি অন্যথায় পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করতে পারে না (উদাহরণস্বরূপ, এমবেডেড ডিভাইসগুলি যেগুলির ক্লায়েন্ট লাইব্রেরিতে সমর্থিত ভাষা নেই) তাদের বিভিন্ন আইপি ঠিকানাগুলিতে ক্লায়েন্টদের থেকে ব্যবহার থেকে রক্ষা করার জন্য একটি IP ঠিকানা সীমাবদ্ধতা যুক্ত করা উচিত।
  • অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলির একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশান সীমাবদ্ধতা যুক্ত করা উচিত এবং আপনার প্যাকেজের নাম এবং SHA-1 স্বাক্ষর-শংসাপত্র আঙ্গুলের ছাপ যুক্ত করা উচিত৷
  • iOS অ্যাপ্লিকেশানগুলির একটি iOS অ্যাপের সীমাবদ্ধতা যুক্ত করা উচিত এবং এই iOS বান্ডেলগুলিতে API কলগুলিকে সীমাবদ্ধ করতে যেকোন iOS বান্ডেল শনাক্তকারী যোগ করা উচিত৷

পরীক্ষার জন্য, আপনি হয়তো কোনো সীমাবদ্ধতা রাখতে চান না। যাইহোক, এটি বাঞ্ছনীয় যে আপনি হয় এই কীটিতে একটি সীমাবদ্ধতা যুক্ত করুন বা একবার আপনি আপনার অ্যাপ্লিকেশনটি উত্পাদনে স্থাপন করার পরে এটি মুছুন।

ইলেকশনকোয়েরি উদাহরণ

এখানে একটি উদাহরণ (এপিআই সংস্করণ 'v2' ব্যবহার করে) বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ElectionQuery API-কে কল করার, তারপর একটি নির্বাচিত নির্বাচনের তথ্য পেতে ভোটারের নিবন্ধিত ঠিকানা সহ ভোটারইনফোকুয়েরি API ব্যবহার করে৷

বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ইলেকশনকুয়েরি ব্যবহার করুন:

  https://www.googleapis.com/civicinfo/v2/elections?key=<YOUR_API_KEY>
  

নির্বাচন প্রশ্নের উত্তর:

{
 "kind": "civicinfo#electionsqueryresponse",
 "elections": [
  {
   "id": "2000",
   "name": "VIP Test Election",
   "electionDay": "2013-06-06"
  },
  {
   "id": "2124",
   "name": "Rhode Island 2012 Primary Election",
   "electionDay": "2012-09-11"
  },
  {
   "id": "2126",
   "name": "Delaware 2012 Primary Election",
   "electionDay": "2012-09-11"
  }
 ]
}

ভোটার ইনফোকুয়েরি কার্ল ব্যবহার করে

ভিআইপি পরীক্ষার ইলেকশন আইডি 2000 এবং ভোটার (পরীক্ষা) ঠিকানা 340 Main St, Venice, CA 90291-এ ভোটারইনফোকুয়েরি অনুরোধ পাঠাতে curl ব্যবহার করুন। আপনি ভোটারইনফোকুয়েরি প্রতিক্রিয়া উল্লেখ করতে পারেন।

curl "https://www.googleapis.com/civicinfo/v2/voterinfo?key=<YOUR_API_KEY>&address=340%20Main%20St.%20Venice%20CA&electionId=2000"

জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ভোটারইনফোকুয়েরি

এই উদাহরণটি আগের কার্ল উদাহরণের মতো একই ভোটারইনফোকুয়েরি ইস্যু করে, তবে এটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। ভোটার ইনফোকুয়েরি প্রতিক্রিয়া কার্ল উদাহরণ প্রতিক্রিয়ার মতোই।

<!doctype html>
<html>
  <head>
    <script>
      /**
       * Build and execute request to look up voter info for provided address.
       * @param {string} address Address for which to fetch voter info.
       * @param {function(Object)} callback Function which takes the
       *     response object as a parameter.
       */
       function lookup(address, callback) {
       /**
         * Election ID for which to fetch voter info.
         * @type {number}
         */
        var electionId = 2000;
 
        /**
         * Request object for given parameters.
         * @type {gapi.client.HttpRequest}
         */
        var req = gapi.client.request({
            'path' : '/civicinfo/v2/voterinfo',
            'params' : {'electionId' : electionId, 'address' : address}
        });
       req.execute(callback);
      }

      /**
       * Render results in the DOM.
       * @param {Object} response Response object returned by the API.
       * @param {Object} rawResponse Raw response from the API.
       */
      function renderResults(response, rawResponse) {
        var el = document.getElementById('results');
        if (!response || response.error) {
          el.appendChild(document.createTextNode(
              'Error while trying to fetch polling place'));
          return;
        }
        var normalizedAddress = response.normalizedInput.line1 + ' ' +
            response.normalizedInput.city + ', ' +
            response.normalizedInput.state + ' ' +
            response.normalizedInput.zip;
        if (response.pollingLocations.length > 0) {
          var pollingLocation = response.pollingLocations[0].address;
          var pollingAddress = pollingLocation.locationName + ', ' +
              pollingLocation.line1 + ' ' +
              pollingLocation.city + ', ' +
              pollingLocation.state + ' ' +
              pollingLocation.zip;
          var normEl = document.createElement('strong');
          normEl.appendChild(document.createTextNode(
              'Polling place for ' + normalizedAddress + ': '));
          el.appendChild(normEl);
          el.appendChild(document.createTextNode(pollingAddress));
        } else {
          el.appendChild(document.createTextNode(
              'Could not find polling place for ' + normalizedAddress));
        }
      }

      /**
       * Initialize the API client and make a request.
       */
      function load() {
        gapi.client.setApiKey('YOUR API KEY GOES HERE');
        lookup('1263 Pacific Ave. Kansas City KS', renderResults);
      }
    </script>
    <script src="https://apis.google.com/js/client.js?onload=load"></script>
  </head>
  <body>
    <div id="results"></div>
  </body>
</html>

ভোটার ইনফোকোয়েরি প্রতিক্রিয়া

{
  "kind": "civicinfo#voterinforesponse",
  "status": "success",
  "election": {
  "id": "2000",
  "name": "VIP Test Election",
  "electionDay": "2025-06-06",
  "ocdDivisionId": "ocd-division/country:us"
  },
  "normalizedInput": {
    "line1": "340 Main Street",
    "city": "Venice",
    "state": "CA",
    "zip": "90291"
  },
  "pollingLocations": [
    {
      "address": {
        "locationName": "WESTMINSTER AVENUE ELEMENTARY SCHOOL",
        "line1": "1010 ABBOT KINNEY BLVD",
        "city": "VENICE",
        "state": "CA",
        "zip": "90291"
      },
      "pollingHours": "",
      "latitude": 33.9919351,
      "longitude": -118.4722031,
      "startDate": "2024-03-05",
      "endDate": "2024-03-05",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "address": {
        "locationName": "POP UP VOTE CENTER 5",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    }
  ],
  "dropOffLocations": [
    {
      "address": {
        "locationName": "FLEX VOTE CENTER 9",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
  ],
  "contests": [
    {
      "type": "General",
      "ballotTitle": "UNITED STATES REPRESENTATIVE, 36th District",
      "district": {
        "name": "36TH US CONGRESSIONAL",
        "scope": "congressional"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "103",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "ARIANA HAKAMI",
          "party": "Party Preference: Republican"
        },
        {
          "name": "CLAIRE RAGGE ANDERSON",
          "party": "Party Preference: None"
        },
        {
          "name": "MELISSA TOOMIM",
          "party": "Party Preference: Republican"
        },
        {
          "name": "TED W. LIEU",
          "party": "Party Preference: Democratic"
        }
      ]
    },
    {
      "type": "ballot-measure",
      "ballotTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "district": {
        "name": "CITY OF LOS ANGELES",
        "scope": "citywide"
      },
      "ballotPlacement": "116",
      "referendumTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "referendumText": "CITY MOBILITY PLAN STREET IMPROVEMENT MEASURES. INITIATIVE ORDINANCE HLA. Shall an ordinance providing that when the City of Los Angeles makes a qualifying improvement to a City-owned street (e.g., a paving project), the City must also install certain street enhancements described in the City's Mobility Plan network of pedestrian, bicycle, transit, and vehicle routes; and requiring the City to provide publicly accessible information regarding street improvements; be adopted?",
      "referendumPassageThreshold": "MAJORITY OF VOTES CAST",
      "referendumBallotResponses": [
        "YES",
        "NO"
      ],
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "type": "General",
      "ballotTitle": "DISTRICT ATTORNEY",
      "district": {
        "name": "LOS ANGELES COUNTY",
        "scope": "countywide"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "129",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "GEORGE GASCÓN"
        },
        {
          "name": "JONATHAN HATAMI"
        },
        {
          "name": "NATHAN HOCHMAN"
        },
        {
          "name": "DEBRA ARCHULETA"
        },
        {
          "name": "JEFF CHEMERINSKY"
        },
        {
          "name": "ERIC SIDDALL"
        },
        {
          "name": "MARIA RAMIREZ"
        },
        {
          "name": "DAN KAPELOVITZ"
        },
        {
          "name": "LLOYD \"BOBCAT\" MASSON"
        },
        {
          "name": "JOHN MCKINNEY"
        },
        {
          "name": "CRAIG J. MITCHELL"
        },
        {
          "name": "DAVID S. MILTON"
        }
      ]
    }
  ],
  "state": [
    {
      "name": "California",
      "electionAdministrationBody": {
        "name": "Secretary of State",
        "electionInfoUrl": "https://www.sos.ca.gov/elections/",
        "electionRegistrationUrl": "https://registertovote.ca.gov/?t=s",
        "electionRegistrationConfirmationUrl": "https://voterstatus.sos.ca.gov",
        "absenteeVotingInfoUrl": "https://elections.cdn.sos.ca.gov/vote-by-mail/replacement-application.pdf",
        "votingLocationFinderUrl": "https://voterstatus.sos.ca.gov",
        "ballotInfoUrl": "https://www.sos.ca.gov/elections/ballot-status/wheres-my-ballot/",
        "correspondenceAddress": {
          "line1": "1500 11th Street, 5th Floor",
          "city": "Sacramento",
          "state": "California",
          "zip": "95814"
        }
      },
      "local_jurisdiction": {
        "name": "Los Angeles",
        "electionAdministrationBody": {
          "name": "Registrar-Recorder/County Clerk",
          "electionInfoUrl": "http://www.lavote.gov/",
          "electionRegistrationUrl": "http://registertovote.ca.gov/",
          "electionRegistrationConfirmationUrl": "https://lavote.gov/vrstatus/",
          "absenteeVotingInfoUrl": "",
          "ballotInfoUrl": "http://www.lavote.gov/Locator",
          "physicalAddress": {
            "locationName": "Registrar-Recorder/County Clerk",
            "line1": "12400 Imperial Highway",
            "city": "Norwalk",
            "state": "CA",
            "zip": "90650"
          }
        },
        "sources": [
          {
            "name": "Voting Information Project",
            "official": true
          }
        ]
      }
    }
  ]
}
,

Google Civic Information API ব্যবহার করার জন্য আপনার যা জানা দরকার তা এই নথিতে বর্ণনা করা হয়েছে। আপনি এই সিভিক ইনফো API FAQ দেখতে পারেন যেটিতে API সম্পর্কে কিছু প্রাথমিক তথ্যের পাশাপাশি আমাদের ব্যবহারকারী ফোরাম থেকে প্রায়শই জিজ্ঞাসিত প্রশ্ন রয়েছে। উপরন্তু, আপনি একটি নির্বাচনের সময় ভোটার তথ্য খোঁজার জন্য নীচের উদাহরণ দেখতে পারেন।

Google-এ আপনার আবেদন শনাক্ত করা

প্রতিটি অনুরোধের সাথে একটি API কী অন্তর্ভুক্ত করে আপনার অ্যাপ্লিকেশনটি Google Civic Information API-কে অনুরোধ পাঠালে প্রত্যেকবার নিজেকে সনাক্ত করতে হবে।

একটি API কী অর্জন এবং ব্যবহার করা

একটি API কী অর্জন করতে:

  1. API কনসোলে শংসাপত্র পৃষ্ঠা খুলুন।
  2. এই API দুই ধরনের শংসাপত্র সমর্থন করে। আপনার প্রকল্পের জন্য উপযুক্ত যে কোনো শংসাপত্র তৈরি করুন:
    • OAuth 2.0: যখনই আপনার অ্যাপ্লিকেশন ব্যক্তিগত ব্যবহারকারীর ডেটার অনুরোধ করে, তখন অনুরোধের সাথে একটি OAuth 2.0 টোকেন পাঠাতে হবে। আপনার আবেদন প্রথমে একটি ক্লায়েন্ট আইডি পাঠায় এবং সম্ভবত, একটি টোকেন পাওয়ার জন্য একটি ক্লায়েন্ট গোপনীয়তা পাঠায়। আপনি ওয়েব অ্যাপ্লিকেশন, পরিষেবা অ্যাকাউন্ট বা ইনস্টল করা অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 শংসাপত্র তৈরি করতে পারেন৷

      দ্রষ্টব্য: যেহেতু এই API-তে OAuth 2.0 অনুমোদনের প্রয়োজন এমন কোনও পদ্ধতি নেই, তাই আপনাকে শুধুমাত্র API কীগুলি পেতে হবে, যা নীচে বর্ণিত হয়েছে৷ যাইহোক, যদি আপনার অ্যাপ্লিকেশনটি অন্য API কল করে যার জন্য ব্যবহারকারীর অনুমোদনের প্রয়োজন হয়, তাহলে আপনার এখনও OAuth 2.0 শংসাপত্রের প্রয়োজন।

      আরও তথ্যের জন্য, OAuth 2.0 ডকুমেন্টেশন দেখুন।

    • API কী: একটি অনুরোধ যা একটি OAuth 2.0 টোকেন প্রদান করে না একটি API কী পাঠাতে হবে। কী আপনার প্রকল্পকে শনাক্ত করে এবং API অ্যাক্সেস, কোটা এবং রিপোর্ট প্রদান করে।

      API API কীগুলিতে বিভিন্ন ধরণের সীমাবদ্ধতা সমর্থন করে। যদি আপনার প্রয়োজনীয় API কীটি ইতিমধ্যেই বিদ্যমান না থাকে, তাহলে Create Credentials > API কী ক্লিক করে কনসোলে একটি API কী তৈরি করুন। আপনি কীটিকে উৎপাদনে ব্যবহার করার আগে Restrict key-এ ক্লিক করে সীমাবদ্ধতাগুলির একটি নির্বাচন করে সীমাবদ্ধ করতে পারেন।

আপনার API কীগুলি সুরক্ষিত রাখতে, নিরাপদে API কীগুলি ব্যবহার করার জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করুন৷

আপনার একটি API কী থাকার পরে, আপনার অ্যাপ্লিকেশনটি সমস্ত অনুরোধের URL-এ ক্যোয়ারী প্যারামিটার key= yourAPIKey যোগ করতে পারে।

API কী ইউআরএল-এ এম্বেড করার জন্য নিরাপদ; এটা কোন এনকোডিং প্রয়োজন নেই.

API কী সীমাবদ্ধতা

আপনার API কী ডিফল্টরূপে সীমাবদ্ধ নয়, যেটি অনিরাপদ যদি কেউ হয় এই কীটি পড়তে পারে (উদাহরণস্বরূপ, একটি ব্রাউজারের মধ্যে রাখা হয়) বা কীটি স্থাপন করা ডিভাইসটি অ্যাক্সেস করতে পারে। অননুমোদিত ব্যবহার রোধ করতে আমরা আপনাকে এই API কী-তে একটি সীমাবদ্ধতা রাখার পরামর্শ দিই।

একটি সীমাবদ্ধতা যোগ করতে, API কী তৈরি করা ডায়ালগ বক্সের মধ্যে সীমাবদ্ধ কীটিতে ক্লিক করুন। API কী কনফিগারেশন প্যানেল প্রদর্শিত হবে:

আপনি যে ধরনের সীমাবদ্ধতা নির্বাচন করবেন তা নির্ভর করবে আপনার আবেদনের প্রয়োজনের উপর:

  • API-এর সাথে সরাসরি ইন্টারঅ্যাক্ট করা ওয়েব অ্যাপ্লিকেশনগুলি (অর্থাৎ, কোনো ব্যাকএন্ড বা মিডলওয়্যারের মাধ্যমে নয়) একটি HTTP রেফারার সীমাবদ্ধতা যুক্ত করা উচিত। উল্লেখ্য, তবে, এই ধরনের অ্যাপ্লিকেশনগুলি তাদের API কী সর্বজনীনভাবে প্রকাশ করবে; পরিবর্তে একটি পরিষেবা অ্যাকাউন্ট প্রমাণীকরণ স্কিম ব্যবহার করতে পছন্দ করুন৷
  • ব্যাকএন্ড অ্যাপ্লিকেশনগুলি যেগুলি অন্যথায় পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করতে পারে না (উদাহরণস্বরূপ, এমবেডেড ডিভাইসগুলি যেগুলির ক্লায়েন্ট লাইব্রেরিতে সমর্থিত ভাষা নেই) তাদের বিভিন্ন আইপি ঠিকানাগুলিতে ক্লায়েন্টদের থেকে ব্যবহার থেকে রক্ষা করার জন্য একটি IP ঠিকানা সীমাবদ্ধতা যুক্ত করা উচিত।
  • অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলির একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশান সীমাবদ্ধতা যুক্ত করা উচিত এবং আপনার প্যাকেজের নাম এবং SHA-1 স্বাক্ষর-শংসাপত্র আঙ্গুলের ছাপ যুক্ত করা উচিত৷
  • iOS অ্যাপ্লিকেশানগুলির একটি iOS অ্যাপের সীমাবদ্ধতা যুক্ত করা উচিত এবং এই iOS বান্ডেলগুলিতে API কলগুলিকে সীমাবদ্ধ করতে যেকোন iOS বান্ডেল শনাক্তকারী যোগ করা উচিত৷

পরীক্ষার জন্য, আপনি হয়তো কোনো সীমাবদ্ধতা রাখতে চান না। যাইহোক, এটি বাঞ্ছনীয় যে আপনি হয় এই কীটিতে একটি সীমাবদ্ধতা যুক্ত করুন বা একবার আপনি আপনার অ্যাপ্লিকেশনটি উত্পাদনে স্থাপন করার পরে এটি মুছুন।

ইলেকশনকোয়েরি উদাহরণ

এখানে একটি উদাহরণ (এপিআই সংস্করণ 'v2' ব্যবহার করে) বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ElectionQuery API-কে কল করার, তারপর একটি নির্বাচিত নির্বাচনের তথ্য পেতে ভোটারের নিবন্ধিত ঠিকানা সহ ভোটারইনফোকুয়েরি API ব্যবহার করে৷

বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ইলেকশনকুয়েরি ব্যবহার করুন:

  https://www.googleapis.com/civicinfo/v2/elections?key=<YOUR_API_KEY>
  

নির্বাচন প্রশ্নের উত্তর:

{
 "kind": "civicinfo#electionsqueryresponse",
 "elections": [
  {
   "id": "2000",
   "name": "VIP Test Election",
   "electionDay": "2013-06-06"
  },
  {
   "id": "2124",
   "name": "Rhode Island 2012 Primary Election",
   "electionDay": "2012-09-11"
  },
  {
   "id": "2126",
   "name": "Delaware 2012 Primary Election",
   "electionDay": "2012-09-11"
  }
 ]
}

ভোটার ইনফোকুয়েরি কার্ল ব্যবহার করে

ভিআইপি পরীক্ষার ইলেকশন আইডি 2000 এবং ভোটার (পরীক্ষা) ঠিকানা 340 Main St, Venice, CA 90291-এ ভোটারইনফোকুয়েরি অনুরোধ পাঠাতে curl ব্যবহার করুন। আপনি ভোটারইনফোকুয়েরি প্রতিক্রিয়া উল্লেখ করতে পারেন।

curl "https://www.googleapis.com/civicinfo/v2/voterinfo?key=<YOUR_API_KEY>&address=340%20Main%20St.%20Venice%20CA&electionId=2000"

জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ভোটারইনফোকুয়েরি

এই উদাহরণটি আগের কার্ল উদাহরণের মতো একই ভোটারইনফোকুয়েরি ইস্যু করে, তবে এটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। ভোটার ইনফোকুয়েরি প্রতিক্রিয়া কার্ল উদাহরণ প্রতিক্রিয়ার মতোই।

<!doctype html>
<html>
  <head>
    <script>
      /**
       * Build and execute request to look up voter info for provided address.
       * @param {string} address Address for which to fetch voter info.
       * @param {function(Object)} callback Function which takes the
       *     response object as a parameter.
       */
       function lookup(address, callback) {
       /**
         * Election ID for which to fetch voter info.
         * @type {number}
         */
        var electionId = 2000;
 
        /**
         * Request object for given parameters.
         * @type {gapi.client.HttpRequest}
         */
        var req = gapi.client.request({
            'path' : '/civicinfo/v2/voterinfo',
            'params' : {'electionId' : electionId, 'address' : address}
        });
       req.execute(callback);
      }

      /**
       * Render results in the DOM.
       * @param {Object} response Response object returned by the API.
       * @param {Object} rawResponse Raw response from the API.
       */
      function renderResults(response, rawResponse) {
        var el = document.getElementById('results');
        if (!response || response.error) {
          el.appendChild(document.createTextNode(
              'Error while trying to fetch polling place'));
          return;
        }
        var normalizedAddress = response.normalizedInput.line1 + ' ' +
            response.normalizedInput.city + ', ' +
            response.normalizedInput.state + ' ' +
            response.normalizedInput.zip;
        if (response.pollingLocations.length > 0) {
          var pollingLocation = response.pollingLocations[0].address;
          var pollingAddress = pollingLocation.locationName + ', ' +
              pollingLocation.line1 + ' ' +
              pollingLocation.city + ', ' +
              pollingLocation.state + ' ' +
              pollingLocation.zip;
          var normEl = document.createElement('strong');
          normEl.appendChild(document.createTextNode(
              'Polling place for ' + normalizedAddress + ': '));
          el.appendChild(normEl);
          el.appendChild(document.createTextNode(pollingAddress));
        } else {
          el.appendChild(document.createTextNode(
              'Could not find polling place for ' + normalizedAddress));
        }
      }

      /**
       * Initialize the API client and make a request.
       */
      function load() {
        gapi.client.setApiKey('YOUR API KEY GOES HERE');
        lookup('1263 Pacific Ave. Kansas City KS', renderResults);
      }
    </script>
    <script src="https://apis.google.com/js/client.js?onload=load"></script>
  </head>
  <body>
    <div id="results"></div>
  </body>
</html>

ভোটার ইনফোকোয়েরি প্রতিক্রিয়া

{
  "kind": "civicinfo#voterinforesponse",
  "status": "success",
  "election": {
  "id": "2000",
  "name": "VIP Test Election",
  "electionDay": "2025-06-06",
  "ocdDivisionId": "ocd-division/country:us"
  },
  "normalizedInput": {
    "line1": "340 Main Street",
    "city": "Venice",
    "state": "CA",
    "zip": "90291"
  },
  "pollingLocations": [
    {
      "address": {
        "locationName": "WESTMINSTER AVENUE ELEMENTARY SCHOOL",
        "line1": "1010 ABBOT KINNEY BLVD",
        "city": "VENICE",
        "state": "CA",
        "zip": "90291"
      },
      "pollingHours": "",
      "latitude": 33.9919351,
      "longitude": -118.4722031,
      "startDate": "2024-03-05",
      "endDate": "2024-03-05",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "address": {
        "locationName": "POP UP VOTE CENTER 5",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    }
  ],
  "dropOffLocations": [
    {
      "address": {
        "locationName": "FLEX VOTE CENTER 9",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
  ],
  "contests": [
    {
      "type": "General",
      "ballotTitle": "UNITED STATES REPRESENTATIVE, 36th District",
      "district": {
        "name": "36TH US CONGRESSIONAL",
        "scope": "congressional"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "103",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "ARIANA HAKAMI",
          "party": "Party Preference: Republican"
        },
        {
          "name": "CLAIRE RAGGE ANDERSON",
          "party": "Party Preference: None"
        },
        {
          "name": "MELISSA TOOMIM",
          "party": "Party Preference: Republican"
        },
        {
          "name": "TED W. LIEU",
          "party": "Party Preference: Democratic"
        }
      ]
    },
    {
      "type": "ballot-measure",
      "ballotTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "district": {
        "name": "CITY OF LOS ANGELES",
        "scope": "citywide"
      },
      "ballotPlacement": "116",
      "referendumTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "referendumText": "CITY MOBILITY PLAN STREET IMPROVEMENT MEASURES. INITIATIVE ORDINANCE HLA. Shall an ordinance providing that when the City of Los Angeles makes a qualifying improvement to a City-owned street (e.g., a paving project), the City must also install certain street enhancements described in the City's Mobility Plan network of pedestrian, bicycle, transit, and vehicle routes; and requiring the City to provide publicly accessible information regarding street improvements; be adopted?",
      "referendumPassageThreshold": "MAJORITY OF VOTES CAST",
      "referendumBallotResponses": [
        "YES",
        "NO"
      ],
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "type": "General",
      "ballotTitle": "DISTRICT ATTORNEY",
      "district": {
        "name": "LOS ANGELES COUNTY",
        "scope": "countywide"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "129",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "GEORGE GASCÓN"
        },
        {
          "name": "JONATHAN HATAMI"
        },
        {
          "name": "NATHAN HOCHMAN"
        },
        {
          "name": "DEBRA ARCHULETA"
        },
        {
          "name": "JEFF CHEMERINSKY"
        },
        {
          "name": "ERIC SIDDALL"
        },
        {
          "name": "MARIA RAMIREZ"
        },
        {
          "name": "DAN KAPELOVITZ"
        },
        {
          "name": "LLOYD \"BOBCAT\" MASSON"
        },
        {
          "name": "JOHN MCKINNEY"
        },
        {
          "name": "CRAIG J. MITCHELL"
        },
        {
          "name": "DAVID S. MILTON"
        }
      ]
    }
  ],
  "state": [
    {
      "name": "California",
      "electionAdministrationBody": {
        "name": "Secretary of State",
        "electionInfoUrl": "https://www.sos.ca.gov/elections/",
        "electionRegistrationUrl": "https://registertovote.ca.gov/?t=s",
        "electionRegistrationConfirmationUrl": "https://voterstatus.sos.ca.gov",
        "absenteeVotingInfoUrl": "https://elections.cdn.sos.ca.gov/vote-by-mail/replacement-application.pdf",
        "votingLocationFinderUrl": "https://voterstatus.sos.ca.gov",
        "ballotInfoUrl": "https://www.sos.ca.gov/elections/ballot-status/wheres-my-ballot/",
        "correspondenceAddress": {
          "line1": "1500 11th Street, 5th Floor",
          "city": "Sacramento",
          "state": "California",
          "zip": "95814"
        }
      },
      "local_jurisdiction": {
        "name": "Los Angeles",
        "electionAdministrationBody": {
          "name": "Registrar-Recorder/County Clerk",
          "electionInfoUrl": "http://www.lavote.gov/",
          "electionRegistrationUrl": "http://registertovote.ca.gov/",
          "electionRegistrationConfirmationUrl": "https://lavote.gov/vrstatus/",
          "absenteeVotingInfoUrl": "",
          "ballotInfoUrl": "http://www.lavote.gov/Locator",
          "physicalAddress": {
            "locationName": "Registrar-Recorder/County Clerk",
            "line1": "12400 Imperial Highway",
            "city": "Norwalk",
            "state": "CA",
            "zip": "90650"
          }
        },
        "sources": [
          {
            "name": "Voting Information Project",
            "official": true
          }
        ]
      }
    }
  ]
}
,

Google Civic Information API ব্যবহার করার জন্য আপনার যা জানা দরকার তা এই নথিতে বর্ণনা করা হয়েছে। আপনি এই Civic Info API FAQ দেখতে পারেন যেটিতে API সম্পর্কে কিছু প্রাথমিক তথ্যের পাশাপাশি আমাদের ব্যবহারকারী ফোরাম থেকে প্রায়শই জিজ্ঞাসিত প্রশ্ন রয়েছে। উপরন্তু, আপনি একটি নির্বাচনের সময় ভোটার তথ্য খোঁজার জন্য নীচের উদাহরণ দেখতে পারেন।

Google-এ আপনার আবেদন শনাক্ত করা

প্রতিটি অনুরোধের সাথে একটি API কী অন্তর্ভুক্ত করে আপনার অ্যাপ্লিকেশনটি Google Civic Information API-কে অনুরোধ পাঠালে প্রত্যেকবার নিজেকে সনাক্ত করতে হবে।

একটি API কী অর্জন এবং ব্যবহার করা

একটি API কী অর্জন করতে:

  1. API কনসোলে শংসাপত্র পৃষ্ঠা খুলুন।
  2. এই API দুই ধরনের শংসাপত্র সমর্থন করে। আপনার প্রকল্পের জন্য উপযুক্ত যে কোনো শংসাপত্র তৈরি করুন:
    • OAuth 2.0: যখনই আপনার অ্যাপ্লিকেশন ব্যক্তিগত ব্যবহারকারীর ডেটার অনুরোধ করে, তখন অনুরোধের সাথে একটি OAuth 2.0 টোকেন পাঠাতে হবে। আপনার আবেদন প্রথমে একটি ক্লায়েন্ট আইডি পাঠায় এবং সম্ভবত, একটি টোকেন পাওয়ার জন্য একটি ক্লায়েন্ট গোপনীয়তা পাঠায়। আপনি ওয়েব অ্যাপ্লিকেশন, পরিষেবা অ্যাকাউন্ট বা ইনস্টল করা অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 শংসাপত্র তৈরি করতে পারেন৷

      দ্রষ্টব্য: যেহেতু এই API-তে OAuth 2.0 অনুমোদনের প্রয়োজন এমন কোনও পদ্ধতি নেই, তাই আপনাকে শুধুমাত্র API কীগুলি পেতে হবে, যা নীচে বর্ণিত হয়েছে৷ যাইহোক, যদি আপনার অ্যাপ্লিকেশনটি অন্য API কল করে যার জন্য ব্যবহারকারীর অনুমোদনের প্রয়োজন হয়, তাহলে আপনার এখনও OAuth 2.0 শংসাপত্রের প্রয়োজন।

      আরও তথ্যের জন্য, OAuth 2.0 ডকুমেন্টেশন দেখুন।

    • API কী: একটি অনুরোধ যা একটি OAuth 2.0 টোকেন প্রদান করে না একটি API কী পাঠাতে হবে। কী আপনার প্রকল্পকে শনাক্ত করে এবং API অ্যাক্সেস, কোটা এবং রিপোর্ট প্রদান করে।

      API API কীগুলিতে বিভিন্ন ধরণের সীমাবদ্ধতা সমর্থন করে। যদি আপনার প্রয়োজনীয় API কীটি ইতিমধ্যেই বিদ্যমান না থাকে, তাহলে Create Credentials > API কী ক্লিক করে কনসোলে একটি API কী তৈরি করুন। আপনি কীটিকে উৎপাদনে ব্যবহার করার আগে Restrict key-এ ক্লিক করে সীমাবদ্ধতাগুলির একটি নির্বাচন করে সীমাবদ্ধ করতে পারেন।

আপনার API কীগুলি সুরক্ষিত রাখতে, নিরাপদে API কীগুলি ব্যবহার করার জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করুন৷

আপনার একটি API কী থাকার পরে, আপনার অ্যাপ্লিকেশনটি সমস্ত অনুরোধের URL-এ ক্যোয়ারী প্যারামিটার key= yourAPIKey যোগ করতে পারে।

API কী ইউআরএল-এ এম্বেড করার জন্য নিরাপদ; এটা কোন এনকোডিং প্রয়োজন নেই.

API কী সীমাবদ্ধতা

আপনার API কী ডিফল্টরূপে সীমাবদ্ধ নয়, যেটি অনিরাপদ যদি কেউ হয় এই কীটি পড়তে পারে (উদাহরণস্বরূপ, একটি ব্রাউজারের মধ্যে রাখা হয়) বা কীটি স্থাপন করা ডিভাইসটি অ্যাক্সেস করতে পারে। অননুমোদিত ব্যবহার রোধ করতে আমরা আপনাকে এই API কী-তে একটি সীমাবদ্ধতা রাখার পরামর্শ দিই।

একটি সীমাবদ্ধতা যোগ করতে, API কী তৈরি করা ডায়ালগ বক্সের মধ্যে সীমাবদ্ধ কীটিতে ক্লিক করুন। API কী কনফিগারেশন প্যানেল প্রদর্শিত হবে:

আপনি যে ধরনের সীমাবদ্ধতা নির্বাচন করবেন তা নির্ভর করবে আপনার আবেদনের প্রয়োজনের উপর:

  • API-এর সাথে সরাসরি ইন্টারঅ্যাক্ট করা ওয়েব অ্যাপ্লিকেশনগুলি (অর্থাৎ, কোনো ব্যাকএন্ড বা মিডলওয়্যারের মাধ্যমে নয়) একটি HTTP রেফারার সীমাবদ্ধতা যুক্ত করা উচিত। উল্লেখ্য, তবে, এই ধরনের অ্যাপ্লিকেশনগুলি তাদের API কী সর্বজনীনভাবে প্রকাশ করবে; পরিবর্তে একটি পরিষেবা অ্যাকাউন্ট প্রমাণীকরণ স্কিম ব্যবহার করতে পছন্দ করুন৷
  • ব্যাকএন্ড অ্যাপ্লিকেশনগুলি যেগুলি অন্যথায় পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করতে পারে না (উদাহরণস্বরূপ, এমবেডেড ডিভাইসগুলি যেগুলির ক্লায়েন্ট লাইব্রেরিতে সমর্থিত ভাষা নেই) তাদের বিভিন্ন আইপি ঠিকানাগুলিতে ক্লায়েন্টদের থেকে ব্যবহার থেকে রক্ষা করার জন্য একটি IP ঠিকানা সীমাবদ্ধতা যুক্ত করা উচিত।
  • অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলির একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশান সীমাবদ্ধতা যুক্ত করা উচিত এবং আপনার প্যাকেজের নাম এবং SHA-1 স্বাক্ষর-শংসাপত্র আঙ্গুলের ছাপ যুক্ত করা উচিত৷
  • iOS অ্যাপ্লিকেশানগুলির একটি iOS অ্যাপের সীমাবদ্ধতা যুক্ত করা উচিত এবং এই iOS বান্ডেলগুলিতে API কলগুলিকে সীমাবদ্ধ করতে যেকোন iOS বান্ডেল শনাক্তকারী যোগ করা উচিত৷

পরীক্ষার জন্য, আপনি হয়তো কোনো সীমাবদ্ধতা রাখতে চান না। যাইহোক, এটি বাঞ্ছনীয় যে আপনি হয় এই কীটিতে একটি সীমাবদ্ধতা যুক্ত করুন বা একবার আপনি আপনার অ্যাপ্লিকেশনটি উত্পাদনে স্থাপন করার পরে এটি মুছুন।

ইলেকশনকোয়েরি উদাহরণ

এখানে একটি উদাহরণ (এপিআই সংস্করণ 'v2' ব্যবহার করে) বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ElectionQuery API-কে কল করার, তারপর একটি নির্বাচিত নির্বাচনের তথ্য পেতে ভোটারের নিবন্ধিত ঠিকানা সহ ভোটারইনফোকুয়েরি API ব্যবহার করে৷

বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ইলেকশনকুয়েরি ব্যবহার করুন:

  https://www.googleapis.com/civicinfo/v2/elections?key=<YOUR_API_KEY>
  

নির্বাচন প্রশ্নের উত্তর:

{
 "kind": "civicinfo#electionsqueryresponse",
 "elections": [
  {
   "id": "2000",
   "name": "VIP Test Election",
   "electionDay": "2013-06-06"
  },
  {
   "id": "2124",
   "name": "Rhode Island 2012 Primary Election",
   "electionDay": "2012-09-11"
  },
  {
   "id": "2126",
   "name": "Delaware 2012 Primary Election",
   "electionDay": "2012-09-11"
  }
 ]
}

ভোটার ইনফোকুয়েরি কার্ল ব্যবহার করে

ভিআইপি পরীক্ষার ইলেকশন আইডি 2000 এবং ভোটার (পরীক্ষা) ঠিকানা 340 Main St, Venice, CA 90291-এ ভোটারইনফোকুয়েরি অনুরোধ পাঠাতে curl ব্যবহার করুন। আপনি ভোটারইনফোকুয়েরি প্রতিক্রিয়া উল্লেখ করতে পারেন।

curl "https://www.googleapis.com/civicinfo/v2/voterinfo?key=<YOUR_API_KEY>&address=340%20Main%20St.%20Venice%20CA&electionId=2000"

জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ভোটারইনফোকুয়েরি

এই উদাহরণটি আগের কার্ল উদাহরণের মতো একই ভোটারইনফোকুয়েরি ইস্যু করে, তবে এটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। ভোটার ইনফোকুয়েরি প্রতিক্রিয়া কার্ল উদাহরণ প্রতিক্রিয়ার মতোই।

<!doctype html>
<html>
  <head>
    <script>
      /**
       * Build and execute request to look up voter info for provided address.
       * @param {string} address Address for which to fetch voter info.
       * @param {function(Object)} callback Function which takes the
       *     response object as a parameter.
       */
       function lookup(address, callback) {
       /**
         * Election ID for which to fetch voter info.
         * @type {number}
         */
        var electionId = 2000;
 
        /**
         * Request object for given parameters.
         * @type {gapi.client.HttpRequest}
         */
        var req = gapi.client.request({
            'path' : '/civicinfo/v2/voterinfo',
            'params' : {'electionId' : electionId, 'address' : address}
        });
       req.execute(callback);
      }

      /**
       * Render results in the DOM.
       * @param {Object} response Response object returned by the API.
       * @param {Object} rawResponse Raw response from the API.
       */
      function renderResults(response, rawResponse) {
        var el = document.getElementById('results');
        if (!response || response.error) {
          el.appendChild(document.createTextNode(
              'Error while trying to fetch polling place'));
          return;
        }
        var normalizedAddress = response.normalizedInput.line1 + ' ' +
            response.normalizedInput.city + ', ' +
            response.normalizedInput.state + ' ' +
            response.normalizedInput.zip;
        if (response.pollingLocations.length > 0) {
          var pollingLocation = response.pollingLocations[0].address;
          var pollingAddress = pollingLocation.locationName + ', ' +
              pollingLocation.line1 + ' ' +
              pollingLocation.city + ', ' +
              pollingLocation.state + ' ' +
              pollingLocation.zip;
          var normEl = document.createElement('strong');
          normEl.appendChild(document.createTextNode(
              'Polling place for ' + normalizedAddress + ': '));
          el.appendChild(normEl);
          el.appendChild(document.createTextNode(pollingAddress));
        } else {
          el.appendChild(document.createTextNode(
              'Could not find polling place for ' + normalizedAddress));
        }
      }

      /**
       * Initialize the API client and make a request.
       */
      function load() {
        gapi.client.setApiKey('YOUR API KEY GOES HERE');
        lookup('1263 Pacific Ave. Kansas City KS', renderResults);
      }
    </script>
    <script src="https://apis.google.com/js/client.js?onload=load"></script>
  </head>
  <body>
    <div id="results"></div>
  </body>
</html>

ভোটার ইনফোকোয়েরি প্রতিক্রিয়া

{
  "kind": "civicinfo#voterinforesponse",
  "status": "success",
  "election": {
  "id": "2000",
  "name": "VIP Test Election",
  "electionDay": "2025-06-06",
  "ocdDivisionId": "ocd-division/country:us"
  },
  "normalizedInput": {
    "line1": "340 Main Street",
    "city": "Venice",
    "state": "CA",
    "zip": "90291"
  },
  "pollingLocations": [
    {
      "address": {
        "locationName": "WESTMINSTER AVENUE ELEMENTARY SCHOOL",
        "line1": "1010 ABBOT KINNEY BLVD",
        "city": "VENICE",
        "state": "CA",
        "zip": "90291"
      },
      "pollingHours": "",
      "latitude": 33.9919351,
      "longitude": -118.4722031,
      "startDate": "2024-03-05",
      "endDate": "2024-03-05",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "address": {
        "locationName": "POP UP VOTE CENTER 5",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    }
  ],
  "dropOffLocations": [
    {
      "address": {
        "locationName": "FLEX VOTE CENTER 9",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
  ],
  "contests": [
    {
      "type": "General",
      "ballotTitle": "UNITED STATES REPRESENTATIVE, 36th District",
      "district": {
        "name": "36TH US CONGRESSIONAL",
        "scope": "congressional"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "103",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "ARIANA HAKAMI",
          "party": "Party Preference: Republican"
        },
        {
          "name": "CLAIRE RAGGE ANDERSON",
          "party": "Party Preference: None"
        },
        {
          "name": "MELISSA TOOMIM",
          "party": "Party Preference: Republican"
        },
        {
          "name": "TED W. LIEU",
          "party": "Party Preference: Democratic"
        }
      ]
    },
    {
      "type": "ballot-measure",
      "ballotTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "district": {
        "name": "CITY OF LOS ANGELES",
        "scope": "citywide"
      },
      "ballotPlacement": "116",
      "referendumTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "referendumText": "CITY MOBILITY PLAN STREET IMPROVEMENT MEASURES. INITIATIVE ORDINANCE HLA. Shall an ordinance providing that when the City of Los Angeles makes a qualifying improvement to a City-owned street (e.g., a paving project), the City must also install certain street enhancements described in the City's Mobility Plan network of pedestrian, bicycle, transit, and vehicle routes; and requiring the City to provide publicly accessible information regarding street improvements; be adopted?",
      "referendumPassageThreshold": "MAJORITY OF VOTES CAST",
      "referendumBallotResponses": [
        "YES",
        "NO"
      ],
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "type": "General",
      "ballotTitle": "DISTRICT ATTORNEY",
      "district": {
        "name": "LOS ANGELES COUNTY",
        "scope": "countywide"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "129",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "GEORGE GASCÓN"
        },
        {
          "name": "JONATHAN HATAMI"
        },
        {
          "name": "NATHAN HOCHMAN"
        },
        {
          "name": "DEBRA ARCHULETA"
        },
        {
          "name": "JEFF CHEMERINSKY"
        },
        {
          "name": "ERIC SIDDALL"
        },
        {
          "name": "MARIA RAMIREZ"
        },
        {
          "name": "DAN KAPELOVITZ"
        },
        {
          "name": "LLOYD \"BOBCAT\" MASSON"
        },
        {
          "name": "JOHN MCKINNEY"
        },
        {
          "name": "CRAIG J. MITCHELL"
        },
        {
          "name": "DAVID S. MILTON"
        }
      ]
    }
  ],
  "state": [
    {
      "name": "California",
      "electionAdministrationBody": {
        "name": "Secretary of State",
        "electionInfoUrl": "https://www.sos.ca.gov/elections/",
        "electionRegistrationUrl": "https://registertovote.ca.gov/?t=s",
        "electionRegistrationConfirmationUrl": "https://voterstatus.sos.ca.gov",
        "absenteeVotingInfoUrl": "https://elections.cdn.sos.ca.gov/vote-by-mail/replacement-application.pdf",
        "votingLocationFinderUrl": "https://voterstatus.sos.ca.gov",
        "ballotInfoUrl": "https://www.sos.ca.gov/elections/ballot-status/wheres-my-ballot/",
        "correspondenceAddress": {
          "line1": "1500 11th Street, 5th Floor",
          "city": "Sacramento",
          "state": "California",
          "zip": "95814"
        }
      },
      "local_jurisdiction": {
        "name": "Los Angeles",
        "electionAdministrationBody": {
          "name": "Registrar-Recorder/County Clerk",
          "electionInfoUrl": "http://www.lavote.gov/",
          "electionRegistrationUrl": "http://registertovote.ca.gov/",
          "electionRegistrationConfirmationUrl": "https://lavote.gov/vrstatus/",
          "absenteeVotingInfoUrl": "",
          "ballotInfoUrl": "http://www.lavote.gov/Locator",
          "physicalAddress": {
            "locationName": "Registrar-Recorder/County Clerk",
            "line1": "12400 Imperial Highway",
            "city": "Norwalk",
            "state": "CA",
            "zip": "90650"
          }
        },
        "sources": [
          {
            "name": "Voting Information Project",
            "official": true
          }
        ]
      }
    }
  ]
}
,

Google Civic Information API ব্যবহার করার জন্য আপনার যা জানা দরকার তা এই নথিতে বর্ণনা করা হয়েছে। আপনি এই সিভিক ইনফো API FAQ দেখতে পারেন যেটিতে API সম্পর্কে কিছু প্রাথমিক তথ্যের পাশাপাশি আমাদের ব্যবহারকারী ফোরাম থেকে প্রায়শই জিজ্ঞাসিত প্রশ্ন রয়েছে। উপরন্তু, আপনি একটি নির্বাচনের সময় ভোটার তথ্য খোঁজার জন্য নীচের উদাহরণ দেখতে পারেন।

Google-এ আপনার আবেদন শনাক্ত করা

প্রতিটি অনুরোধের সাথে একটি API কী অন্তর্ভুক্ত করে আপনার অ্যাপ্লিকেশনটি Google Civic Information API-কে অনুরোধ পাঠালে প্রত্যেকবার নিজেকে সনাক্ত করতে হবে।

একটি API কী অর্জন এবং ব্যবহার করা

একটি API কী অর্জন করতে:

  1. API কনসোলে শংসাপত্র পৃষ্ঠা খুলুন।
  2. এই API দুই ধরনের শংসাপত্র সমর্থন করে। আপনার প্রকল্পের জন্য উপযুক্ত যে কোনো শংসাপত্র তৈরি করুন:
    • OAuth 2.0: যখনই আপনার অ্যাপ্লিকেশন ব্যক্তিগত ব্যবহারকারীর ডেটার অনুরোধ করে, তখন অনুরোধের সাথে একটি OAuth 2.0 টোকেন পাঠাতে হবে। আপনার আবেদন প্রথমে একটি ক্লায়েন্ট আইডি পাঠায় এবং সম্ভবত, একটি টোকেন পাওয়ার জন্য একটি ক্লায়েন্ট গোপনীয়তা পাঠায়। আপনি ওয়েব অ্যাপ্লিকেশন, পরিষেবা অ্যাকাউন্ট বা ইনস্টল করা অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 শংসাপত্র তৈরি করতে পারেন৷

      দ্রষ্টব্য: যেহেতু এই API-তে OAuth 2.0 অনুমোদনের প্রয়োজন এমন কোনও পদ্ধতি নেই, তাই আপনাকে শুধুমাত্র API কীগুলি পেতে হবে, যা নীচে বর্ণিত হয়েছে৷ যাইহোক, যদি আপনার অ্যাপ্লিকেশনটি অন্য API কল করে যার জন্য ব্যবহারকারীর অনুমোদনের প্রয়োজন হয়, তাহলে আপনার এখনও OAuth 2.0 শংসাপত্রের প্রয়োজন।

      আরও তথ্যের জন্য, OAuth 2.0 ডকুমেন্টেশন দেখুন।

    • API কী: একটি অনুরোধ যা একটি OAuth 2.0 টোকেন প্রদান করে না একটি API কী পাঠাতে হবে। কী আপনার প্রকল্পকে শনাক্ত করে এবং API অ্যাক্সেস, কোটা এবং রিপোর্ট প্রদান করে।

      API API কীগুলিতে বিভিন্ন ধরণের সীমাবদ্ধতা সমর্থন করে। যদি আপনার প্রয়োজনীয় API কীটি ইতিমধ্যেই বিদ্যমান না থাকে, তাহলে Create Credentials > API কী ক্লিক করে কনসোলে একটি API কী তৈরি করুন। আপনি কীটিকে উৎপাদনে ব্যবহার করার আগে Restrict key-এ ক্লিক করে সীমাবদ্ধতাগুলির একটি নির্বাচন করে সীমাবদ্ধ করতে পারেন।

আপনার API কীগুলি সুরক্ষিত রাখতে, নিরাপদে API কীগুলি ব্যবহার করার জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করুন৷

আপনার একটি API কী থাকার পরে, আপনার অ্যাপ্লিকেশনটি সমস্ত অনুরোধের URL-এ ক্যোয়ারী প্যারামিটার key= yourAPIKey যোগ করতে পারে।

API কী ইউআরএল-এ এম্বেড করার জন্য নিরাপদ; এটা কোন এনকোডিং প্রয়োজন নেই.

API কী সীমাবদ্ধতা

আপনার API কী ডিফল্টরূপে সীমাবদ্ধ নয়, যেটি অনিরাপদ যদি কেউ হয় এই কীটি পড়তে পারে (উদাহরণস্বরূপ, একটি ব্রাউজারের মধ্যে রাখা হয়) বা কীটি স্থাপন করা ডিভাইসটি অ্যাক্সেস করতে পারে। অননুমোদিত ব্যবহার রোধ করতে আমরা আপনাকে এই API কী-তে একটি সীমাবদ্ধতা রাখার পরামর্শ দিই।

একটি সীমাবদ্ধতা যোগ করতে, API কী তৈরি করা ডায়ালগ বক্সের মধ্যে সীমাবদ্ধ কীটিতে ক্লিক করুন। API কী কনফিগারেশন প্যানেল প্রদর্শিত হবে:

আপনি যে ধরনের সীমাবদ্ধতা নির্বাচন করবেন তা নির্ভর করবে আপনার আবেদনের প্রয়োজনের উপর:

  • API-এর সাথে সরাসরি ইন্টারঅ্যাক্ট করা ওয়েব অ্যাপ্লিকেশনগুলি (অর্থাৎ, কোনো ব্যাকএন্ড বা মিডলওয়্যারের মাধ্যমে নয়) একটি HTTP রেফারার সীমাবদ্ধতা যুক্ত করা উচিত। উল্লেখ্য, তবে, এই ধরনের অ্যাপ্লিকেশনগুলি তাদের API কী সর্বজনীনভাবে প্রকাশ করবে; পরিবর্তে একটি পরিষেবা অ্যাকাউন্ট প্রমাণীকরণ স্কিম ব্যবহার করতে পছন্দ করুন৷
  • ব্যাকএন্ড অ্যাপ্লিকেশনগুলি যেগুলি অন্যথায় পরিষেবা অ্যাকাউন্টগুলিকে সমর্থন করতে পারে না (উদাহরণস্বরূপ, এমবেডেড ডিভাইসগুলি যেগুলির ক্লায়েন্ট লাইব্রেরিতে সমর্থিত ভাষা নেই) তাদের বিভিন্ন আইপি ঠিকানাগুলিতে ক্লায়েন্টদের থেকে ব্যবহার থেকে রক্ষা করার জন্য একটি IP ঠিকানা সীমাবদ্ধতা যুক্ত করা উচিত।
  • অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলির একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশান সীমাবদ্ধতা যুক্ত করা উচিত এবং আপনার প্যাকেজের নাম এবং SHA-1 স্বাক্ষর-শংসাপত্র আঙ্গুলের ছাপ যুক্ত করা উচিত৷
  • iOS অ্যাপ্লিকেশানগুলির একটি iOS অ্যাপের সীমাবদ্ধতা যুক্ত করা উচিত এবং এই iOS বান্ডেলগুলিতে API কলগুলিকে সীমাবদ্ধ করতে যেকোন iOS বান্ডেল শনাক্তকারী যোগ করা উচিত৷

পরীক্ষার জন্য, আপনি হয়তো কোনো সীমাবদ্ধতা রাখতে চান না। যাইহোক, এটি বাঞ্ছনীয় যে আপনি হয় এই কীটিতে একটি সীমাবদ্ধতা যুক্ত করুন বা একবার আপনি আপনার অ্যাপ্লিকেশনটি উত্পাদনে স্থাপন করার পরে এটি মুছুন।

ইলেকশনকোয়েরি উদাহরণ

এখানে একটি উদাহরণ (এপিআই সংস্করণ 'v2' ব্যবহার করে) বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ElectionQuery API-কে কল করার, তারপর একটি নির্বাচিত নির্বাচনের তথ্য পেতে ভোটারের নিবন্ধিত ঠিকানা সহ ভোটারইনফোকুয়েরি API ব্যবহার করে৷

বৈধ নির্বাচনী আইডিগুলির একটি তালিকা পেতে ইলেকশনকুয়েরি ব্যবহার করুন:

  https://www.googleapis.com/civicinfo/v2/elections?key=<YOUR_API_KEY>
  

নির্বাচন প্রশ্নের উত্তর:

{
 "kind": "civicinfo#electionsqueryresponse",
 "elections": [
  {
   "id": "2000",
   "name": "VIP Test Election",
   "electionDay": "2013-06-06"
  },
  {
   "id": "2124",
   "name": "Rhode Island 2012 Primary Election",
   "electionDay": "2012-09-11"
  },
  {
   "id": "2126",
   "name": "Delaware 2012 Primary Election",
   "electionDay": "2012-09-11"
  }
 ]
}

ভোটার ইনফোকুয়েরি কার্ল ব্যবহার করে

ভিআইপি পরীক্ষার ইলেকশন আইডি 2000 এবং ভোটার (পরীক্ষা) ঠিকানা 340 Main St, Venice, CA 90291-এ ভোটারইনফোকুয়েরি অনুরোধ পাঠাতে curl ব্যবহার করুন। আপনি ভোটারইনফোকুয়েরি প্রতিক্রিয়া উল্লেখ করতে পারেন।

curl "https://www.googleapis.com/civicinfo/v2/voterinfo?key=<YOUR_API_KEY>&address=340%20Main%20St.%20Venice%20CA&electionId=2000"

জাভাস্ক্রিপ্টের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে ভোটারইনফোকুয়েরি

এই উদাহরণটি আগের কার্ল উদাহরণের মতো একই ভোটারইনফোকুয়েরি ইস্যু করে, তবে এটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। ভোটার ইনফোকুয়েরি প্রতিক্রিয়া কার্ল উদাহরণ প্রতিক্রিয়ার মতোই।

<!doctype html>
<html>
  <head>
    <script>
      /**
       * Build and execute request to look up voter info for provided address.
       * @param {string} address Address for which to fetch voter info.
       * @param {function(Object)} callback Function which takes the
       *     response object as a parameter.
       */
       function lookup(address, callback) {
       /**
         * Election ID for which to fetch voter info.
         * @type {number}
         */
        var electionId = 2000;
 
        /**
         * Request object for given parameters.
         * @type {gapi.client.HttpRequest}
         */
        var req = gapi.client.request({
            'path' : '/civicinfo/v2/voterinfo',
            'params' : {'electionId' : electionId, 'address' : address}
        });
       req.execute(callback);
      }

      /**
       * Render results in the DOM.
       * @param {Object} response Response object returned by the API.
       * @param {Object} rawResponse Raw response from the API.
       */
      function renderResults(response, rawResponse) {
        var el = document.getElementById('results');
        if (!response || response.error) {
          el.appendChild(document.createTextNode(
              'Error while trying to fetch polling place'));
          return;
        }
        var normalizedAddress = response.normalizedInput.line1 + ' ' +
            response.normalizedInput.city + ', ' +
            response.normalizedInput.state + ' ' +
            response.normalizedInput.zip;
        if (response.pollingLocations.length > 0) {
          var pollingLocation = response.pollingLocations[0].address;
          var pollingAddress = pollingLocation.locationName + ', ' +
              pollingLocation.line1 + ' ' +
              pollingLocation.city + ', ' +
              pollingLocation.state + ' ' +
              pollingLocation.zip;
          var normEl = document.createElement('strong');
          normEl.appendChild(document.createTextNode(
              'Polling place for ' + normalizedAddress + ': '));
          el.appendChild(normEl);
          el.appendChild(document.createTextNode(pollingAddress));
        } else {
          el.appendChild(document.createTextNode(
              'Could not find polling place for ' + normalizedAddress));
        }
      }

      /**
       * Initialize the API client and make a request.
       */
      function load() {
        gapi.client.setApiKey('YOUR API KEY GOES HERE');
        lookup('1263 Pacific Ave. Kansas City KS', renderResults);
      }
    </script>
    <script src="https://apis.google.com/js/client.js?onload=load"></script>
  </head>
  <body>
    <div id="results"></div>
  </body>
</html>

ভোটার ইনফোকোয়েরি প্রতিক্রিয়া

{
  "kind": "civicinfo#voterinforesponse",
  "status": "success",
  "election": {
  "id": "2000",
  "name": "VIP Test Election",
  "electionDay": "2025-06-06",
  "ocdDivisionId": "ocd-division/country:us"
  },
  "normalizedInput": {
    "line1": "340 Main Street",
    "city": "Venice",
    "state": "CA",
    "zip": "90291"
  },
  "pollingLocations": [
    {
      "address": {
        "locationName": "WESTMINSTER AVENUE ELEMENTARY SCHOOL",
        "line1": "1010 ABBOT KINNEY BLVD",
        "city": "VENICE",
        "state": "CA",
        "zip": "90291"
      },
      "pollingHours": "",
      "latitude": 33.9919351,
      "longitude": -118.4722031,
      "startDate": "2024-03-05",
      "endDate": "2024-03-05",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "address": {
        "locationName": "POP UP VOTE CENTER 5",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    }
  ],
  "dropOffLocations": [
    {
      "address": {
        "locationName": "FLEX VOTE CENTER 9",
        "line1": "12400 IMPERIAL HWY",
        "city": "NORWALK",
        "state": "CA",
        "zip": "90650"
      },
      "latitude": 33.915989,
      "longitude": -118.0677283,
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
  ],
  "contests": [
    {
      "type": "General",
      "ballotTitle": "UNITED STATES REPRESENTATIVE, 36th District",
      "district": {
        "name": "36TH US CONGRESSIONAL",
        "scope": "congressional"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "103",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "ARIANA HAKAMI",
          "party": "Party Preference: Republican"
        },
        {
          "name": "CLAIRE RAGGE ANDERSON",
          "party": "Party Preference: None"
        },
        {
          "name": "MELISSA TOOMIM",
          "party": "Party Preference: Republican"
        },
        {
          "name": "TED W. LIEU",
          "party": "Party Preference: Democratic"
        }
      ]
    },
    {
      "type": "ballot-measure",
      "ballotTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "district": {
        "name": "CITY OF LOS ANGELES",
        "scope": "citywide"
      },
      "ballotPlacement": "116",
      "referendumTitle": "LOS ANGELES CITY MUNICIPAL ELECTION - MEASURE HLA",
      "referendumText": "CITY MOBILITY PLAN STREET IMPROVEMENT MEASURES. INITIATIVE ORDINANCE HLA. Shall an ordinance providing that when the City of Los Angeles makes a qualifying improvement to a City-owned street (e.g., a paving project), the City must also install certain street enhancements described in the City's Mobility Plan network of pedestrian, bicycle, transit, and vehicle routes; and requiring the City to provide publicly accessible information regarding street improvements; be adopted?",
      "referendumPassageThreshold": "MAJORITY OF VOTES CAST",
      "referendumBallotResponses": [
        "YES",
        "NO"
      ],
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ]
    },
    {
      "type": "General",
      "ballotTitle": "DISTRICT ATTORNEY",
      "district": {
        "name": "LOS ANGELES COUNTY",
        "scope": "countywide"
      },
      "numberElected": "1",
      "numberVotingFor": "1",
      "ballotPlacement": "129",
      "sources": [
        {
          "name": "Voting Information Project",
          "official": true
        }
      ],
      "candidates": [
        {
          "name": "GEORGE GASCÓN"
        },
        {
          "name": "JONATHAN HATAMI"
        },
        {
          "name": "NATHAN HOCHMAN"
        },
        {
          "name": "DEBRA ARCHULETA"
        },
        {
          "name": "JEFF CHEMERINSKY"
        },
        {
          "name": "ERIC SIDDALL"
        },
        {
          "name": "MARIA RAMIREZ"
        },
        {
          "name": "DAN KAPELOVITZ"
        },
        {
          "name": "LLOYD \"BOBCAT\" MASSON"
        },
        {
          "name": "JOHN MCKINNEY"
        },
        {
          "name": "CRAIG J. MITCHELL"
        },
        {
          "name": "DAVID S. MILTON"
        }
      ]
    }
  ],
  "state": [
    {
      "name": "California",
      "electionAdministrationBody": {
        "name": "Secretary of State",
        "electionInfoUrl": "https://www.sos.ca.gov/elections/",
        "electionRegistrationUrl": "https://registertovote.ca.gov/?t=s",
        "electionRegistrationConfirmationUrl": "https://voterstatus.sos.ca.gov",
        "absenteeVotingInfoUrl": "https://elections.cdn.sos.ca.gov/vote-by-mail/replacement-application.pdf",
        "votingLocationFinderUrl": "https://voterstatus.sos.ca.gov",
        "ballotInfoUrl": "https://www.sos.ca.gov/elections/ballot-status/wheres-my-ballot/",
        "correspondenceAddress": {
          "line1": "1500 11th Street, 5th Floor",
          "city": "Sacramento",
          "state": "California",
          "zip": "95814"
        }
      },
      "local_jurisdiction": {
        "name": "Los Angeles",
        "electionAdministrationBody": {
          "name": "Registrar-Recorder/County Clerk",
          "electionInfoUrl": "http://www.lavote.gov/",
          "electionRegistrationUrl": "http://registertovote.ca.gov/",
          "electionRegistrationConfirmationUrl": "https://lavote.gov/vrstatus/",
          "absenteeVotingInfoUrl": "",
          "ballotInfoUrl": "http://www.lavote.gov/Locator",
          "physicalAddress": {
            "locationName": "Registrar-Recorder/County Clerk",
            "line1": "12400 Imperial Highway",
            "city": "Norwalk",
            "state": "CA",
            "zip": "90650"
          }
        },
        "sources": [
          {
            "name": "Voting Information Project",
            "official": true
          }
        ]
      }
    }
  ]
}