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.

66 paths · 70 operations 204,000+ articles 177 sources No LLM in the answer path — reproducible

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:

export PRESSROOM_KEY="YOUR_API_KEY"

curl -H "X-API-Key: $PRESSROOM_KEY" \
  "https://api.pressroom.news/v1/search?q=election&page_size=3"
🔑 Don't have a key yet? Keys are issued by request during the private beta — see Request access below.

Authentication

Pass your key on every call, either header form:

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

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.

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

Response format

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

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

Paginate with page and page_size query parameters.

Entities — people, organisations, locations

Entity profile GET /v1/people/174

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

Request
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.

Request
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.

Request
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.

Request
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.

Request
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.

Request
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.

Request
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.

Request
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)

Account & meta

Account usage GET /v1/account/usage

Your key's metering and quota state.

Request
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.

Request
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).

Request
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.

Request
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 70 operations. Every path takes the same X-API-Key auth.

Search & discovery

MethodPathDescription
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)

MethodPathDescription
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

MethodPathDescription
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

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

Analysis & briefs

MethodPathDescription
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 & reader

MethodPathDescription
GET/v1/reader/followsList follows for this key
POST/v1/reader/followsFollow a story unit or an entity
DELETE/v1/reader/followsUnfollow
GET/v1/reader/homeFollowed stories with unseen deltas (deterministic order)
POST/v1/reader/seenMark articles seen (delta feeds exclude them)
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)

Your workspace

MethodPathDescription
POST/v1/exportCreate a bulk export job (runs synchronously, capped)
GET/v1/export/{job_id}Fetch an export job result
POST/v1/ingestBring-your-own document (SANDBOXED; never joins the corpus)
GET/v1/ingestList your sandboxed documents
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

MethodPathDescription
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.