API v2 · Release 2.1.3 · 16 read-only routes · 9 MCP tools
URSY.news API v2
Publisher-feed headlines, feed-supplied excerpts, links and metadata. URSY does not fetch article pages, store or serve full article bodies.
The v2 API adds conservative event grouping above the headline archive. The complete v1 API and simple WordPress API keep their existing contracts. Every event label is a retained publisher headline with attribution; publisher counts describe observed coverage, not agreement.
v2 manifest · OpenAPI 3.1 · Capability manifest · Collection health
Quick start
18 curated feeds from 12 publisher organisations.
Try the live API
/api/v2/events?min_publishers=2&limit=5
- Five events covered by multiple publishers
- Five recent stories with provenance and event IDs
- Search events, headlines, publishers and topics
- Feed health and a starting change checkpoint
| Path | Response |
|---|---|
/api/v2/manifest | Manifest |
/api/v2/catalog | Sources |
/api/v2/sources | Sources |
/api/v2/sources/{id} | SourceEnvelope |
/api/v2/topics | Topics |
/api/v2/stories | Stories |
/api/v2/stories/{id} | StoryEnvelope |
/api/v2/events | Events |
/api/v2/events/{id} | EventEnvelope |
/api/v2/events/{id}/stories | Stories |
/api/v2/events/{id}/timeline | Timeline |
/api/v2/events/{id}/compare | Comparison |
/api/v2/search | Search |
/api/v2/changes | ChangeSet |
/api/v2/status | Status |
/api/v2/openapi | OpenAPI |
List requests accept up to 50 records. Events support source, topic, q, from, to, min_publishers and changed_since. Dates are UTC; from is inclusive and to exclusive. Follow the returned next_url to continue with the same filters. Unknown or duplicate parameters are rejected. Cursors continue a changing archive; they do not freeze its contents.
Poll what changed
To start watching new observations, first request GET /api/v2/status and follow changes.poll_url. Its changes.checkpoint skips earlier committed history. Status may be cached briefly, so deduplicate observations by their sequence. MCP clients can obtain the same checkpoint from get_status.
To read the available history from its beginning, start with GET /api/v2/changes:
GET /api/v2/changes?limit=50 GET /api/v2/changes?since=RETURNED_CHECKPOINT&limit=50
Process each page before storing its checkpoint. Follow pagination while has_more is true; an empty page returns the same checkpoint. Checkpoints identify committed observations and corrections, not publication time. Reuse ETag with If-None-Match and respect Cache-Control and Retry-After. Default origin capacity is 300 requests/minute shared with v1, MCP and Nicola metadata calls.
Read-only MCP
Send JSON-RPC POST to https://ursy.news/mcp/news. The server supports protocol versions 2026-07-28 and 2025-11-25, using stateless JSON responses. The existing estate MCP directory remains available.
search_news— Search publisher-feed headlines and excerpts, with separate events, stories, sources and topics.latest_events— Recent conservative event groups. Default min_publishers=1 includes standalone groups; coverage is not consensus.get_event— Read an event with member IDs, publisher diversity and grouping provenance. Use the REST members/compare links for full paginated descriptors.get_event_timeline— Read append-only URSY observations and corrections, not real-world chronology.get_story— Read one attributed feed headline and excerpt descriptor; never an article body.get_sources— List curated feeds, publisher identities, terms review records and access caveats.get_source— Read one feed identity, provenance, rights review and collection health.what_changed— Resume incremental observations. Process the page before saving its returned checkpoint.get_status— Read collection, grouping, rights review and timestamp health, plus a starting changes checkpoint.
For the 2025-11-25 protocol, initialize once with that version, then call tools/list or tools/call. Include Content-Type: application/json, Accept: application/json, text/event-stream and MCP-Protocol-Version: 2025-11-25.
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"news-reader","version":"1.0"}}}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"latest_events","arguments":{"limit":5,"min_publishers":2}}}
For 2026-07-28, use server/discover and per-request protocolVersion and clientCapabilities in params._meta, with matching MCP-Protocol-Version, Mcp-Method and (for tools/call) Mcp-Name headers. No account, cookie or reading history is required. Tools perform no network article fetching or write operations.
Provenance and limitations
New stories preserve raw publisher timestamps and flag dates more than five minutes after retrieval. Missing or invalid dates use a documented collection-time fallback. Earlier records whose basis cannot be proved remain unknown_legacy. Timelines describe URSY feed observations and explicit grouping corrections; they are not necessarily the chronology of a real-world event. Empty or merged groups retain their stable IDs and correction history without retaining pruned publisher text.
Story and event topic provenance identifies the source-feed category. It is not an inferred article subject. Successful v2 responses carry X-URSY-News-API-Version; the manifest and OpenAPI document the same release version.
Use original publisher links, preserve publisher attribution and access labels, and keep sponsorship separate. API availability grants no redistribution rights over publisher text or images. No article body, synthetic summary, truth probability or ideological score is supplied.
Canonical records and warnings
Record properties below come from the same schema owner used by the runtime serializers, OpenAPI and MCP outputs.
Story
id, slug, title, excerpt, original_url, archive_url, descriptor_url, source, topic, topic_name, published_at, first_seen_at, last_collected_at, image_revised_at, day, publisher_image_url, provenance, published_at_basis, topic_basis, event_id, image, schema, excerpt_basis, publisher_timestamp_raw, published_at_state, publisher_timestamp_parsed, feed_retrieved_at, rights, warnings
Event
id, label, label_basis, label_story_id, label_source_id, topic, status, first_seen_at, last_seen_at, updated_at, member_story_ids, publishers, source_ids, story_count, publisher_count, member_story_count_current, member_story_count_lifetime_observed, confidence, confidence_score, cluster_version, coverage, correction_status, url, provenance, schema, locked, merged_into, topic_basis, links, warnings
Source
id, name, description, scope, topic, topic_name, access, access_note, publisher_url, feed_url, archive_url, descriptor_url, stories_url, stories_archived, newest_at, publisher_id, health, rights, terms_review_status, terms_last_reviewed_at, terms_review_due_at, api_use_state, excerpt_policy, image_policy, feed_type, rss_atom_origin, warnings
TimelineEntry
sequence, type, event_id, story_id, source_id, observed_at, actor, data, warnings
Status
schema, enabled, collection, archive, events, calls, changes, version, generated_at, rights, contract, review_monitor, worker_observability, correction_qa, warnings
Developer manifest · Source policy · Grouping methodology · Corrections · Release changelog
Queries match retained headlines and feed excerpts. The query limit is 200 UTF-8 bytes, so non-ASCII characters may consume more than one byte. Deduplicate stories by ID, events by ID and updated_at, and changes by sequence.
Compatibility API v1
Use API v2 above for events, provenance and change tracking. Existing v1 clients remain supported.
URSY.NEWS / Free API
A free news API. No key, no sign-up, no bill.
Ask us for headlines from 18 publisher feeds and we answer with plain JSON. Every headline carries its publisher and a link straight to the publisher — please keep both.
Nothing is installed and nothing is signed up for. It just fetches.
5,329 headlines archived 18 publisher feeds 9 topics Archive is up to date, but not every feed answered · 8 minutes ago
Measured, not asserted: 17 of 18 feeds returned items on the last sweep. The live numbers behind this line are at /api/v1/status. Open it ↗
Try it
This is the address it will ask for:
Expert: the code for this exact request
Follow pagination.next_url to walk through more pages. Stop when your app has enough — this is a metadata API, not a bulk export.
Every address
| Address | What it gives you | Cache |
|---|---|---|
| /api/v1/manifest | Service identity, access policy, coverage, limits and discovery links. | 3600s |
| /api/v1/catalog | Compact catalogue of the public publisher feeds. | 3600s |
| /api/v1/sources | The same catalogue, named for news consumers. | 3600s |
| /api/v1/sources/{id} | One publisher, its feed and its archive links. | 3600s |
| /api/v1/topics | Recognised topic IDs for filtering stories. | 3600s |
| /api/v1/stories | Newest archived headlines, with filters and cursor pagination. | 60s |
| /api/v1/stories/{id} | One archived headline by its stable API ID. | 60s |
| /api/v1/search | Headline and summary search across the archive. | 60s |
| /api/v1/days | Archived days with a headline count for each. | 600s |
| /api/v1/status | Collection freshness, per-feed results and archive totals. | 30s |
| /api/v1/openapi | The OpenAPI 3.1 contract for this version. | 3600s |
GET, HEAD and OPTIONS. Anything else answers 405. Filters on /stories and /search: source topic from to limit cursor, and q on search. An unknown or repeated parameter is a 400 that tells you which one and why.
What you may do with it
What is in it. Publisher-feed headlines, short excerpts and original links. Not full-article syndication: no article body is fetched, stored or served.
Attribution. Keep the publisher name and original_url visible. Send readers to the publisher for the article itself.
Rights. Publisher text and image rights remain with their owners. Feed availability and free API access do not grant downstream republication rights. Check each publisher’s own terms.
Privacy. Only the curated public catalogue is exposed. Follows, blocks and saved headlines live in the reader’s own browser and are never part of this API.
Freshness. Reads come from the collected archive, not a live publisher fetch. Collection is gated to once every 15 minutes and is triggered by site traffic and an hourly WordPress cron, so it is not a guaranteed schedule.
Timestamps. published_at is the publisher’s stated date, or collection time when the feed gave none or gave an impossible one; the archive does not record which. In this compatibility projection last_collected_at equals first_seen_at. The preferred v2 API includes raw timestamp evidence and repeated collection times for new observations. The one thing that can change afterwards is the picture: if the publisher’s own feed item offers a larger variant of the same photograph, image_url is revised and image_revised_at records when. It is still not a content-change timestamp.
Paging. Newest published_at, then ID, descending. Cursors are bound to their filters; they are not credentials and not frozen snapshots. A publisher date correction can move an existing record between pages, so deduplicate by id.
How far back it goes. The archive keeps up to 400 items per configured source feed. A publisher may have several feeds. Older items are pruned; this is not a permanent news-wire archive.
Capacity. The archive answers up to 300 requests a minute in total, shared by everyone. That is a capacity guard, not a personal allowance, and it is not protection against abuse — we do not record or trust your IP address to work it out. If you meet it you get a 429 with a Retry-After; wait that long. Cached answers never touch the archive at all, so honouring ETag keeps you clear of it.
Two API surfaces, both kept.
This one, at /api/v1/, is the full contract: cursors, date ranges, ETags, OpenAPI. The older simple one at /wp-json/ursy-news/v1/
has not changed and will not be taken away from anything already using it.
OpenAPI 3.1 contract ↗ · Service manifest ↗ · RSS ↗ · JSON Feed ↗ · Under the hood
NICOLA v2 · News specialist
Ask bounded questions about News metadata and public capabilities. The specialist supports clarification, comparisons and source-bound follow-ups. Its local availability and estate network connection are reported separately.
Discovery · OpenAPI · Connection status. POST JSON to /wp-json/nicola/v2/ask or use the four tools at /wp-json/nicola/v2/mcp with MCP 2025-11-25. Existing News REST routes and the nine News MCP tools remain available.
Legacy/simple WordPress API
Read the compatibility stories endpoint. New integrations should use v2.