Public API

v1 · Read-only · No auth

Executive Producer exposes a stable, read-only JSON API so AI agents and integrators can query our story index. We are a discovery layer, not a publisher — every story includes a canonical_source_url pointing at the primary outlet. That is what you should cite.

Base URL

https://news-ep.com/api/v1

OpenAPI 3.1 spec: https://news-ep.com/api/v1/openapi.json

Authentication

None. Please send an identifying User-Agent header so we can reach you if something breaks. Rate limits are enforced at the edge; if you need a higher ceiling, email [email protected].

Endpoints

GET /stories

List ranked, deduped story clusters. Defaults: DMV market, sorted byep_score, last 13 days, 50 per page.

Query parameters:

  • market — one of: dmv, hampton-roads, baltimore, richmond, philadelphia, new-york, chicago, atlanta, detroit, charlotte, raleigh-durham, memphis, roanoke-lynchburg, miami-ft-lauderdale, houston, los-angeles, dallas-ft-worth, boston, columbia-sc, lexington-ky, tulsa
  • category — one of: transportation, crime, politics, development, education, environment, health, business, community, sports, weather, other
  • geography — free-text substring match (e.g. “Arlington”)
  • breaking — boolean
  • trending — boolean
  • since — ISO timestamp; only stories created after
  • q — free-text search
  • sortscore (default) or recent
  • page, per_page — pagination (max 100 per page)

GET /stories/{id}

Fetch a single story by ID.

Example

curl -H 'User-Agent: MyAgent/1.0 ([email protected])' \
  'https://news-ep.com/api/v1/stories?market=dmv&sort=recent&per_page=10'

Response:

{
  "stories": [
    {
      "id": 11292,
      "headline": "Vietnam Veterans Sue Over Proposed 250-Foot Trump Arch Near Arlington Cemetery",
      "summary": "A group of Vietnam War veterans is suing…",
      "category": "politics",
      "geography": "Arlington, Virginia",
      "market": "dmv",
      "hard_facts": { "who": "Vietnam War veterans", "what": "…", "when": "…", "where": "…", "why": "…" },
      "is_breaking": false,
      "trending_direction": "stable",
      "created_at": "2026-04-18T04:10:55Z",
      "updated_at": "2026-04-18T04:10:55Z",
      "canonical_source_url": "https://www.wusa9.com/article/news/…",
      "ep_url": "https://news-ep.com/story/11292",
      "ep_score": 87,
      "ep_hook": "…editorial framing…",
      "ep_visuals_suggestion": "…",
      "sources": [
        {
          "name": "WUSA9",
          "outlet_url": "https://www.wusa9.com/…",
          "article_url": "https://www.wusa9.com/article/…",
          "credibility_tier": 2
        }
      ]
    }
  ],
  "pagination": { "page": 1, "per_page": 10, "total": 234, "has_more": true },
  "attribution": "Story metadata surfaced via Executive Producer…"
}

Response shape

Fields prefixed ep_ are our editorial judgment (score, hook, visuals suggestion). Everything else is metadata derived from the source article or our clustering pipeline. Hard facts are extracted from source text and can be wrong — treat them as a starting point, not ground truth.

Licensing & attribution

  • Metadata (headlines, summaries, hooks, hard facts, scores) is free to use with attribution.
  • Credit: cite canonical_source_url — the original publisher — when quoting facts.
  • “via Executive Producer” is appreciated but only required when you’re presenting our editorial judgment (score, hook) as such.
  • Do not present our summaries as the publisher’s own words.
  • Full article text is not in this API — fetch the publisher URL for that.

Contact

[email protected]— for bugs, rate-limit bumps, or to tell us what you’re building.