RealClearPolling APIrealclearpolling.com ↗
Access RealClearPolling's latest poll feeds and full race poll history. Filter by date, category, and race ID. Returns pollster, results, spreads, and RCP averages.
What is the RealClearPolling API?
The RealClearPolling API exposes 2 endpoints that cover the site's Latest Polls feeds and per-race poll history. list_latest_polls returns one row per poll entry — pollster name, race or question, per-candidate results, spread string, and parsed numeric margin — across filterable date ranges and feed categories. get_race_polls returns the complete poll table for a single race, including the RCP average when the site publishes one, field dates, pollster groups, and every individual poll entry.
curl -X GET 'https://api.parse.bot/scraper/d2c7ae05-2a3e-425c-9dfc-40805c092c7f/list_latest_polls?category=2026&posted_from=2026-09-27&include_poll_details=true' \ -H 'X-API-Key: $PARSE_API_KEY'
Lists poll entries from a RealClearPolling 'Latest Polls' feed, newest posting first. One row per poll entry (a pollster's result for one race): posting date, pollster, race/question, reported results per candidate or option, the site's spread string and the numeric margin parsed from it. The feed the site exposes holds at most its most recent entries (300 for the election feeds, fewer for smaller categories); posted_from/posted_to filter that feed by posting date (inclusive, ISO YYYY-MM-DD, site-local US Central dates) and `days` is a shortcut for 'posted within the last N calendar days including today' that overrides both. Pagination is a true offset over the filtered feed: offset defaults to 0, limit defaults to 50 and is capped at 100; has_more tells whether another page exists. feed_size is the size of the site's feed, total_matched the number of entries after date filtering. When include_poll_details is true the scraper looks up each race on the page (one extra request per 10 distinct races) and attaches the matching poll record with field dates, sample size, margin of error and candidate affiliations, and posted_at is upgraded to the exact posting timestamp; entries whose race record could not be matched get poll_details null and are counted in details_missing. Without it, posted_at is the posting date at midnight site time. margin is null when the spread is a tie; spread_affiliation is null for non-partisan questions such as approval. A valid filter that matches nothing returns an empty entries list.
| Param | Type | Description |
|---|---|---|
| days | integer | Shortcut: include only entries posted within the last N calendar days (site-local), today counting as day 1. When given it overrides posted_from and posted_to. |
| limit | integer | Entries per page; values above 100 are clamped to 100. |
| offset | integer | Number of filtered entries to skip. |
| category | string | Which Latest Polls feed to read. Unknown values are rejected. |
| posted_to | string | Latest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no upper bound. |
| posted_from | string | Earliest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no lower bound. |
| include_poll_details | boolean | Attach poll_details (field dates, sample size, margin of error, affiliations, exact posting timestamp) to every entry on the page at the cost of one extra request per 10 distinct races. |
{
"type": "object",
"fields": {
"limit": "limit applied",
"offset": "offset applied",
"entries": "array of poll entries: posted_date, posted_at (ISO with -05:00 offset), pollster, source_url (pollster's release), race (race or question title), race_id (use with get_race_polls), race_url, results (array of {name, value}), spread (site string e.g. 'Talarico +3'), spread_affiliation (party of the leader or null), margin (numeric points, null on tie), poll_details (only when requested: poll_entry_id, posted_at, poll_dates, poll_start_date, poll_end_date, sample_size, margin_of_error, results with affiliation; or null when unmatched)",
"category": "feed category that was read",
"has_more": "true when offset+limit < total_matched",
"feed_size": "number of entries in the site's feed before filtering",
"posted_to": "effective upper posting-date bound or null",
"posted_from": "effective lower posting-date bound or null",
"total_matched": "number of entries after date filtering",
"details_missing": "number of entries on the page whose race record could not be matched (null when details were not requested)",
"include_poll_details": "whether poll_details were requested"
},
"sample": {
"data": {
"limit": 50,
"offset": 0,
"entries": [
{
"race": "2026 Texas Senate - Paxton vs. Talarico",
"margin": 3,
"spread": "Talarico +3",
"race_id": "8867",
"results": [
{
"name": "Talarico",
"value": 47
},
{
"name": "Paxton",
"value": 44
}
],
"pollster": "Trafalgar Group*",
"race_url": "https://www.realclearpolling.com/polls/senate/general/2026/texas/talarico-vs-paxton",
"posted_at": "2026-10-10T10:49:38-05:00",
"source_url": "https://www.thetrafalgargroup.org/wp-content/uploads/2026/10/TX-Midterms-Report-1009.pdf",
"posted_date": "2026-10-10",
"poll_details": {
"results": [
{
"name": "Talarico",
"value": 47,
"affiliation": "Democrat"
},
{
"name": "Paxton",
"value": 44,
"affiliation": "Republican"
}
],
"posted_at": "2026-10-10T10:49:38-05:00",
"poll_dates": "10/6 - 10/8",
"sample_size": "1086 LV",
"poll_end_date": "2026-10-08",
"poll_entry_id": "158155",
"margin_of_error": 2.9,
"poll_start_date": "2026-10-06"
},
"spread_affiliation": "Democrat"
}
],
"category": "2026",
"has_more": false,
"feed_size": 300,
"posted_to": "2026-10-11",
"posted_from": "2026-10-10",
"total_matched": 2,
"details_missing": 0,
"include_poll_details": true
},
"status": "success"
}
}About the RealClearPolling API
What the API covers
RealClearPolling aggregates polling data across national and state-level races and ballot questions. The API surfaces two feeds: a paginated listing of recently posted polls and a full per-race history. Every entry from list_latest_polls includes posted_date, posted_at (ISO timestamp at -05:00 offset), pollster, race, source_url to the pollster's release, the site's spread string, and the parsed margin as a number. Setting include_poll_details to true attaches an additional poll_details object to each entry covering field dates, sample size, margin of error, affiliations, and an exact posting timestamp.
Filtering and pagination
list_latest_polls accepts several filter parameters. category selects which feed to read (unknown values are rejected). posted_from and posted_to accept ISO YYYY-MM-DD dates for inclusive range filtering; days is a shortcut that includes only entries posted within the last N calendar days, with today counting as day 1. Pagination is controlled by limit (clamped to 100) and offset. The response includes total_matched, feed_size, has_more, and details_missing (the count of entries whose race record could not be matched when include_poll_details is true).
Per-race history
get_race_polls takes a race_id — the numeric string emitted by list_latest_polls — and returns the full poll table for that race. Each poll in the polls array carries poll_entry_id, entry_type (poll_rcp_avg when included in the RCP average, otherwise poll), pollster, pollster_group, source_url, posted_at, and field date information. The rcp_average object, when present, contains poll_dates, per-candidate results with name, affiliation, and value, plus spread_leader and margin. The response also includes state (two-letter code or null for national questions), race_url, poll_count, and last_updated.
The RealClearPolling API is a managed, monitored endpoint for realclearpolling.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when realclearpolling.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official realclearpolling.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track daily polling movement for a Senate or gubernatorial race by pulling
get_race_pollson a schedule and watching the RCP average shift. - Build a ballot-question dashboard by filtering
list_latest_pollsbycategoryand displaying pollster, spread, and margin per entry. - Audit which polls RealClearPolling includes in its RCP average by filtering the
pollsarray forentry_typeequal topoll_rcp_avg. - Generate a pollster-activity report by aggregating
pollsterandposted_datefields across a rollingdayswindow. - Alert on new poll entries for a specific race by comparing
total_matchedacross two calls with the sameposted_frombound. - Enrich polling data with sample size and margin of error by enabling
include_poll_detailsand reading the attachedpoll_detailsobjects.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does RealClearPolling offer an official developer API?+
What does `include_poll_details` add to a `list_latest_polls` response?+
entries array gets a poll_details sub-object containing field dates (the window the poll was conducted), sample size, margin of error, pollster affiliations, and an exact posting timestamp. Entries whose race record cannot be matched are counted in the details_missing field. Without this flag, those fields are not returned.How does the `days` filter interact with `posted_from` and `posted_to`?+
days is a shortcut that sets an implicit lower bound relative to the current site-local date, where today counts as day 1. You can use posted_from and posted_to instead for explicit inclusive date ranges. If you need entries for a specific historical window — say, a primary month — use posted_from and posted_to directly rather than days.Does the API return crosstabs, demographic breakdowns, or raw microdata from individual polls?+
source_url field.Is pagination supported, and are there limits on how many entries are returned per call?+
list_latest_polls supports limit and offset for pagination. The limit value is clamped to a maximum of 100 entries per call. The has_more field in the response indicates whether additional entries remain. Use total_matched and feed_size to understand the filtered and unfiltered pool sizes.