Try it
Run a live news search
One real call against the API — no signup, no key. Articles are drawn as a news page would, next to the raw JSON.
Endpoints & Pricing
One News Endpoint, One Price on Every Engine
News is its own billing category, priced per call. Switching engine= never changes what a news call costs, so you can compare engines on coverage instead of on budget.
Default
- No deposit and no subscription
- Covered by the free API calls
- One charge per call on a $10+ balance
- Below $10, a multi-page call bills per page
Growth
- Unlocked by a one-time $100 deposit
- 10× off the Default rate
- Always one charge per call
- Same rate on all five engines
Scale
- Unlocked by a one-time $500 deposit
- 20× off the Default rate
- Always one charge per call
- Same rate on all five engines
A deposit is a top-up you spend, not a monthly fee, and the tier it unlocks is permanent. One more rule worth knowing before you budget: on engine=google a news call is always billed as a single page, whatever num or pages you send.
Engines
Five News Engines, One Article Shape
Different engines index different outlets and rank them differently — that is the reason to have five. What they never differ on is the response: same seven keys, same order, same types.
| Engine | Parameter | What one call returns |
|---|---|---|
| Google News | engine=google |
The widest set on this endpoint and the fastest. Leave num off and it hands back its whole result list in a single call — around 100 articles. pages has no effect here, and the call is always billed as one page. |
| Yahoo News | engine=yahoo |
Walks the result pages: roughly 10 articles a page, up to the 5-page ceiling, which lands at about 47–49 articles when you ask for num=50. Accepts sort and safe. |
| Bing News | engine=bing |
Also paged, at roughly 10 articles a page up to 5 pages. Accepts sort and safe. |
| DuckDuckGo News | engine=ddg |
About 29 articles on a bare ?q= call. Setting num is what asks it to go deeper, and it has been measured up to about 44 articles. |
| Brave News | engine=brave |
About 29 articles once num is set. Worth pairing with a second engine when you are monitoring a story rather than sampling one. |
num is a ceiling on this endpoint, not a promise: it is capped at 50, and no engine has been measured returning the full 50. Every figure above is a measured typical, not a guaranteed minimum — a quiet query has fewer articles to give. When a call comes back short of what you asked for, it says so in a delivery block rather than leaving you to count rows.
Freshness is what makes a news call different from a web call
A web search wants the best page ever written on a subject. A news search wants the page written twenty minutes ago. freshness is the difference: h or 1h for the last hour, d/1d for the last 24 hours, 7d or w for the last week, m/1m for the last month, y/1y for the last year.
It is accepted on all five engines. Pair it with a 15-minute poll on freshness=h and you have a crisis monitor; pair it with freshness=7d and a weekly cron and you have a coverage report. Every article also carries its own publishedTime as a plain YYYY-MM-DD date, or null when the result carried no date — so you can filter again on your side without parsing “3 hours ago”.
GET /api/news
?q=acme+corp
&engine=google
&freshness=h
&country=us
{
"position": 1,
"source": "Reuters",
"publishedTime": "2026-09-07",
"title": "Acme Corp names new CFO",
"snippet": "The appointment follows...",
"url": "https://example.com/acme-cfo",
"image": null
}
Quick Start
Get News Articles in One Request
No SDK, no queue to poll, no job id to chase. A news call is a GET with an API key header, and the articles are in the response body when it returns.
# 1. Breaking coverage — everything published in the last hour curl "https://apiserpent.com/api/news?q=acme+corp&engine=google&country=us&freshness=h" \ -H "X-API-Key: YOUR_API_KEY" # 2. Newest first, 25 articles — sort= is taken on the engines that offer it curl "https://apiserpent.com/api/news?q=data+centre+outage&engine=bing&sort=date&num=25" \ -H "X-API-Key: YOUR_API_KEY" # 3. A local market, in its own language, over the past week curl "https://apiserpent.com/api/news?q=energiepreise&engine=brave&country=de&language=de&freshness=7d" \ -H "X-API-Key: YOUR_API_KEY"
{
"success": true,
"query": "acme corp",
"type": "news",
"engine": "google",
"country": "us",
"pagesScraped": 1,
"results": {
"articles": [
{
"position": 1,
"title": "Acme Corp names new chief financial officer",
"url": "https://example.com/acme-cfo",
"source": "Reuters",
"publishedTime": "2026-09-07",
"snippet": "The appointment follows a quarter in which...",
"image": null
}
],
"totalResults": 42
},
"meta": {
"totalArticles": 42,
"elapsed": "882ms",
"timestamp": "2026-09-07T10:47:33.000Z"
}
}
Send format=simple instead and each article is trimmed to position, title, url and source — the four fields a mention-detection job actually reads, without the summary text or the image URL.
# Poll every 15 minutes for coverage published in the last hour, and print # only the articles this machine has not already seen. `url` is the key: # one story is one row, so a repeat here is a genuinely new article. SEEN="$HOME/.acme-seen"; touch "$SEEN" while true; do curl -s -G "https://apiserpent.com/api/news" \ --data-urlencode "q=\"Acme Corp\"" \ -d "engine=google" -d "country=us" -d "freshness=h" \ -H "X-API-Key: $SERPENT_KEY" \ | jq -r '.results.articles[] | [.publishedTime, .source, .title, .url] | @tsv' \ | while IFS=$'\t' read -r date src title url; do grep -qxF "$url" "$SEEN" && continue echo "$url" >> "$SEEN" echo "NEW $date $src $title" done sleep 900 done
Data Fields
Every Field a News Call Returns
Seven named fields per article, not HTML you have to select against. Nothing here needs a parser of your own, and nothing changes shape between calls or between engines.
Article fields
- articles[].position
- articles[].title
- articles[].url
- articles[].source
- articles[].publishedTime
- articles[].snippet
- articles[].image
- totalResults · pagesScraped
That is the complete set. position is 1-based and never skips a number, so rank 7 in the array is rank 7 on the page.
Request parameters
- q (the search query, required)
- engine (google, yahoo, bing, ddg, brave)
- freshness (h/1h, d/1d, 7d, w, m/1m, y/1y)
- country (112 codes; uk and gb both work)
- language (ISO 639-1, e.g. en, de, ja)
- num (1–50 articles)
- pages (1–5, used when num is unset)
- sort (date, relevance) · safe · format
GET /api/countries returns the full country list and needs no API key.
What the shape guarantees
Every one of the seven keys is always present. A value the article did not carry arrives as null — never as a missing key — so one parser works against every engine and never throws on an absent field.
publishedTime is a date in YYYY-MM-DD form, not a relative phrase. source is the publisher name, falling back to the article's host when the page does not name one. image is a URL or null.
When a call comes back short
Ask for more articles than the query has, and the response adds a top-level delivery block: requested, returned, a short reason, a note, and an async_endpoint pointing at /api/bulk/jobs for a deeper run. The same counts also appear as meta.partialResults.
You are told, in the response, that you got fewer than you asked for. You never have to infer it by counting the array.
Why news search data
What news search data is, and why teams buy it
A news search result is an editorial judgement rendered as a list: which outlets covered a story, in what order, with what headline. That ordering is the product — and it is the part an article firehose cannot give you.
A ranked page, not a firehose
Most products sold as a “news API” are aggregated indexes: they hold a large pile of articles and hand you the ones that match your keyword. Useful, but it answers a different question. It cannot tell you what somebody searching your brand name today actually sees, or in what order.
This endpoint returns the news search result itself — ranked, sourced and dated the way the engine presents it. If your job is “what does the coverage look like right now”, ranking is the whole answer.
Publisher feeds do not rank, and stop at the publisher
The build-it-yourself route is one subscription per outlet. Each one gives you that outlet's own running order, which is chronological rather than editorial, and none of them knows the others exist. Fifty outlets means fifty integrations, fifty formats, fifty ways for a summary line or a date to go missing.
A news query crosses all of them at once and comes back in one shape — and it surfaces the outlets you did not think to subscribe to, which is usually where a story breaks.
The free plan you would prototype on is often development-only
Worth reading the terms before you build. NewsAPI.org's free Developer plan states it “may be used for development and testing in a development environment only, and cannot be used in a staging or production environment”, is limited to 100 requests a day, and serves articles on a 24-hour delay. Real-time commercial access starts at $449/month. Checked 7 September 2026.
Here, the free allowance is 10 real API calls against the live endpoint, with no delay and no development-only clause, and paid usage is per call rather than per month.
Seven keys, always present, on every engine
Adding a second news engine to a working integration is one query parameter. position, title, url, source, publishedTime, snippet and image arrive in that order on all five engines, with the same types.
No per-engine branch, no shape sniffing, and no field that is a string on one call and an object on the next.
Built for news
The Details That Only Matter on a News Call
Six behaviours this endpoint has because news data is not web data.
Freshness to the hour
freshness=h narrows to the last sixty minutes, and every step up to y is a single parameter change. Accepted on all five engines.
Sort by date
sort=date puts newest first instead of most relevant first, and sort=relevance is the other way. Offered on engine=yahoo and engine=bing.
A date you can sort on
publishedTime is YYYY-MM-DD, so it sorts and compares as-is. No parsing “yesterday” or “3 hours ago” out of a display string.
The publisher, named
source is the outlet's name, e.g. Reuters, falling back to the article's host when the result does not name one. Attribution without a URL-parsing step.
An image field on every row
image is always present as a key — the article's picture when the result carried one, otherwise null. Where a picture is there, a card renders without a second request per story.
One article, one row
The same story linked as http://site/x/ and https://site/x?utm_source=… is one article, so it appears once and is counted once in totalResults.
Use cases
What Teams Actually Pull News Results For
Four jobs that account for most news traffic on this endpoint, and the parameters each one needs.
Brand and executive mention monitoring
Poll a quoted brand name on freshness=h every fifteen minutes and key on url. Every new key is a new piece of coverage, with the outlet in source and the date already normalised.
format=simple keeps the payload to the four fields a matcher reads. At the Scale rate, a query polled every 15 minutes runs about 2,900 calls a month — roughly three cents.
Crisis detection and reputation watch
The value of a crisis alert collapses by the hour, which is exactly what the h freshness window is for. Run it against two or three engines rather than one: outlet mixes differ, and the first report of a story is often not on the engine you check by habit.
Log position alongside the headline. A negative story climbing from rank 9 to rank 2 is the signal, not its mere existence.
Competitor and category coverage
Run a weekly freshness=7d sweep over a list of competitor names, then group by source to see who is being written about, by whom, and how often. Share of voice from one endpoint and one loop.
country and language turn the same sweep into a per-market read — 112 country codes, so “how are we covered in Germany” is two parameters, not a second vendor.
Grounding a model or a briefing on today
A language model's training data has a cutoff; a news query does not. Fetch the top articles for a topic, hand the model title, source, publishedTime and snippet, and every claim in the output has a dated, attributable link behind it.
The same shape drives a morning briefing email or a newsroom dashboard — where the result carried a picture, image is already in the row, so those cards render without a second fetch.
FAQ
News API Questions
position, title, url, source, publishedTime, snippet and image. Alongside them the response carries totalResults, pagesScraped, the query, engine and country you asked for, and a meta block with the article count and elapsed time. Every one of the seven keys is always present — a value the article did not carry comes back as null rather than disappearing — so one parser works against all five engines.
engine=google a news call is always billed as a single page. News is covered by the free API calls every new account gets.
engine=google returns the widest set — leave num off and it hands back its whole result list in one call, around 100 articles, and it always bills as a single page. engine=ddg returns about 29 on a bare call and has been measured up to about 44 once num asks for more. engine=brave returns about 29 with num set. engine=yahoo and engine=bing page through results at roughly 10 articles a page, up to the 5-page ceiling, landing near 47–49 at num=50. num is capped at 50 on this endpoint and is a ceiling rather than a promise: no engine has been measured returning the full 50, and a short answer always carries a delivery block and meta.partialResults saying what arrived.
freshness takes h or 1h for the last hour, d or 1d for the last 24 hours, 7d or w for the last week, m or 1m for the last month, and y or 1y for the last year. It is accepted on all five engines. Separately, every article carries its own publishedTime as a plain YYYY-MM-DD date, or null when the result carries no date, so you can filter or sort again on your side without parsing a phrase like “3 hours ago”. On engine=yahoo and engine=bing you can also pass sort=date to order newest first, or sort=relevance for the default ordering.
engine=google, engine=yahoo, engine=bing, engine=ddg and engine=brave. They index different outlets and order them differently, which is the reason to have a choice. Start with engine=google for the widest and fastest set on a single call. Add a second engine when coverage matters more than volume — monitoring is the case where one engine's blind spot becomes your missed story. Price is identical across all five, so there is no budget reason to prefer one.
country takes any of 112 codes — us, uk, in, de, fr, jp, br, ca, au and more, with both uk and gb accepted — and GET /api/countries returns the full list without an API key. language takes a 2-letter ISO 639-1 code such as en, de or ja and is accepted on every engine, though coverage is broader on some than others. Together they are how one query becomes a per-market coverage report: same keyword, different country, one response shape.
Start using the News API
free API calls, no card and no subscription. News from $0.01 per 1,000 queries at Scale, the same rate on every engine.
Try for Free
