{"api":"news","description":"Multi-source, agent-ready news: newest headlines from a 972-feed tiered direct portfolio covering every category, multi-day archive keyword search, and a provenance-labelled sentiment timeline, refreshed every 15 minutes.","refresh":{"cadence":"every 15 minutes","window_hours":72,"searchable_hours":72,"searchable_days":58,"updated_at":"2026-09-27T15:08:25.655Z"},"sources":[{"source":"rss","feed":"Direct publisher feeds","description":"Tiered direct RSS/Atom feeds across every category — primary sources (Federal Reserve, SEC, ECB, Bank of England, BLS, CFTC, White House, European Commission, UN, NASA, ESA, NSF, EIA, DOE, CISA, and the OpenAI / DeepMind / Google AI / NVIDIA / Apple newsrooms), majors (BBC, NYT, Guardian, NPR, CNBC, MarketWatch, FT, Economist, Washington Post, LA Times, CBS, NBC, ABC, Al Jazeera, DW, Euronews, Sky, SCMP, Japan Times, Straits Times, Politico, The Hill, Axios, Business Insider, Fortune, ESPN, CBS Sports, Yahoo Sports, The Athletic), and quality trade press (CoinDesk, Cointelegraph, The Block, Decrypt, Bitcoin Magazine, CryptoSlate, Protos, Ars, Verge, Wired, MIT Tech Review, The Decoder, Engadget, The Register, ZDNet, The Record, Techmeme, IEEE Spectrum, Tom's Hardware, 404 Media, Krebs, BleepingComputer, TechCrunch, STAT, Medical Xpress, KFF Health News, Nature, Science, Phys.org, New Scientist, Quanta, OilPrice, Utility Dive, Electrek, CleanTechnica, Rigzone, Canary Media, pv magazine, Carbon Brief, Inside Climate News, Grist, Yale E360, Mongabay, Climate Home). Real publisher URLs and domains, no aggregator redirects."},{"source":"sitemap","feed":"News sitemaps","description":"Google-News XML sitemaps from the wires and majors (Reuters, CNN) — hundreds of recent articles per outlet with exact publish times and lead images. AP's sitemap is retired (HTTP 403 for our User-Agent since 2026-09-09); AP stories still arrive through the GDELT gate."},{"source":"hn","feed":"Hacker News","description":"Front page + newest AI stories via the Algolia API (search_by_date) — the social-velocity signal for tech/AI."},{"source":"gdelt","feed":"GDELT 15-minute files","description":"GDELT's 15-minute events export AND Global Knowledge Graph, used as an enrichment tier: document tone (and the GKG word count) is attached by URL match to articles from any source and labelled tone_method=gdelt, and GDELT-discovered URLs are admitted as articles only when their domain passes a reputation gate (wire/major/trade/official domains; the SEO and PR long-tail is excluded)."},{"source":"gnews","feed":"Google News RSS (retired)","description":"Retired ingest path — its redirect URLs broke attribution and dedup. The value remains in the enum because archived articles carry it; no new articles are ingested from it."}],"portfolio":{"feeds":972,"tiers":{"official":254,"major":458,"trade":252,"social":8},"category_feeds":{"world":210,"business":153,"technology":222,"ai":60,"crypto":70,"nft":13,"markets":100,"health":40,"science":93,"energy":30,"politics":111,"climate":37,"sports":119,"general":0},"categories":["world","business","technology","ai","crypto","nft","markets","health","science","energy","politics","climate","sports","general"]},"tone":{"methods":{"gdelt":"GDELT document tone (GKG V1.5TONE, or the events export's AvgTone) attached by canonical-URL match — whole-article sentiment on GDELT's scale (negative = adverse, roughly −10..+10). The strongest signal; replaces a lexicon tone the run it arrives.","lexicon":"Our local lexicon over the headline plus the feed's summary, on the same scale — coarse and headline-spiky, used only where GDELT has not (yet) seen the URL. Always labelled; never mixed into a GDELT number.","null":"No tone could be computed (no lexicon word matched and GDELT never saw the URL). Timelines count these articles in volume but never in avg_tone."},"served_window":{"gdelt":13794,"lexicon":35287,"none":18943}},"coverage":{"total":68024,"per_source":{"rss":{"count":23850,"ok":true,"last_error":"HTTP 403"},"sitemap":{"count":39029,"ok":true},"hn":{"count":860,"ok":true},"gdelt":{"count":113,"ok":true},"gnews":{"count":0,"ok":true}},"categories":{"world":31771,"business":20146,"science":1797,"politics":15981,"technology":9877,"sports":23342,"health":4883,"crypto":968,"climate":1871,"markets":9523,"ai":3239,"energy":1461,"general":242,"nft":149},"archive":{"total_articles":514792,"days":60,"first_day":"2026-07-30","last_day":"2026-09-27"},"search_index":{"days":58,"oldest_day":"2026-08-01","newest_day":"2026-09-27","articles":428733}},"limitation":"The served window behind /headlines, /ai and /crypto currently spans 72h (68024 articles, oldest 2026-09-24T15:08:26.000Z; ranked over a compact index of the whole window, full records read per publish hour). /search and /timeline additionally fan over the retained publish-day archive shards (58 days, 2026-08-01 → 2026-09-27), and each response's `depth` block states exactly what was scanned. Direct publisher feeds arrive at wire speed; major outlets re-reporting a wire story do so with their own delay, so the same story can appear once early and again later under other outlets. Categories are assigned at ingest from the feed's section, the publisher's URL path and title/summary anchors — a filter that matches fewer than 5 articles in the served window is answered in full and flagged coverage.thin with a why. Tone is GDELT document sentiment where GDELT saw the URL, else our local lexicon over title + summary — each article says which (tone_method), and no tone is ever an unlabelled null. NOT live web search; freshness = last refresh (updated_at echoed).","polling":{"since":"`since` on /headlines, /ai, /crypto and /search bounds the INGEST clock (seen_at), not the publish time, so a late-ingested story is never missed. Pass an ISO instant, or the `next_cursor` from any paid response (opaque, prefix `nc1.`). A `since` page is walked in ingest order and `next_cursor` resumes after its last article; a poll with nothing new is a paid 200 with new_count 0 and next_cursor unchanged.","fields":["new_count","next_cursor","polled_at","poll"],"suggested_interval_seconds":900,"batch":{"route":"POST /news/batch","max_requests":10,"routes":["headlines","ai","crypto","search"],"body_example":{"requests":[{"route":"ai","limit":5},{"route":"crypto","limit":5},{"route":"search","q":"stablecoin"}]}}},"ranking":{"routes":["/news/headlines","/news/ai","/news/crypto"],"order":"Newest first by `published`, clamped to `seen_at` + 5 min: a publisher clock running ahead cannot pin the top (the ingest also pins such a publish time to seen_at). Exact ties keep the served file's order.","stories":"One record per story. `cluster_id` groups the same story told by different outlets in different words (near-duplicate headlines within 48h, clustered at ingest over the served window); the record shown (the lead) is the one with the highest `source_score` (source-trust class — wire > major > primary > trade > standard > press release > aggregator — then outlet scale), then the earliest (clamped) publish, chosen among the records that matched your filters. It carries `cluster_size` and `also` (≤3 other outlets).","per_source_cap":"A ranked page holds at most max(2, ceil(15% of limit)) records from one publisher domain — 3 on the default page of 20. Records over the cap are deferred and used only when nothing else matches, so a page is never short because of it.","since":"A `since` walk is a complete delivery — every new story exactly once, in ingest order — so it is never capped (a cap on a complete walk could only skip or repeat). Stories are collapsed before `since` is applied: a later, lower-tier retelling of a story you already have is not new."},"paidEndpoints":["/news/headlines","/news/ai","/news/crypto","/news/search","/news/timeline","/news/brief","/news/batch"],"freshness":{"as_of":"2026-09-27T15:08:25.655Z","window_hours":72,"source_count":7,"coverage":{"oldest_published":"2026-09-24T15:08:26.000Z","newest_published":"2026-09-27T15:07:05.621Z","hours":72,"articles":68024}}}