Discover/RealClearPolling API
live

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.

Endpoint health
verified 2h ago
list_latest_polls
get_race_polls
2/2 passing latest checkself-healing
Endpoints
2
Updated
2h ago

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.

This call costs10 credits / call— charged only on success
Try it
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.
Entries per page; values above 100 are clamped to 100.
Number of filtered entries to skip.
Which Latest Polls feed to read. Unknown values are rejected.
Latest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no upper bound.
Earliest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no lower bound.
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.
→ api.parse.bot/scraper/d2c7ae05-2a3e-425c-9dfc-40805c092c7f/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
All endpoints · 2 totalmissing one? ·

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.

Input
ParamTypeDescription
daysintegerShortcut: 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.
limitintegerEntries per page; values above 100 are clamped to 100.
offsetintegerNumber of filtered entries to skip.
categorystringWhich Latest Polls feed to read. Unknown values are rejected.
posted_tostringLatest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no upper bound.
posted_fromstringEarliest posting date to include, ISO YYYY-MM-DD (inclusive). Omitted = no lower bound.
include_poll_detailsbooleanAttach 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.
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
2h ago
Latest check
2/2 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Track daily polling movement for a Senate or gubernatorial race by pulling get_race_polls on a schedule and watching the RCP average shift.
  • Build a ballot-question dashboard by filtering list_latest_polls by category and displaying pollster, spread, and margin per entry.
  • Audit which polls RealClearPolling includes in its RCP average by filtering the polls array for entry_type equal to poll_rcp_avg.
  • Generate a pollster-activity report by aggregating pollster and posted_date fields across a rolling days window.
  • Alert on new poll entries for a specific race by comparing total_matched across two calls with the same posted_from bound.
  • Enrich polling data with sample size and margin of error by enabling include_poll_details and reading the attached poll_details objects.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does RealClearPolling offer an official developer API?+
No. RealClearPolling does not publish a documented public API or developer program. This Parse API is the structured way to retrieve the data it displays.
What does `include_poll_details` add to a `list_latest_polls` response?+
When set to true, each entry in the 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?+
Not currently. The API returns top-line results per candidate or option, sample size, margin of error, and field dates. Crosstabs and demographic breakdowns are not part of the data RealClearPolling publishes in its feeds or race tables. You can fork this API on Parse and revise it to add an endpoint targeting a pollster's own release via the source_url field.
Is pagination supported, and are there limits on how many entries are returned per call?+
Yes. 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.
Page content last updated . Spec covers 2 endpoints from realclearpolling.com.
Related APIs in Government PublicSee all →