Migrating from SerpApi Google News
Replace https://serpapi.com/search?engine=google_news with /v1/news/everything. The parameter list is short, so most of the work is unpacking the q string: on APITube site:, when: and the rest are not operators, they are separate parameters.
The bigger change is what comes back. SerpApi returns a link; APITube returns the article.
Why teams switch
| SerpApi Google News | APITube | |
|---|---|---|
| Article text | None — you follow the link and fetch it yourself | Full body and body_html in the response |
| Pagination | None — one request, one page | page + per_page, up to 250 |
| Total count | Not reported | /v1/news/count |
| Filtering | Google's q operators | 60+ structured parameters that compose freely |
| Enrichment | None | Entities, sentiment (title/body/overall/per-entity), IPTC categories, topics, industries, publisher bias and rank, readability |
| Result identity | Opaque tokens | Stable integer ids |
You are replacing a scraper with an index, and that explains every difference below.
Your first request
# SerpApi
curl "https://serpapi.com/search?engine=google_news&q=tesla&gl=us&hl=en&api_key=YOUR_KEY"# APITube
curl "https://api.apitube.io/v1/news/everything?title=tesla&source.country.code=us&language.code=en" \
-H "X-API-Key: YOUR_API_KEY"Operators become parameters
In q | APITube |
|---|---|
tesla | title=tesla |
tesla musk | title=tesla,musk (comma is AND, as on Google) |
"artificial intelligence" | title="artificial intelligence" |
tesla OR rivian | query=title:(tesla OR rivian) |
tesla -musk | title=tesla + ignore.title=musk |
site:bbc.co.uk | source.domain=bbc.co.uk |
-site:cnn.com | ignore.source.domain=cnn.com |
when:7d | published_at.start=NOW-7d |
after: / before: | published_at.start / .end |
intitle: / allintitle: | Nothing — APITube only searches headlines anyway |
location:"New York City" | location.name=New York City |
source:BBC | source.domain=bbc.co.uk — source.name does not exist |
Inside query=, every bare term needs its title: prefix: query=tesla OR rivian does not search headlines at all.
The full operator reference is in the migration kit.
Parameter mapping
| SerpApi | APITube | Note |
|---|---|---|
q | title, query, source.domain, published_at.* | Splits — see above |
gl | source.country.code | Google's search country → the publisher's country. uk must become gb |
hl | language.code | Interface language → article language. Two letters only |
so=1 | sort.by=published_at&sort.order=desc | |
so=0 | — | sort.by=relevance returns 500 with a search term |
topic_token, section_token | category.id / topic.id | Opaque Google tokens; re-express by hand |
publication_token | source.domain | |
story_token | — | story.id groups articles but is not a filter |
kgmid | organization.name / person.name | |
no_cache, async, zero_trace, device | — | They describe how SerpApi scrapes Google |
output=html | — | JSON, plus eight export formats |
| — | page, per_page | New: SerpApi has no pagination |
What does not carry over
Relevance ordering. sort.by=relevance returns 500 ER0183 when a search term is present. Use sort.by=published_at, or sort.by=source.rank.opr to rank by publisher Open Page Rank — publishers, not articles, but usable.
Body-text search. APITube searches headlines. There is no content=, and unknown parameters are ignored silently — a forwarded one returns the whole index with a 200. The compensation is that the body is in the response, so filter locally.
Wildcards. title=immuni* is accepted and returns the entire index with a 200. Expand into query=title:(immunity OR immunization OR immunology).
when:30m. APITube reads m as months: NOW-30m returns 28 509 of 29 747 title=tesla articles. NOW-1h, NOW-7d and NOW-1y behave as expected; there is no minutes unit.
Google's clustering. highlight and stories[] have no counterpart. Articles covering the same story share a story.id, but there is no lead article and no cluster endpoint.
Russian and Ukrainian. language.code=ru and uk return 400 ER0237. Google's regional forms (en-US, pt-BR, zh-CN) return 400 ER0061 — two-letter codes only.
Two things to check before cutting over
Domain coverage varies. site: maps exactly to source.domain, but an indexed domain with no articles returns 0 with a 200. On 27 July 2026 theguardian.com, apnews.com, techcrunch.com and bbc.co.uk returned four-figure counts while reuters.com and cnn.com returned zero.
Do not add a country filter on top of a domain. Many publishers carry country_code: "un" in the source index, so source.domain=theguardian.com&source.country.code=gb returns nothing while the domain alone returns thousands.
What you gain
The fetch-and-extract stage disappears: body, body_html, an extractive summary, named entities with per-entity sentiment, sentiment for title and body separately, IPTC MediaTopics plus topic and industry axes, publisher political bias and Open Page Rank, readability scores, and export to eight formats. Plus 250 articles per request instead of one fixed page, and filters that compose — SerpApi's q cannot be used together with its advanced parameters at all.
Next steps
- serpapi-apitube-migration-kit — every
google_newsparameter mapped, the operator reference, a drop-in shim for Node.js and Python (82 tests, byte-identical output between the two), and an AI prompt for bulk conversion - Parameters reference
- Common migration issues