Migrating from SerpApi Google News
Replace https://serpapi.com/search?engine=google_news with /v1/news/everything. Convert operators inside q, such as site: and when:, to separate parameters.
APITube returns article text with the search results.
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 (10 on Free, 50 on Starter, 200 on Basic) |
| Total count | Not reported | /v1/news/count |
| Filtering | Google's q operators | 60+ parameters you can combine in one request |
| Article details | None | Entities, sentiment (title/body/overall/per-entity), IPTC categories, topics, industries, publisher bias and rank, readability |
| Result identity | Search-result tokens | Stable integer IDs |
Check how search scope, coverage and response fields differ 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 | Google-specific tokens; choose APITube categories or topics manually |
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 order results by the publisher's Open Page Rank. This ranks publishers rather than individual articles.
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
Check domain coverage. Map site: to source.domain, then check /v1/news/count. HTTP 200 with a count of zero means there are no matching articles.
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
Search results include body, body_html, summary, entities and sentiment. You also get separate title and body sentiment, IPTC categories, topics, industries, publisher details, readability and eight export formats. Use pages to fetch more results: 10 articles per page on Free, 50 on Starter, 200 on Basic and up to 250 on higher plans.
Next steps
- serpapi-apitube-migration-kit —
google_newsparameter and operator mappings, Node.js and Python compatibility libraries (82 tests, identical output), and an AI prompt for converting multiple queries - Parameters reference
- Common migration issues