Migrating from the Guardian Open Platform
Replace content.guardianapis.com/search with /v1/news/everything. But read the next section first: for a large class of queries the right answer is to keep the Guardian client, and knowing which is the whole point of this guide.
These are not the same product
The Guardian API is one publisher's complete archive. APITube is many publishers' recent coverage.
| Guardian Open Platform | APITube | |
|---|---|---|
| Publishers | 1 | 500 000+ |
| Guardian articles | 2 682 071 | ~3 700–4 800 |
| Archive depth | Back to 1999 | Guardian content back to 2001, thin before this year |
| Search scope | Full body text | Headlines only |
| Per request | 200 | 250 |
| Rate limit | 720/minute, 50 000/day on the free key | 50/minute paid, 10/minute free |
APITube holds roughly 0.14–0.18% of the Guardian's own archive. That is not a coverage bug — it is two different products.
Keep the Guardian client for: the archive, body-text search, the curated tag graph, editorial structure (sectionId, type=liveblog, star-rating, production-office), lastModified-driven refresh, and any stored Guardian article ids.
Move to APITube for: publishers other than the Guardian, entity extraction, sentiment, cross-publisher deduplication, and commercial licensing.
Most teams end up running both, routed by question. The shim in the migration kit is built to sit next to your existing client.
Your first request
# Guardian — the public test key works
curl "https://content.guardianapis.com/search?api-key=test&q=tesla&page-size=200&show-fields=headline,bodyText,byline"# APITube
curl "https://api.apitube.io/v1/news/everything?title=tesla&per_page=200" \
-H "X-API-Key: YOUR_API_KEY"The counts are not comparable
| Query | Results |
|---|---|
Guardian, q=tesla (default scope) | 4 466 |
Guardian, query-fields=headline | 507 |
Guardian, query-fields=body | 5 018 |
APITube, title=tesla | 29 811 |
Two effects at once: APITube searches 500 000+ publishers' headlines, the Guardian searches one publisher's full text. Note also that the Guardian's default matches none of the explicit query-fields combinations — set query-fields=headline before comparing anything.
NOT and - do not exclude on the Guardian
This is the conversion most likely to surprise you, and it is measurable:
| Guardian query | Results |
|---|---|
tesla | 4 466 |
musk | 9 138 |
tesla NOT musk | 2 675 529 — 99.75% of the archive |
tesla -musk | 11 007 — more than tesla alone |
Neither form narrows anything. APITube's ignore.title genuinely excludes — title=tesla returns 29 811 and title=tesla&ignore.title=musk returns 27 147.
So the conversion changes your result set, almost certainly towards what the query author intended. Expect it rather than treating it as a regression.
Parameter mapping
| Guardian | APITube | Note |
|---|---|---|
q | title or query | Headlines only |
query-fields=headline | title | The honest comparison point |
query-fields=body | — | No body-text search |
section | category.id | Desks, not subjects — see below |
tag | — | No counterpart to the curated tag graph |
from-date / to-date | published_at.start / .end | to-date means the end of that day |
use-date | — | The Guardian has four dates; APITube has one |
order-by=newest / oldest | sort.by=published_at + sort.order | |
order-by=relevance | — | Returns 500 ER0183 with a search term |
page / page-size | page / per_page | 200 → 250 |
show-fields | — | APITube always returns every field |
lang | language.code | Two letters only |
production-office, star-rating, type, ids, rights | — | Guardian-specific |
The full table is in the migration kit.
Sections are desks, not subjects
Guardian sections say who filed the story; IPTC MediaTopics say what it is about. section=technology returns 1 182 articles from the Guardian's tech desk; category.id=medtop:13000000 returns 4.7 million across all publishers, classified by subject.
Specific losses in that conversion:
scienceandtechnologysharemedtop:13000000— the distinction disappears.culture,film,music,books,artanddesign,stageandgamesall collapse intomedtop:01000000.world,uk,usandaustraliaare newsrooms with no subject code at all. If you wanted publishers from a country, that issource.country.code.
Other things that will bite
to-date covers the whole day. 2026-07-27 on the Guardian includes that day; converting it to 2026-07-27T00:00:00Z silently drops it. Use T23:59:59Z.
No lastModified. The Guardian tracks updates; APITube exposes only publication time. Pipelines that re-fetch changed articles have no trigger.
Article ids do not translate. Guardian ids are paths (technology/2026/jun/24/…), APITube's are integers, and there is no URL lookup — href=, url= and link= are ignored silently and return the whole index with a 200.
page=0. The Guardian rejects it; APITube treats it as page 1, so a loop starting at zero returns the first page twice.
total costs a request. The Guardian reports it in every response; APITube needs /v1/news/count with the same filters. Call it once per filter set.
What you gain
500 000+ publishers instead of one, named entities with Wikidata links and sentiment towards each entity, sentiment on headline and body separately, IPTC MediaTopics alongside topic and industry axes, publisher political bias and Open Page Rank, readability scores, cross-publisher deduplication via is_duplicate and story.id, and export to eight formats.
The last two only mean anything once you have more than one publisher — which is the reason to be reading this page.
Next steps
- guardian-apitube-migration-kit — every
/searchparameter mapped, the measured query-syntax reference, an honest boundary of what stays on the Guardian, a drop-in shim for Node.js and Python (78 tests, byte-identical output between the two), and an AI prompt that refuses to convert archive queries - Parameters reference
- Common migration issues