Methodology

Every position you see on Standpoint comes from a four-step pipeline: seed, resolve, crawl, extract.

1. Seed the candidate registry

We pull active federal candidates from the FEC API for the target 2026 cycle and store them as the canonical registry keyed by FEC candidate ID. State-level candidates (e.g., governors) are added manually since the FEC does not cover state races.

2. Resolve campaign URLs

For each candidate we look up their Ballotpedia profile and extract their official campaign website. When Ballotpedia doesn't list a campaign URL or the page is a placeholder, we mark the candidate as no extractable site rather than guessing.

3. Crawl the campaign site

A headless Playwright crawler captures the root page plus common policy paths (e.g. /issues, /priorities, /platform) and any policy-relevant links discovered on those pages. We snapshot the raw HTML and a SHA-256 content hash so positions remain reproducible even if a campaign edits the page later.

4. Extract positions with Claude

Each snapshot is sent to Anthropic's Claude (Sonnet 4.6) along with our 14-domain policy taxonomy. The model returns structured JSON with the matching domain, a one- or two-sentence summary, a verbatim quote from the page, a stance (support/oppose/mixed/no_position), and a confidence score. We only accept extractions where the quote is genuinely present in the source HTML; positions never extrapolate beyond what the candidate stated themselves.

What you can verify

Every position card links to the exact source URL it was extracted from, with the verbatim quote shown alongside the model's summary. If anything looks wrong, the source is one click away.