Pressroom API

A deterministic, fully-cited news-intelligence API. Query events, entities, quotes, certified facts, and analysis across a corpus of 200,000+ articles — every answer traceable to its source.

68 paths · 72 operations204,000+ articles177 sourcesNo LLM in the answer path — reproducible
BASE URL
https://api.pressroom.news
QUICK START
export PRESSROOM_KEY="YOUR_API_KEY"

curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/search?q=election&page_size=3"

Quick start

Every request is authenticated with your API key in the X-API-Key header. Base URL: https://api.pressroom.news

Set your key once and make your first call — the panels on the right show the base URL and the request.

🔑 Don't have a key yet? Keys are issued by request during the private beta — see Request access below.
BASE URL
https://api.pressroom.news
GET/v1/search
export PRESSROOM_KEY="YOUR_API_KEY"

curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/search?q=election&page_size=3"

Authentication

Pass your key on every call, either header form:

Unauthenticated requests to data endpoints return 401. Keep your key secret; it is tied to your quota and tier. Two endpoints are open (no key): /v1/health and /v1/version.

AUTHENTICATION HEADERS
X-API-Key: YOUR_API_KEY
# — or —
Authorization: Bearer YOUR_API_KEY

Tiers & rate limits

Each key belongs to a tier with a monthly call quota and a per-minute burst limit. Exceeding either returns 429 with a Retry-After hint.

TierMonthly quotaBurst
free1,00030/min
academic50,00060/min
starter100,000120/min
growth1,000,000300/min
pro5,000,000600/min
enterpriseunlimited1200/min

What you get — features & roadmap

Deterministic, provenance-cited news intelligence over a 200K+ article corpus (India / Bangladesh / UK / Nepal focus, 28 sources, English + Hindi + Bengali + Nepali originals). Every number links back to the articles and text spans it came from. No generative model sits between the corpus and your response.

FeatureWhat it doesStatus
Entity graphCanonical people / organisations / locations — profiles, search, disambiguation, coverage timeseries, co-mention relationships, identity-change historyLive
Quotes as objects385K+ attributed quote spans, searchable, with speaker resolution (people, and institutional speakers — "the RBI said"), full provenance chainLive
Canonical eventsPrecision-gated event registry with per-event narrative timelines and coverage breakdownsLive
Certified depth cardsTyped, certified fact cards (casualty counts, deadlines, legal status…) that pass a published safety gate before they existLive
Intelligence analyses11 POST analyses: narrative momentum, story lifecycle, signal-vs-noise, blind spots, epistemic confidence, story attribution, quote provenance, crisis trajectory…Live
Cited briefs & QADeterministic analyst briefs and retrieval QA — every sentence cited, no LLM hallucination surfaceLive
Geo layerHeatmaps, radius queries, sentiment geography over geocoded locationsLive — coverage expanding
Real-time streamSSE mention stream from a cursorLive
WorkspaceSaved searches (watchlists) and per-key article tagsLive
Embeddable widgetsDrop-in intelligence widgets (quotes, entity cards, narratives, coverage maps, analyses) rendered on your site via domain-locked publishable keys — each fetch meters as one API call on your planLive
Entity enrichment at depthWikidata-grounded org typing, industry, country and multilingual aliases across the long tailRolling out
Self-serve keys & billingSign up, get a key, pay online — today keys are issued by request (below)Planned
Continuous corpus syncCloud replica updated continuously from the extraction pipelinePlanned

What we deliberately do not offer: article body text. Pressroom is not a content-redistribution service — endpoints return metadata, entities, quotes, and analyses, each linking to the publisher's canonical URL. Read the journalism where it was published.

Response format

Every response is JSON. List endpoints wrap results in data with a meta block for pagination; single-object endpoints return data directly.

Paginate with page and page_size query parameters.

RESPONSE ENVELOPE
{
  "data": [ /* … results … */ ],
  "meta": { "total": 9690, "page": 1, "page_size": 3 }
}

Search & discovery

Canonical event registry GET /v1/events

Paginated registry of de-duplicated real-world events, each with domain, type, and coverage counts.

GET/v1/events
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/events?page_size=3"
RESPONSE · 200
{
  "data": [
    {
      "id": 47133,
      "label": "World Cup",
      "wikidata_id": null,
      "event_year": null,
      "event_domain": "sport",
      "event_type": "sports",
      "article_count": 14783,
      "has_timeline": false,
      "beat_count": 0
    },
    {
      "id": 47132,
      "label": "FIFA World Cup 2026",
      "wikidata_id": "Q5020214",
      "event_year": "2026",
      "event_domain": "sport",
      "event_type": "sports",
      "article_count": 2488,
      "has_timeline": false,
      "beat_count": 0
    },
    {
      "id": 47187,
      "label": "World Cups",
      "wikidata_id": null,
      "event_year": null,
      "event_domain": "sport",
      "event_type": "sports",
      "article_count": 1110,
      "has_timeline": false,
      "beat_count": 0
    }
  ],
  "meta": {
    "total": 9690,
  … (4 more lines)

Event profile GET /v1/events/47133

A single canonical event with its metadata and linkage.

GET/v1/events/47133
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/events/47133"
RESPONSE · 200
{
  "data": {
    "id": 47133,
    "kind": "event",
    "name": "World Cup",
    "event_domain": "sport",
    "event_type": "sports",
    "event_year": null,
    "event_date": {
      "start": null,
      "end": null,
      "precision": null
    },
    "identity": {
      "resolved": false,
      "wikidata_id": null
    },
    "description": null,
    "hierarchy": {
      "role": "franchise",
      "parent": null,
      "children": [
        {
          "id": 52491,
          "name": "World Cup 2035",
          "event_year": "2035",
          "event_domain": "sport"
        },
        {
          "id": 49379,
          "name": "2034 World Cup",
          "event_year": "2034",
          "event_domain": "sport"
        },
        {
          "id": 47211,
          "name": "2030 World Cup",
          "event_year": "2030",
  … (307 more lines)

Curated topics GET /v1/topics

The curated topic catalog.

GET/v1/topics
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/topics"
RESPONSE · 200
{
  "data": [
    {
      "slug": "artificial-intelligence",
      "label": "Artificial Intelligence",
      "source": "curated",
      "article_count": 668,
      "keywords": [
        "artificial intelligence",
        "openai",
        "chatgpt",
        "machine learning",
        "large language model",
        "generative ai",
        "neural network"
      ],
      "aliases": [
        "ai",
        "genai",
        "generative ai",
        "machine learning"
      ],
      "sections": [],
      "updated_at": "2026-07-26T09:42:49Z"
    },
    {
      "slug": "climate-change",
      "label": "Climate & Environment",
      "source": "curated",
      "article_count": 2239,
      "keywords": [
        "climate",
        "emission",
        "global warming",
        "renewable",
        "carbon",
        "net zero",
        "monsoon",
  … (249 more lines)

Topic profile GET /v1/topics/artificial-intelligence

A single topic with its profile.

GET/v1/topics/artificial-intelligence
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/topics/artificial-intelligence"
RESPONSE · 200
{
  "data": {
    "slug": "artificial-intelligence",
    "label": "Artificial Intelligence",
    "source": "curated",
    "keywords": [
      "artificial intelligence",
      "openai",
      "chatgpt",
      "machine learning",
      "large language model",
      "generative ai",
      "neural network"
    ],
    "aliases": [
      "ai",
      "genai",
      "generative ai",
      "machine learning"
    ],
    "sections": [],
    "stats": {
      "article_count": 668,
      "first_seen": "2025-07-06T12:11:14Z",
      "last_seen": "2026-07-26T03:53:15Z"
    },
    "top_sources": [
      {
        "source": "Mint",
        "articles": 324
      },
      {
        "source": "Reuters",
        "articles": 83
      },
      {
        "source": "Hindustan Times",
        "articles": 46
  … (32 more lines)

Entities — people, organisations, locations

Entity profile GET /v1/people/174

Canonical profile for a person, organisation, or location (the {kind} is people / organisations / locations).

GET/v1/people/174
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/people/174"
RESPONSE · 200
{
  "data": {
    "id": 174,
    "kind": "people",
    "name": "Narendra Modi",
    "identity": {
      "resolved": true,
      "wikidata_id": "Q1058",
      "lei_code": null,
      "status": "resolved"
    },
    "attributes": {
      "current_title": null,
      "current_employer": null,
      "nationality": null,
      "date_of_birth": null,
      "wikipedia_url": "https://en.wikipedia.org/wiki/Narendra_Modi",
      "twitter_handle": "narendramodi",
      "twitter_url": "https://twitter.com/narendramodi",
      "linkedin_url": "narendramodi",
      "official_bio_url": "https://www.narendramodi.in",
      "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/The_official_portrait_of_Shri_Narendra_Modi%2C_the_Prime_Minister_of_the_Republic_of_India.jpg/330px-The_official_portrait_of_Shri_Narendra_Modi%2C_the_Prime_Minister_of_the_Republic_of_India.jpg",
      "bio_text": "Narendra Damodardas Modi is an Indian politician who has served as the prime minister of India since 26 May 2014. Modi was the chief minister of Gujarat from 2001 to 2014 and is the Member of Parliament (MP) for Varanasi. He is a member of the Bharatiya Janata Party (BJP) and of the Rashtriya Swayamsevak Sangh (RSS), a right-wing Hindutva paramilitary volunteer organisation. He is India's third-longest-serving prime minister, and the longest-serving prime minister outside the Indian National Congress.",
      "bio_source": "wikipedia"
    },
    "aliases": [
      "Modi",
      "Modi ji",
      "Narender Modi",
      "Narendra Damodardas Modi",
      "Narendra Modi",
      "Narendra) Modi",
      "Narendra] Modi",
      "Shri Modi",
      "Shri Narendra Modi",
      "Shri Narendra Modi ji"
    ],
    "stats": {
  … (9 more lines)

Entity relationships GET /v1/people/174/relationships

Top co-mentioned people, organisations, and locations for an entity.

GET/v1/people/174/relationships
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/people/174/relationships"
RESPONSE · 200
{
  "data": {
    "entity_id": 174,
    "kind": "people",
    "source_article_count": 5501,
    "people": [
      {
        "id": 11084,
        "name": "Modi",
        "wikidata_id": null,
        "co_count": 702,
        "first_seen": "2025-11-24T18:30:00Z",
        "last_seen": "2026-07-26T10:40:47Z",
        "salience": 0.1276
      },
      {
        "id": 1,
        "name": "Donald Trump",
        "wikidata_id": "Q22686",
        "co_count": 553,
        "first_seen": "2025-09-10T18:15:00Z",
        "last_seen": "2026-07-25T12:00:00Z",
        "salience": 0.1005
      },
      {
        "id": 622,
        "name": "Amit Shah",
        "wikidata_id": "Q4746875",
        "co_count": 449,
        "first_seen": "2023-06-02T18:30:00Z",
        "last_seen": "2026-07-26T10:40:47Z",
        "salience": 0.0816
      },
      {
        "id": 1268,
        "name": "Rahul Gandhi",
        "wikidata_id": "Q10218",
        "co_count": 416,
  … (520 more lines)

Quotes by a person GET /v1/people/174/quotes

Quotes attributed to a person, with provenance.

GET/v1/people/174/quotes
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/people/174/quotes?page_size=2"
RESPONSE · 200
{
  "data": [
    {
      "quote_id": 377063,
      "text": "Smt. Sonia Gandhi’s mother, Mrs. Paola Maino passed away at her home in Italy on Saturday the 27th August 2022. The funeral took place yesterday,",
      "verb": "tweeted",
      "type": "direct",
      "confidence": 0.85,
      "provenance": {
        "article_id": 174102,
        "headline": "Congress chief Sonia Gandhi's mother passes away",
        "source_id": "the-hindu",
        "source_url": "https://thehindu.com/news/national/congress-chief-sonia-gandhis-mother-passes-away/article65833715.ece",
        "extraction_method": "trafilatura",
        "extracted_at": "2026-07-15T20:02:30Z",
        "date_published_utc": null
      }
    },
    {
      "quote_id": 377062,
      "text": "May her soul rest in peace. In this hour of grief, my thoughts are with the entire family.",
      "verb": "tweeted",
      "type": "direct",
      "confidence": 0.85,
      "provenance": {
        "article_id": 174102,
        "headline": "Congress chief Sonia Gandhi's mother passes away",
        "source_id": "the-hindu",
        "source_url": "https://thehindu.com/news/national/congress-chief-sonia-gandhis-mother-passes-away/article65833715.ece",
        "extraction_method": "trafilatura",
        "extracted_at": "2026-07-15T20:02:30Z",
        "date_published_utc": null
      }
    }
  ],
  "meta": {
    "total": 1758,
    "page": 1,
  … (3 more lines)

Certified depth cards

Depth cards GET /v1/depth-cards

Certified, provenance-cited story-state facts (e.g. casualty / arrest counts) — every card is gated and traceable to its source span.

GET/v1/depth-cards
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/depth-cards?page_size=3"
RESPONSE · 200
{
  "data": [
    {
      "card_id": "cc_arrest_count_ca89a2c654546c73",
      "contract_version": "depth_card_v1",
      "disposition": "PUBLISHED",
      "object_class": "ARREST_COUNT",
      "base_class": "ARREST_COUNT",
      "claim": "people arrested = 11",
      "claimed_value": 11.0,
      "unit": "people",
      "story_unit_id": null,
      "minted_at": "2026-07-25T14:38:07.732862Z",
      "provenance": {
        "article_ids": [
          26091
        ],
        "primary_article_id": 26091,
        "source_name": "myrepublica",
        "publication_date": null,
        "license_path": "P2_PERSON_HEAD",
        "span": "“Chinese security personnel recently arrested 11 Nepali traders.",
        "offsets": {
          "start": 949,
          "end": 951
        },
        "method": "typed_count_factory -> publish_safety_gate -> held_queue(rubric_v3, qwen3:14b local) -> reader_canary",
        "gate": {
          "status": "AUTO_PUBLISH",
          "families": [],
          "reason": null
        },
        "frozen_gate_sha256": "ede56aeb1bc2709caf77596e6489cd41a73fe6140e521ba5afddb7bbf2acbf24",
        "adjudicator": "none",
        "adjudicator_rationale": "publish_safety_gate AUTO_PUBLISH (deterministic; no model call)",
        "verdict_cache_key": null,
        "cert_ref": null,
        "content_hash": "ad2527eb0a086145acda10df8add427dc7a5358c3091fd6bede08e968fc6a923"
  … (85 more lines)

Single depth card GET /v1/depth-cards/cc_arrest_count_ca89a2c654546c73

One certified card by id, with full provenance.

GET/v1/depth-cards/cc_arrest_count_ca89a2c654546c73
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/depth-cards/cc_arrest_count_ca89a2c654546c73"
RESPONSE · 200
{
  "data": {
    "card_id": "cc_arrest_count_ca89a2c654546c73",
    "contract_version": "depth_card_v1",
    "disposition": "PUBLISHED",
    "object_class": "ARREST_COUNT",
    "base_class": "ARREST_COUNT",
    "claim": "people arrested = 11",
    "claimed_value": 11.0,
    "unit": "people",
    "story_unit_id": null,
    "minted_at": "2026-07-25T14:38:07.732862Z",
    "provenance": {
      "article_ids": [
        26091
      ],
      "primary_article_id": 26091,
      "source_name": "myrepublica",
      "publication_date": null,
      "license_path": "P2_PERSON_HEAD",
      "span": "“Chinese security personnel recently arrested 11 Nepali traders.",
      "offsets": {
        "start": 949,
        "end": 951
      },
      "method": "typed_count_factory -> publish_safety_gate -> held_queue(rubric_v3, qwen3:14b local) -> reader_canary",
      "gate": {
        "status": "AUTO_PUBLISH",
        "families": [],
        "reason": null
      },
      "frozen_gate_sha256": "ede56aeb1bc2709caf77596e6489cd41a73fe6140e521ba5afddb7bbf2acbf24",
      "adjudicator": "none",
      "adjudicator_rationale": "publish_safety_gate AUTO_PUBLISH (deterministic; no model call)",
      "verdict_cache_key": null,
      "cert_ref": null,
      "content_hash": "ad2527eb0a086145acda10df8add427dc7a5358c3091fd6bede08e968fc6a923"
    }
  … (2 more lines)

Analysis & briefs (POST)

Narrative momentum POST /v1/analyse/narrative-momentum

Coverage momentum for a query — volume, diversity, geographic and sentiment trend.

POST/v1/analyse/narrative-momentum
curl -X POST -H "X-API-Key: $PRESSROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "election"}' \
  "https://api.pressroom.news/v1/analyse/narrative-momentum"
RESPONSE · 200
{
  "data": {
    "subject": "q:election",
    "window": {
      "from": "2026-04-27",
      "to": "2026-07-26",
      "midpoint": "2026-06-11"
    },
    "total_articles": 1093,
    "recent_half": {
      "volume": 472,
      "sources": 75,
      "countries": 5,
      "sentiment": -0.0067
    },
    "prior_half": {
      "volume": 621,
      "sources": 24,
      "countries": 5,
      "sentiment": 0.0707
    },
    "components": {
      "volume_rate_change": -0.2399,
      "source_diversity_delta": 0.2881,
      "geographic_spread_delta": 0.0,
      "sentiment_delta": -0.0774
    },
    "momentum_score": -0.0701,
    "method": "deterministic; weights v=0.5 div=0.2 geo=0.2 sent=0.1"
  }
}

Cited retrieval QA POST /v1/chat

Deterministic question-answering over the corpus with citations — no LLM, fully reproducible.

POST/v1/chat
curl -X POST -H "X-API-Key: $PRESSROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question": "What has been reported about elections?"}' \
  "https://api.pressroom.news/v1/chat"
RESPONSE · 200
{
  "data": {
    "question": "What has been reported about elections?",
    "answer": "8 relevant article(s) from 5 source(s) address this. Leading coverage: \"As heat wave sweeps across several states in the US, White House has reportedly deleted thousands of web pages about...\" (the-times-of-india, 2026-07-05). See cited passages below.",
    "matched_terms": [
      "has",
      "reported",
      "elections"
    ],
    "passages": [
      {
        "headline": "As heat wave sweeps across several states in the US, White House has reportedly deleted thousands of web pages about...",
        "dek": null,
        "provenance": {
          "article_id": 186888,
          "source_id": "the-times-of-india",
          "source_url": "https://timesofindia.indiatimes.com/technology/tech-news/as-heat-wave-sweeps-across-several-states-in-the-us-white-house-has-reportedly-deleted-thousands-of-web-pages-about-/articleshow/132196710.cms",
          "date_published_utc": "2026-07-05T13:43:00Z"
        }
      },
      {
        "headline": "Paul Hogan has reportedly called Pauline Hanson a ‘pelican’. Please explain?",
        "dek": null,
        "provenance": {
          "article_id": 132390,
          "source_id": "the-guardian",
          "source_url": "https://theguardian.com/australia-news/2026/jun/28/paul-hogan-pauline-hanson-pelican-insult-australian-slang-please-explain",
          "date_published_utc": "2026-06-28T07:41:24Z"
        }
      },
      {
        "headline": "Republicans reportedly weigh stopgap funding plan to avert Government shutdown before midterm elections",
        "dek": "Senator Rick Scott's proposal comes ahead of a planned meeting between President Donald Trump and Senate Republicans, where lawmakers are expected to discuss priorities for the remainder of the year.",
        "provenance": {
          "article_id": 108287,
          "source_id": "mint",
          "source_url": "https://livemint.com/news/us-news/republicans-reportedly-weigh-stopgap-funding-plan-to-avert-government-shutdown-before-midterm-elections-11782317710245.html",
          "date_published_utc": "2026-06-24T16:35:08Z"
  … (91 more lines)

Analyst brief POST /v1/briefs/generate

A deterministic, cited analyst brief for a query or entity.

POST/v1/briefs/generate
curl -X POST -H "X-API-Key: $PRESSROOM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "election"}' \
  "https://api.pressroom.news/v1/briefs/generate"
RESPONSE · 200
{
  "data": {
    "subject": "q:election",
    "window": {
      "from": "2026-04-27",
      "to": "2026-07-26"
    },
    "total_articles": 1093,
    "summary": "1093 articles from 8 sources cover q:election (2026-04-27–2026-07-26). Most-associated people: Donald Trump, Andy Burnham, Keir Starmer; organisations: BJP, Reuters, Labour; locations: United States, India, UK. 5 attributed quote(s) surfaced. Every claim is cited below.",
    "top_entities": {
      "people": [
        {
          "name": "Donald Trump",
          "co_count": 183
        },
        {
          "name": "Andy Burnham",
          "co_count": 76
        },
        {
          "name": "Keir Starmer",
          "co_count": 62
        },
        {
          "name": "Nigel Farage",
          "co_count": 53
        },
        {
          "name": "Joe Biden",
          "co_count": 42
        }
      ],
      "organisations": [
        {
          "name": "BJP",
          "co_count": 211
        },
        {
  … (301 more lines)

Embeddable widgets

Put live Pressroom intelligence on your own pages — attributed quotes, entity cards, active narratives, coverage maps, and analyses — with two lines of HTML. Widgets are a feature of your API plan, not a separate product: every widget data fetch meters as one API request against your monthly quota.

Publishable keys. Embeds use a pk_ publishable key minted from your account. It is safe to expose in page source: it only works on domains you allow-list, only reaches widget-data endpoints, and spends only your own quota. Your secret pr_ key never appears in a browser. Rotate or revoke a pk_ key at any time.

Honest states. A widget over quota or on an unauthorised domain renders a labelled error state — it never silently shows stale or fabricated data. Every widget carries a "Powered by Pressroom" attribution.

Catalogue. GET /v1/widgets lists the available widget ids: narrative_pulse, active_narrative_list, quote_provenance, daily_executive_brief, source_diversity, entity_intelligence_card, regional_news_map, narrative_conflict, coverage_trajectory, narrative_momentum. Widgets without a production-grade data substrate are not offered.

🔑 Publishable keys are issued with your API key during the private beta — include the domains you'll embed on in your access request.
EMBED — TWO LINES
<script async src="https://api.pressroom.news/widget.js"></script>
<div class="pressroom-widget"
     data-widget="quote_provenance"
     data-subject="Reserve Bank of India"
     data-key="pk_YOUR_PUBLISHABLE_KEY"></div>
GET/v1/widgets/{id}/data
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/widgets/entity_intelligence_card/data?subject=Adani"
RESPONSE (TRIMMED)
{
  "data": { "profile": { "name": "Gautam Adani", "…": "…" } },
  "meta": {
    "widget": "entity_intelligence_card",
    "attribution_required": true,
    "window_days": 30
  }
}

Account & meta

Account usage GET /v1/account/usage

Your key's metering and quota state.

GET/v1/account/usage
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/account/usage"
RESPONSE · 200
{
  "data": {
    "tier": "enterprise",
    "monthly_quota": -1,
    "monthly_used": 6,
    "usage_period": "2026-07",
    "lifetime_calls": 7,
    "lifetime_cost_units": 7,
    "recent": [
      {
        "ts": "2026-07-26 13:51:42.693016+00",
        "method": "GET",
        "endpoint": "/v1/account/usage",
        "status": null,
        "latency_ms": null
      },
      {
        "ts": "2026-07-26 13:45:34.45839+00",
        "method": "GET",
        "endpoint": "/v1/depth-cards",
        "status": 200,
        "latency_ms": 100
      },
      {
        "ts": "2026-07-26 13:45:33.81118+00",
        "method": "GET",
        "endpoint": "/v1/events",
        "status": 200,
        "latency_ms": 153
      },
      {
        "ts": "2026-07-26 13:29:26.953925+00",
        "method": "GET",
        "endpoint": "/v1/depth-cards",
        "status": 200,
        "latency_ms": 112
      },
      {
  … (23 more lines)

Version & tiers GET /v1/version

API version and the tier catalog.

GET/v1/version
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/version"
RESPONSE · 200
{
  "name": "Pressroom Analytics API",
  "version": "1.0.0-dev",
  "tiers": {
    "free": {
      "monthly_quota": 1000,
      "rate_per_minute": 30
    },
    "academic": {
      "monthly_quota": 50000,
      "rate_per_minute": 60
    },
    "starter": {
      "monthly_quota": 100000,
      "rate_per_minute": 120
    },
    "growth": {
      "monthly_quota": 1000000,
      "rate_per_minute": 300
    },
    "pro": {
      "monthly_quota": 5000000,
      "rate_per_minute": 600
    },
    "enterprise": {
      "monthly_quota": -1,
      "rate_per_minute": 1200
    }
  }
}

Corpus health GET /v1/health

Outcome-based corpus health (unauthenticated).

GET/v1/health
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/health"
RESPONSE · 200
{
  "state": "DEGRADED",
  "reasons": [
    "stale_leases",
    "backlog_with_zero_recent_commits"
  ],
  "process_reachable": true,
  "durable_work_healthy": false,
  "corpus_reachable": true,
  "articles": 204333,
  "corpus_db": "/opt/pressroom/data/pressroom.db",
  "metering_reconciliation_required": 0,
  "oldest_metering_reservation": null
}

Source registry GET /v1/sources

Every publication with its audience taxonomy.

GET/v1/sources
curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/sources"
RESPONSE · 200
{
  "data": [
    {
      "source_id": "aajkaal",
      "name": "Aajkaal",
      "country_of_origin": "India",
      "country_of_audience": null,
      "language": "bn",
      "nav_group": null,
      "category": "[\"regional\"]",
      "article_count": 265
    },
    {
      "source_id": "aapti-institute",
      "name": "Aapti Institute",
      "country_of_origin": "India",
      "country_of_audience": "India",
      "language": "en",
      "nav_group": null,
      "category": "[\"data-governance\", \"technology\", \"policy\"]",
      "article_count": 138
    },
    {
      "source_id": "ajit",
      "name": "Ajit",
      "country_of_origin": "India",
      "country_of_audience": null,
      "language": "pa",
      "nav_group": null,
      "category": "[\"regional\"]",
      "article_count": 49
    },
    {
      "source_id": "algerie-eco",
      "name": "Algerie-eco",
      "country_of_origin": "Algeria",
      "country_of_audience": null,
      "language": null,
  … (1739 more lines)

Full endpoint reference

All public operations. Every path takes the same X-API-Key auth (widget data additionally accepts publishable pk_ keys).

Search & discovery

ENDPOINTS
GET/v1/eventsPaginated canonical event registry
GET/v1/events/searchSearch canonical events
GET/v1/events/{eid}Canonical event profile
GET/v1/events/{eid}/articlesArticles mentioning an event
GET/v1/events/{eid}/coverageEvent coverage timeseries + by-source
GET/v1/events/{eid}/threadsEmergence threads covering this event (read-only cross-reference)
GET/v1/events/{eid}/timelineDeterministic per-event narrative timeline (beats + provenance)
GET/v1/locations/nearbyGeo-tagged locations within a radius
GET/v1/map/heatmapMentions aggregated into lat/lon cells
GET/v1/quotes/searchSearch quotes by text
GET/v1/searchFull-text article search with filters
GET/v1/sourcesSource registry with audience taxonomy
GET/v1/sources/facetsSource-cluster facets (origin / audience / language)
GET/v1/topicsList curated topics
GET/v1/topics/searchHybrid topic search (curated + keyword fallback)
GET/v1/topics/{slug}Curated topic profile
GET/v1/topics/{slug}/articlesArticles under a topic
GET/v1/topics/{slug}/coverageTopic coverage timeseries + breakdowns
GET/v1/topics/{slug}/entitiesTop co-occurring people / orgs / locations

Entities (people · organisations · locations)

ENDPOINTS
GET/v1/organisations/{eid}/peoplePeople affiliated with an organisation (employer link)
GET/v1/people/{eid}/quotesQuotes attributed to a person
GET/v1/{kind}/disambiguateResolve an ambiguous surface to candidates
GET/v1/{kind}/searchSearch entities by name / alias
GET/v1/{kind}/{eid}Canonical entity profile
GET/v1/{kind}/{eid}/articlesArticles mentioning the entity
GET/v1/{kind}/{eid}/coverageMention timeseries + breakdowns
GET/v1/{kind}/{eid}/historyIdentity-change history (from the change journals)
GET/v1/{kind}/{eid}/relationshipsTop co-mentioned people / organisations / locations
GET/v1/{kind}/{eid}/sentiment-trendDeterministic sentiment over time
GET/v1/{kind}/{eid}/stanceEntity stance dossier v2 (voices + act-family sections + resolved-target positions with consistency; country = world-wide government-voice roll-up)
GET/v1/{kind}/{eid}/timelineDate-anchored coverage timeline

Certified depth cards

ENDPOINTS
GET/v1/depth-cardsPaginated certified depth cards (story-state, PUBLISHED only)
GET/v1/depth-cards/story/{story_unit_id}Certified depth cards for one story unit
GET/v1/depth-cards/{card_id}Single certified depth card by id (provenance-cited)

Quotes & stance

ENDPOINTS
GET/v1/quotes/{quote_id}A quote with full provenance + speaker
GET/v1/stance/dossierDeterministic stance dossier (person alias, D8)

Analysis & briefs

ENDPOINTS
POST/v1/analyse/blind-spotEntities once co-covered with X that are now absent
POST/v1/analyse/crisis-trajectoryProject peak / duration from the volume curve
POST/v1/analyse/entity-relationship-deltaHow two entities' relationship moved over a window
POST/v1/analyse/epistemic-confidenceCorroboration vs contradiction across independent sources
POST/v1/analyse/narrative-conflictCompeting narratives across source clusters
POST/v1/analyse/narrative-momentumCoverage momentum (volume/diversity/geo/sentiment derivative)
POST/v1/analyse/quote-provenanceEvery occurrence of a quote, chronologically
POST/v1/analyse/sentiment-geographySentiment per mentioned place
POST/v1/analyse/signal-vs-noise% of a result set that is net-new vs repetition
POST/v1/analyse/story-attributionWho broke each story + how it propagated
POST/v1/analyse/story-lifecycleEmerging → Building → Peak → Declining → Dead
POST/v1/briefs/generateDeterministic cited analyst brief
POST/v1/chatDeterministic retrieval QA with citations (no LLM)

Stories & stream

ENDPOINTS
GET/v1/story/activeActive story units (deterministic order, no ranking model)
GET/v1/story/by-article/{article_id}Second click: article → its grounded story page
GET/v1/story/units/{unit_id}Grounded story page by unit id
GET/v1/streamReal-time mention stream (SSE, since a cursor)

Embeddable widgets

ENDPOINTS
GET/v1/widgetsEmbeddable widget catalogue
GET/v1/widgets/{id}/dataWidget data payload (metered; pk_ or secret key)
GET/widget.jsEmbed loader script (public asset)
GET/widgets/embedIframe render page (public asset; data is key-gated)

Your workspace

ENDPOINTS
POST/v1/tagAttach a custom tag to an article (per-key, non-corpus)
GET/v1/tagsList your tagged articles
POST/v1/watchlistsCreate a saved search
GET/v1/watchlistsList your saved searches
DELETE/v1/watchlists/{wid}Delete a saved search

Account & meta

ENDPOINTS
GET/v1/account/usageYour key's metering + quota state
GET/v1/healthOutcome-based corpus health
GET/v1/versionAPI version + tier catalog

Request access

Pressroom is in private beta. To request an API key, email shobhit.dixit@gmail.com with your use case. Keys are provisioned manually and mapped to a tier.

Pressroom API · v1.0.0-dev · deterministic & provenance-cited · examples on this page are real responses from the live API.