### Event Data Structure Example Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/proposals/0004.md A comprehensive JSON example illustrating the structure of an event object. This includes details about the event's agenda, participants, location, associated documents, links, and media recordings. It serves as a reference for how event data should be formatted. ```json { "_id": "ocd-event/146e36d8-d243-11e3-ad6e-f0def1bd7298", "_type": "event", "agenda": [ { "description": "Opening remarks from Speaker Andy Tobin", "order": 1, "subjects": [], "media": [], "notes": [], "related_entities": [ { "id": "ocd-person/072c3c11-cd8c-4544-9ab1-b60486e1832e", "name": "Andy Tobin", "note": "speaker" } ] }, { "description": "Presentation by Director Henry Darwin, Arizona Department of Environmental Quality, regarding the Environmental Protection Agency (EPA) Clean Power Plan proposed rule", "order": 2, "subjects": ["epa", "green energy", "environmental issues"], "media": [], "notes": [], "related_entities": [ { "id": "ocd-person/a284a515-32b2-4338-a38d-1938a4ac9f8f", "name": "Henry Darwin", "note": null }, { "id": "ocd-organization/684139f7-b5a5-4702-9a92-2be976b29eef", "name": "Environmental Protection Agency (EPA)", "note": null } ] }, { "description": "Public Testimony", "order": 3, "subjects": [], "media": [], "notes": [], "related_entities": [] } ], "all_day": false, "description": null, "documents": [ { "note": "Agenda", "url": "http://committee.example.com/agenda.pdf", "media_type": "application/pdf" } ], "end": null, "extras": {}, "links": [ { "name": "EPA Website", "url": "http://www.epa.gov/" } ], "location": { "coordinates": { "latitude": "33.448040", "longitude": "-112.097379" }, "name": "State Legislative Building", "note": null }, "media": [ { "date": "2014-04-12", "links": [ { "media_type": "video/mp4", "url": "http://example.com/video.mp4" }, { "media_type": "video/webm", "url": "http://example.com/video.webm" } ], "name": "Recording of the meeting", "offset": 19, "type": "recording" } ], "name": "Meeting of the Committee on Energy", "participants": [ { "id": "ocd-organization/487b972c-4aa6-40e7-b355-0d73580e06e8", "name": "Committee on Energy", "note": "Host Committee" }, { "id": "ocd-person/072c3c11-cd8c-4544-9ab1-b60486e1832e", "name": "Andy Tobin", "note": "Speaker" } ], "sources": [ { "note": "scraped source", "url": "http://example.com/events" } ], "status": "passed", "type": "event", "start_date": 1408932805.0 } ``` -------------------------------- ### Define legislative sessions data structure Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/tips.md This example shows a common data structure for representing legislative sessions as a list of dictionaries. Each dictionary contains an identifier, name, start date, and end date. This structure is used to manage and retrieve information about legislative periods. ```python legislative_sessions = [{"identifier":"2015", "name":"2015 Regular Session", "start_date": "2015-01-01", "end_date": "2016-12-31"}, {"identifier":"2013", "name":"2013 Regular Session", "start_date": "2013-01-01", "end_date": "2014-12-31"}] ``` -------------------------------- ### Create Basic Pupa Event Scraper Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/events.md This snippet shows the minimum required elements to create a Pupa event scraper. It initializes an Event object with a name, start time, timezone, and location, then yields the event. Dependencies include the 'pupa.scrape' module and 'datetime' and 'pytz' for time handling. ```python from pupa.scrape import Scraper from pupa.scrape import Event import datetime as dt import pytz class SeattleEventScraper(Scraper): def scrape(self): when = dt.datetime(1776,7,4,9,15) tz = pytz.timezone("US/Pacific") #set the timezone for this location when = tz.localize(when) e = Event(name="Hearing", # Event Name start_time=when, # When the event will take place timezone=tz.zone, #the local timezone for the event location_name='Town Hall') # Where the event will be e.add_source("http://example.com") yield e ``` -------------------------------- ### Event Object Schema Example (JSON) Source: https://context7.com/opencivicdata/docs.opencivicdata.org/llms.txt Represents legislative hearings, meetings, and other scheduled activities. Includes details like name, time, location, participants, and agenda items. ```json { "_type": "event", "name": "Transportation Committee Hearing", "description": "Discussion of infrastructure improvements and testimony from citizens.", "classification": "committee-meeting", "start_time": "2015-07-04T09:15:00-07:00", "end_time": "2015-07-04T12:00:00-07:00", "timezone": "US/Pacific", "all_day": false, "status": "confirmed", "location": { "name": "City Hall, Room 201", "url": "http://seattle.gov/cityhall", "coordinates": { "latitude": "47.6062", "longitude": "-122.3321" } }, "participants": [ { "note": "Host committee", "name": "Transportation Committee", "entity_type": "organization", "entity_name": "Transportation Committee", "entity_id": "ocd-organization/trans123" }, { "note": "Chair", "name": "Joe Smith", "entity_type": "person", "entity_name": "Joe Smith", "entity_id": "ocd-person/smith123" } ], "agenda": [ { "description": "Review of Q2 transit ridership data", "classification": "presentation", "order": "1", "subjects": ["Transportation", "Public Transit"], "notes": [], "related_entities": [ { "note": "Presenter", "name": "Transit Authority", "entity_type": "organization", "entity_name": "Metro Transit Authority", "entity_id": "ocd-organization/metro456" } ], "media": [] }, { "description": "Discussion of HB 202 - Infrastructure Bond", "classification": "bill-discussion", "order": "2", "subjects": ["Infrastructure", "Finance"], "notes": [], "related_entities": [ { "note": "Related legislation", "name": "HB 202", "entity_type": "bill", "entity_name": "Infrastructure Bond Act", "entity_id": "ocd-bill/hb202" } ], "media": [] } ], "media": [ { "note": "Video recording", "date": "2015-07-04", "offset": null, "links": [ { "media_type": "video/mp4", "url": "http://example.com/meetings/trans-2015-07-04.mp4", "text": null } ] } ], "links": [ { "note": "Committee homepage", "url": "http://seattle.gov/council/transportation" } ], "documents": [ { "note": "Meeting agenda", "date": "2015-07-01", "media_type": "application/pdf", "url": "http://example.com/agendas/trans-2015-07-04.pdf", "text": null, "links": [] } ], "sources": [ { "url": "http://seattle.gov/calendar/trans-2015-07-04", "note": "Event page" } ], "created_at": "2015-06-28T10:00:00", "updated_at": "2015-07-04T12:30:00" } ``` -------------------------------- ### Example OpenCivic Event JSON Structure Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/run_scraper.md This is a sample JSON object representing an event scraped using OpenCivic standards. It includes details such as the event's name, start time, location, participants, and associated documents or media. ```json { "_id": "efa7ccee-f4d6-11e4-b1eb-843a4bcaaa18", "agenda": [ { "description": "Testimony from concerned citizens", "media": [ { "date": "", "links": [ { "media_type": "application/pdf", "url": "http://example.com/hearing/testimony.pdf" } ], "note": "Written version of testimony" } ], "notes": [], "order": "0", "related_entities": [ { "entity_type": "committee", "name": "Transportation", "note": "participant" }, { "entity_type": "committee", "name": "Environment and Natural Resources", "note": "participant" }, { "entity_type": "person", "name": "Jane Brown", "note": "participant" }, { "entity_type": "person", "name": "Alicia Jones", "note": "participant" }, { "entity_type": "person", "name": "Fred Green", "note": "participant" }, { "entity_type": "bill", "name": "HB101", "note": "consideration" } ], "subjects": [ "Transportation", "Environment" ] } ], "all_day": false, "classification": "event", "description": "", "documents": [], "end_time": null, "extras": {}, "links": [], "location": { "coordinates": null, "name": "unknown", "note": "" }, "media": [ { "date": "", "links": [ { "media_type": "video/mpeg", "url": "http://example.com/hearing/video.mpg" } ], "note": "Video of meeting" }, { "date": "", "links": [ { "media_type": "application/pdf", "url": "http://example.com/hearing/minutes.pdf" } ], "note": "Meeting minutes" } ], "name": "Hearing", "participants": [ { "entity_type": "committee", "name": "Transportation Committee", "note": "participant" }, { "entity_type": "person", "name": "Joe Smith", "note": "Hearing Chair" } ], "sources": [ { "note": "", "url": "http://example.com" } ], "start_time": "1776-07-04T17:08:00+00:00", "status": "confirmed", "timezone": "US/Pacific" } ``` -------------------------------- ### Sample CandidateContest JSON Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/proposals/0020.md An example of a CandidateContest object, illustrating its structure and properties such as 'id', 'name', 'division_id', 'posts', and 'number_elected'. This JSON adheres to the Open Civic Data schema for representing electoral contests involving candidates. ```javascript { "id": "ocd-contest/eff6e5bd-10dc-4930-91a0-06e2298ca15c", "identifiers": [], "name": "STATE SENATE 01", "division_id": "ocd-division/country:us/state:ca/sldu:1", "election_id": "ocd-event/4c25d655-c380-46a4-93d7-28bc0c389629", "created_at": "2017-02-07T07:18:05.438Z", "updated_at": "2017-02-07T07:18:05.442Z", "sources": [ { "note": "Last scraped on 2017-02-08", "url": "http://cal-access.ss.ca.gov/Campaign/Candidates/list.aspx?view=certified&electNav=65" } ], "extras": {}, "posts": [ { "post": "ocd-post/f204b117-24af-42fd-a3fc-c5772533fdf5", "sort_order": 0 } ], "previous_term_unexpired": false, "number_elected": 1, "party_id": null, "runoff_for_contest_id": null } ``` -------------------------------- ### Scrape a Single Person Object Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/people.md This example demonstrates how to scrape a single Person object using the pupa library. It shows the basic structure for creating a Person instance with essential details like name, district, role, and primary organization, and how to add a source URL. ```python from pupa.scrape import Scraper, Person class SeattlePersonScraper(Scraper): def scrape(self): john = Person(name="John Smith", district="Position 1", role="Councilmember", primary_org="legislature") john.add_source(url="http://example.com") yield john ``` -------------------------------- ### Jurisdiction Object Schema Example (JSON) Source: https://context7.com/opencivicdata/docs.opencivicdata.org/llms.txt Defines governing bodies and their legislative sessions, providing context for legislative activities. Includes name, URL, classification, and legislative session details. ```json { "name": "Ohio General Assembly", "url": "http://www.legislature.state.oh.us/", "classification": "legislature", "division_id": "ocd-division/country:us/state:oh", "legislative_sessions": [ { "identifier": "2015-2016", "name": "131st General Assembly", "classification": "primary", "start_date": "2015-01-05", "end_date": "2016-12-31" }, { "identifier": "2013-2014", "name": "130th General Assembly", "classification": "primary", "start_date": "2013-01-07", "end_date": "2014-12-31" } ], "feature_flags": ["subjects", "influenceexplorer"] } ``` -------------------------------- ### Scrape Person, Organization, and Membership Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/people.md This comprehensive example shows how to scrape both Person and Organization objects, and establish a membership relationship between them using pupa. It includes fetching data from a URL, creating Person and Organization instances, adding sources, and using `add_member` to link them. ```python from pupa.scrape import Scraper, Person, Organization class SeattlePersonScraper(Scraper): def scrape(self): doc = self.get("http://www.sunlightfoundation.com") john = Person(name="John Smith", district="Position 1", role="Councilmember", primary_org="legislature") john.add_source(url="http://example.com") yield john comm = Organization(name="Transportation Committee", classification="committee", chamber="legislature") comm.add_source(url="http://example.com/committtees/transit") comm.add_member(john,role="chair") yield comm ``` -------------------------------- ### Initialize a New Scraper Project with pupa init Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/new.md Use the 'pupa init' command to create a skeleton project for a new scraper. This command prompts for essential details like jurisdiction name, division ID, official URL, and the types of scrapers to create (people, events, bills, votes). ```bash $ pupa init seattle jurisdiction name: Seattle City Council division id (look this up in the opencivicdata/ocd-division-ids repository): official URL: http://seattle.gov/council/ create people scraper? [Y/n]: y create events scraper? [y/N]: n create bills scraper? [y/N]: n create votes scraper? [y/N]: n ``` -------------------------------- ### Example Lobbying Disclosure Data Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/proposals/withdrawn/disclosures.md This is an example of a lobbying disclosure record conforming to the defined schema. It includes details such as the disclosure ID, related entities (organizations and events), jurisdiction, dates, and sources. This example helps in understanding the practical application of the schema. ```default { "id": "ocd-disclosure/000225e1-a1e1-43d4-9a73-44ec5955a036", "related_entities": [ { "entity_id": "ocd-organization/c5d53b25-12ab-4c96-b7f9-a813cd86d789", "note": "authority", "entity_name": "Office of Public Record, US Senate", "entity_type": "organization", "classification": "" }, { "entity_id": "ocd-event/a89e59a8-52fd-4ece-a4e3-e02366b57460", "note": "disclosed_event", "entity_name": "Sidley Austin LLP - New Client for Existing Registrant, Vifor Pharma", "entity_type": "event", "classification": "registration" }, { "entity_id": "ocd-organization/885bc9be-f1e0-4166-b01d-5820d449ad7e", "note": "registrant", "entity_name": "Sidley Austin LLP", "entity_type": "organization", "classification": "" } ], "jurisdiction": { "id": "ocd-jurisdiction/country:us/government", "url": "http://usa.gov/", "name": "United States Federal Government" }, "effective_date": "2012-03-01T01:00:00+00:00", "updated_at": "2015-04-03T04:31:59.433", "created_at": "2015-04-03T04:31:59.433", "sources": [ { "note": "LDA Form LD-1", "url": "http://soprweb.senate.gov/index.cfm?event=getFilingDetails&filingID=a3f1bf3c-7fa0-4b08-b703-bef451bb3d27&filingTypeID=1" } ], "submitted_date": "2012-04-03T01:00:00+00:00", "timezone": "America/New_York", "classification": "lobbying" } ``` -------------------------------- ### Run Pupa Scrapers via Command Line Source: https://context7.com/opencivicdata/docs.opencivicdata.org/llms.txt This bash command demonstrates how to use the Pupa command-line interface (CLI) to manage and execute scrapers. The 'pupa' command is used to initialize and run scrapers, providing a convenient way to automate data collection processes. ```bash pupa ``` -------------------------------- ### Division Geometry Centroid Example Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/data/division.md This snippet demonstrates the structure of a centroid object within a division's geometry. It specifies the GeoJSON type and coordinates. ```json { "type": "Point", "coordinates": [-176.59989528409687, 51.88215100813731] } ``` -------------------------------- ### Fetch page and make URLs absolute with lxml Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/tips.md This snippet demonstrates how to fetch a web page's content and convert relative URL paths to absolute paths using the lxml library. It's useful for standardizing links found on a page. Requires the 'lxml' library. ```python import lxml.html def lxmlize(self, url): entry = self.get(url).text page = lxml.html.fromstring(entry) page.make_links_absolute(url) return page ``` -------------------------------- ### Define Jurisdiction and Scrapers in __init__.py Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/new.md The __init__.py file defines the main Jurisdiction subclass for your scraper. It includes essential details like division_id, name, and URL. It also specifies which scrapers (e.g., 'people') are associated with this jurisdiction. ```python from pupa.scrape import Jurisdiction from .people import SeattlePersonScraper class Seattle(Jurisdiction): division_id = "ocd-division/country:us/state:wa/place:seattle" name = "Seattle City Council" url = "http://seattle.gov/council/" scrapers = { "people": SeattlePersonScraper, } def get_organizations(self): org = Organization(name="org_name", classification="legislature") org.add_post( label="position_description", role="position_type") yield org ``` -------------------------------- ### Add Participants and Media to Pupa Event Scraper Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/events.md This snippet extends a basic Pupa event scraper by adding participants (like committees or individuals) and media links (such as videos or documents) to the Event object. It demonstrates the use of `add_participant`, `add_person`, and `add_media_link` methods. The scraper still requires 'pupa.scrape', 'datetime', and 'pytz'. ```python from pupa.scrape import Scraper from pupa.scrape import Event import datetime as dt import pytz class SeattleEventScraper(Scraper): def scrape(self): when = dt.datetime(1776,7,4,9,15) tz = pytz.timezone("US/Pacific") #set the timezone for this location when = tz.localize(when) e = Event(name="Hearing", # Event Name start_time=when, # When the event will take place timezone=tz.zone, #the local timezone for the event location_name='unknown') # Where the event will be e.add_source("http://example.com") #add a committee e.add_participant(name="Transportation Committee", type="committee") #add a person e.add_person(name="Joe Smith", note="Hearing Chair") #add an mpeg video e.add_media_link(note="Video of meeting", url="http://example.com/hearing/video.mpg", media_type="video/mpeg") #add a pdf of meeting minutes e.add_media_link(note="Meeting minutes", url="http://example.com/hearing/minutes.pdf", media_type="application/pdf") yield e ``` -------------------------------- ### XPath 'parent' Axis Example Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/tips.md This XPath expression navigates from an 'img' element with a specific ID up to its parent 'div' with a given class, and then extracts the text content. It demonstrates traversing up the DOM tree. ```xpath //img[@id='foo']/parent::div[@class='bar']/text() ``` -------------------------------- ### Sample Candidacy JSON Object Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/proposals/0020.md This JSON object demonstrates the structure and typical fields of a Candidacy record in Open Civic Data. It includes identifiers, candidate details, status, and timestamps. ```json { "id": "ocd-candidacy/054f0a6e-9c06-4611-8c2c-3e143843c9d8", "person_id": "ocd-person/edfafa56-686d-49ea-80e5-64bc795493f8", "post": "ocd-post/f204b117-24af-42fd-a3fc-c5772533fdf5", "contest_id": "ocd-contest/eff6e5bd-10dc-4930-91a0-06e2298ca15c", "candidate_name": "ROWEN, ROBERT J.", "filed_date": "2016-03-10", "is_incumbent": false, "registration_status": "qualified", "party_id": "ocd-organization/866e7266-0c21-4476-a7a7-dc11d2ae8cd1", "top_ticket_candidacy_id": null, "created_at": "2017-02-08T04:17:30.818Z", "updated_at": "2017-02-08T04:17:30.818Z", "sources": [], "extras": {} } ``` -------------------------------- ### Get current legislative session Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/tips.md This snippet illustrates how to access the current legislative session from a jurisdiction object. It assumes the legislative sessions are stored in a list, with the most recent session at the first index (index 0). ```python self.jurisdiction.legislative_sessions[0] ``` -------------------------------- ### Entity Creation and Sync Protocol Source: https://github.com/opencivicdata/docs.opencivicdata.org/wiki/Entity-ID-Resolution-Service Describes the protocol for creating new entities and syncing them with the central ID service, including ID formats and response codes. ```APIDOC ## POST /entities ### Description This endpoint is used by data producers to create new entities or update existing ones in the central ID service. ### Method POST ### Endpoint `/entities` ### Parameters #### Query Parameters None #### Request Body - **ids** (array of strings) - Required - A list of known IDs for the entity. - **data** (object) - Optional - Additional identifying data for the entity. - **name** (string) - The name of the entity. - **location** (object) - The location of the entity. - **party** (string) - The political party affiliation. - ... (other fields accepted) ### Request Example ```json { "ids": ["ocd:person:us:uuid4-1234"], "data": { "name": "John Smith", "party": "Democratic" } } ``` ### Response #### Success Response (201 Created) - **id** (string) - The canonical ID assigned to the newly created entity. - **all_ids** (array of strings) - A list of all IDs associated with the entity. #### Success Response (200 OK) - **id** (string) - The canonical ID of the updated entity. - **all_ids** (array of strings) - An updated list of all IDs associated with the entity. #### Error Response (403 Forbidden) - **error** (string) - Description of the error, e.g., 'Permission denied to update this entity.' #### Response Example (200 OK) ```json { "id": "ocd:person:us:canonical-uuid", "all_ids": [ "ocd:person:us:uuid4-1234", "ocd:person:us:another-id-for-john" ] } ``` ``` -------------------------------- ### Bill Object Schema Example (JSON) Source: https://context7.com/opencivicdata/docs.opencivicdata.org/llms.txt This JSON object demonstrates the structure of a Bill object, including its core attributes, sponsors, actions, versions, and related documents. It serves as a reference for how legislative data is represented. ```json { "_type": "bill", "organization_id": "ocd-organization/b87d2136-3b43-11e3-9ac3-1231391cd4ec", "organization": "Ohio General Assembly", "session": "2015-2016", "name": "HB 101", "title": "More cookies for children", "chamber": "lower", "type": ["bill"], "subject": ["Nutrition", "Youth"], "summaries": [ { "note": "Official summary", "text": "Provides every child with a cookie on school days." } ], "other_titles": [ { "note": "Short title", "title": "Cookie Act" } ], "other_names": [ { "note": "Companion bill", "name": "SB 55" } ], "related_bills": [ { "session": "2015-2016", "name": "SB 55", "relation_type": "companion" }, { "session": "2013-2014", "name": "HB 89", "relation_type": "prior-session" } ], "sponsors": [ { "_type": "person", "id": "ocd-person/abc123", "name": "Joe Smith", "sponsorship_type": "Primary", "primary": true, "chamber": "lower" }, { "_type": "person", "id": null, "name": "Jane Doe", "sponsorship_type": "Co-sponsor", "primary": false, "chamber": "lower" } ], "actions": [ { "date": "2015-05-05", "type": ["introduction"], "description": "Introduced in House", "actor": "lower", "related_entities": [] }, { "date": "2015-05-12", "type": ["referral-committee"], "description": "Referred to Education Committee", "actor": "lower", "related_entities": [ { "_type": "organization", "name": "Education Committee", "id": "ocd-organization/edu123" } ] }, { "date": "2015-06-01", "type": ["committee-passage-favorable"], "description": "Reported favorably from Education Committee", "actor": "lower", "related_entities": [] } ], "versions": [ { "date": "2015-05-05", "type": "introduced", "name": "Introduced Version", "links": [ { "media_type": "application/pdf", "url": "http://example.com/bills/HB101_intro.pdf", "text": null }, { "media_type": "text/html", "url": "http://example.com/bills/HB101_intro.html", "text": null } ] } ], "documents": [ { "date": "2015-05-20", "type": "fiscal_note", "name": "Fiscal Analysis", "links": [ { "media_type": "application/pdf", "url": "http://example.com/bills/HB101_fiscal.pdf", "text": null } ] } ], "sources": [ { "url": "http://example.com/bills/HB101", "note": "Bill detail page" } ], "created_at": "2015-05-05T10:00:00", "updated_at": "2015-06-01T14:30:00" } ``` -------------------------------- ### Define Legislative Sessions in Python Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/scrape/bills.md This snippet shows how to define legislative sessions in the `__init__.py` file. It requires a list of dictionaries, each containing an identifier, name, start_date, and end_date in 'YYYY-MM-DD' format. ```python legislative_sessions = [{"identifier":"2015", "name":"2015 Regular Session", "start_date": "2015-01-01", "end_date": "2016-12-31"}] ``` -------------------------------- ### Sample Contest Data Structure (JSON) Source: https://github.com/opencivicdata/docs.opencivicdata.org/blob/master/proposals/0020.md This JSON object represents a sample contest within an election, adhering to the Open Civic Data format. It includes a unique ID, optional identifiers, the contest's name, the division it pertains to, a reference to the election ID, and creation/update timestamps. The 'sources' and 'extras' fields provide additional context and flexibility. ```json { "id": "ocd-contest/eff6e5bd-10dc-4930-91a0-06e2298ca15c" "identifiers": [], "name": "STATE SENATE 01", "division_id": "ocd-division/country:us/state:ca/sldu:1", "election_id": "ocd-event/4c25d655-c380-46a4-93d7-28bc0c389629", "created_at": "2017-02-07T07:18:05.438Z", "updated_at": "2017-02-07T07:18:05.442Z", "sources": [ { "note": "Last scraped on 2017-02-08", "url": "http://cal-access.ss.ca.gov/Campaign/Candidates/list.aspx?view=certified&electNav=65" } ], "extras": {} } ```