News APIs are usually sold by the request, gated behind a key, and capped at a hundred calls a day on the free tier. Free News API is none of those things: 21.5 million articles across a rolling 90-day window, 25,000+ publishers, no key, no signup, no quota, commercial use allowed. Here is the entire surface — search, statistics, trends, markets, feeds and MCP — and an honest account of what the data gets wrong.
The Shape of the Problem
Ask an AI agent what the world is writing about right now and it has three bad options. It can scrape publishers directly, which is fragile, slow and legally murky. It can call a commercial news API, which means an account, a key, a monthly bill and — on every free tier in the market — a hundred requests a day and articles delayed by twenty-four hours. Or it can guess from training data that stopped months ago.
Free News API removes the middle option's price and paperwork without removing its capability. One GET request, no credentials, over a corpus that at the time of writing holds 21,557,044 articles from more than twenty-five thousand publishers, kept on a rolling ninety-day window and refreshed continuously — the newest article in the index is typically under two minutes old.
Four Core Endpoints, and Then Some
The core of the service is four GET endpoints, all under https://freenewsapi.ai, all returning UTF-8 JSON with Access-Control-Allow-Origin: * so browser code can call them directly, and all reporting server-side time in took_ms.
| Endpoint | What it answers |
|---|---|
GET /v1/search | Full-text search with filters. The endpoint you use 95% of the time. |
GET /v1/stats | Aggregated counts for any slice — by country, language, TLD, publisher and day. |
GET /v1/article | One article by its exact URL, including the full body text. |
GET /health | Liveness plus the current document count. Cheap enough to poll. |
Around that core sit four more families, each of which would be a product on its own elsewhere: trends (live story clustering per country), markets (price series aligned against coverage volume), crypto sentiment (a seven-endpoint Bitcoin block), and syndication (the same search rendered as RSS, Atom or JSON Feed). All of them are covered below.
curl "https://freenewsapi.ai/v1/search?q=climate+summit&size=2"{
"took_ms": 41,
"total": 1284,
"total_is_lower_bound": false,
"size": 2,
"offset": 0,
"results": [
{
"id": "9c1f8a4b2d3e5f6071829304a5b6c7d8",
"url": "https://example-news.com/world/climate-summit-opens",
"title": "Climate summit opens with a call for binding targets",
"description": "Delegates from 190 countries gathered on Monday ...",
"published_at": "2026-08-17T09:12:00Z",
"crawled_at": "2026-08-17T10:48:31Z",
"host": "example-news.com",
"sitename": "Example News",
"country": "GB",
"country_source": "cctld",
"lang": "en",
"tld": "com"
}
]
}Three fields in that response deserve immediate attention, because they encode the honesty of the whole dataset. total_is_lower_bound tells you when the match count hit its 10,000 ceiling and stopped counting. country_source tells you how the country was determined — because in any news dataset a large share of country values are inferences, not facts. And crawled_at is the trustworthy timestamp: publishers backdate published_at routinely, but crawl time is assigned by the pipeline and only ever moves forward.
Search: Every Parameter That Matters
All parameters are optional. A bare call returns the newest articles in the index.
The query
- q Matched against title (weight 3), description (weight 2) and the article body. AND semantics — every term must be present, so adding a word narrows rather than widens. Maximum 500 characters.
opec production cut works. what did OPEC decide about oil returns nothing.The filters
Filters combine with AND across parameters and OR within one. So country=DE,AT&lang=de reads as "German-language articles from Germany or Austria". Each accepts a comma-separated list of up to fifty values.
| Filter | Format | Notes |
|---|---|---|
country | ISO 3166-1 alpha-2, uppercase | Publisher country. Derived, not declared — see country_source and strict_country. |
lang | ISO 639-1, lowercase | Detected from the document itself. 99.9% coverage. |
tld | no dot | Domain zone of the publisher. tld=ua is a fact; country=UA is an inference. |
host | exact hostnames | As they appear in the URL — include www. if the publisher uses it. |
date | today · yesterday · 24h · 48h · 7d · 30d | Preset period, evaluated against published_at. |
from / to | ISO dates | Explicit window when the presets do not fit. |
strict_country | true/false | Only count articles whose country is a hard fact rather than an inference. |
Output control
| Parameter | Values | Effect |
|---|---|---|
sort | date · date_asc · crawled · crawled_asc · relevance | Sort by crawled when polling for new articles — publishers backdate publication times; crawl time only moves forward. |
size | 1–100 | Results per page. |
offset | 0–9900 | Paging offset. |
full_text | true/false | Include the article body. Off by default. |
highlight | true/false | Return matched fragments. |
fields | CSV | Trim the response to the fields you actually use. |
curl "https://freenewsapi.ai/v1/search?country=UA&lang=uk&date=today&sort=date&size=10"curl "https://freenewsapi.ai/v1/search?q=merger&country=DE&date=48h&sort=date&size=20"Counting Before You Search
The most under-used endpoint in the service is /v1/stats. Often the useful question is not "what are the articles" but "is there anything here at all, and where is it". Counting answers that for a fraction of the cost — roughly two hundred tokens against several thousand for a page of results — which makes it the correct first call for an agent deciding whether a search is worth running.
curl "https://freenewsapi.ai/v1/stats?q=earthquake&date=7d"It returns counts by country, language, TLD, publisher and day, computed over the whole matching set rather than the current page. Which is also how you measure coverage before you trust it. The unfiltered snapshot at the time of writing:
Top countries
| Country | Articles |
|---|---|
| India | 2,286,014 |
| United States | 2,180,797 |
| Turkey | 1,499,897 |
| Russia | 1,436,556 |
| Italy | 1,057,479 |
| Argentina | 826,947 |
| Spain | 812,347 |
| Ukraine | 662,041 |
| Brazil | 551,013 |
| Germany | 543,132 |
| France | 502,846 |
| Greece | 460,372 |
| Japan | 437,209 |
| Vietnam | 408,934 |
| Mexico | 402,320 |
| South Korea | 362,945 |
| Romania | 354,229 |
| United Kingdom | 334,379 |
| Iran | 291,782 |
| Poland | 255,599 |
Top languages
English 5,513,650 · Spanish 2,699,457 · Russian 1,785,796 · Turkish 1,501,004 · Italian 992,200 · German 733,677 · French 689,136 · Arabic 664,016 · Portuguese 637,607 · Hindi 560,840 · Greek 466,504 · Japanese 427,085 · Vietnamese 385,719 · Romanian 358,766 · Chinese 352,720 · Ukrainian 345,809 · Korean 335,079 · Persian 268,126 · Polish 238,904 · Bulgarian 183,204.
That distribution is worth staring at for a second, because it is the opposite of what most news APIs give you. The usual English-first, US-first corpus is not what this is: India outranks the United States, Turkish outranks German, and Greek, Vietnamese, Persian and Bulgarian all have six-figure representation. If your question is about a non-English press, this is a materially different dataset.
Volume
The daily curve in by_day covers the full ninety-day window. Recent days sit in the range of roughly 400,000 to 700,000 articles per day; earlier in the window, before the RSS layer was added alongside the archive ingest, daily volume ran at 130,000–230,000. Both figures are visible in the same response, which is the point — the service shows you its own ramp rather than quoting a marketing average.
Trends: What the Press Is Actually Covering Right Now
Search answers "what was written about X". Trends answers a different and often better question: "what is happening" — with no X required.
A robot clusters articles into stories per country and keeps them updated. Every five minutes new articles are attached to known stories by their identifying words, with no model call at all; every few hours a country goes through a full pass where a language model reads the headlines and names the stories from scratch. At the time of writing the trend layer covers 115 countries, each recomputed within the last few minutes.
curl "https://freenewsapi.ai/v1/trends?country=US&window=24h&size=5"{
"window": "24h",
"filters": { "country": ["US"], "min_publishers": 1 },
"trends": [
{
"title": "Hurricane Marie threatens Labor Day weather",
"slug": "hurricane-marie-threatens-labor-day-weather",
"country": "US",
"category": "weather",
"articles": 57,
"publishers": 24,
"first_seen": "2026-09-05T19:24:36Z",
"latest": "2026-09-06T19:00:04Z",
"url": "https://freenewsapi.ai/trends/us/hurricane-marie-…",
"headlines": [ … ]
}
]
}Two counts come with each story and they mean different things. articles is loudness; publishers is breadth. A story with 200 articles from 4 outlets is one newsroom's obsession. A story with 60 articles from 40 outlets is an event. The default sort is by publishers, and min_publishers / min_articles let you set the bar yourself.
Stories carry a category from a fixed set: politics, business, markets, tech, sport, health, science, culture, crime, conflict, weather, society.
The window is the reader's choice, not the robot's
This is a genuinely elegant design decision. Every article is stored with its publication time and attached to its story, so any window — fifteen minutes, an hour, a day, a specific calendar date — is just a range query over the same stored data. One computation serves every window at once. window=15m, window=1h, window=24h, date=2026-09-01, or an explicit since/until pair all work against the same index with no recomputation.
Keywords: the words the news is built on
curl "https://freenewsapi.ai/v1/trends/keywords?country=US&size=8"Each keyword comes back with how many distinct stories carry it, how many articles those stories hold, and — the interesting one — how many national presses use it. That last number is the difference between a global event and a domestic one. A word appearing across seventy countries is a world story; a word dominating one country's press is a domestic story, however loud it is there.
Which countries are live
curl "https://freenewsapi.ai/v1/trends/countries"Returns every tracked country with its live story count and how many minutes ago it was recomputed — Turkey, Russia, Iran, Greece, India, Italy, Ukraine, Romania, Argentina, Germany and Brazil all currently carry thousands of live stories each, recomputed within the last ten minutes. And /v1/trends/{cc}/{slug} opens any single story with its full article list.
Markets vs. Coverage: Price on One Axis, Attention on the Other
This is the most unusual thing in the service, and it exists because the corpus makes it nearly free to build. Put a price series next to how much the world wrote about that thing in the same hours, on one timeline.
curl "https://freenewsapi.ai/v1/markets"Fourteen instruments are tracked, across four asset classes:
| Class | Instruments | Grain | Source |
|---|---|---|---|
| Crypto | Bitcoin, Ethereum, Solana, XRP, BNB, Dogecoin | hour | Binance |
| Metals | Gold (USD/oz) | hour | Binance |
| FX | EUR/USD, USD/JPY, USD/TRY, USD/INR, USD/BRL, USD/PLN | day | ECB |
| Energy | German power price (EUR/MWh) | hour | Energy-Charts |
curl "https://freenewsapi.ai/v1/markets/usd-try?window=30d"That single call gives you the lira against the dollar and the volume of Turkish-press coverage over the same period, aligned hour by hour. The Turkish press is the third-largest slice of this corpus, which is exactly why that pairing produces something meaningful rather than noise.
And a full Bitcoin sentiment block
Bitcoin gets its own seven-endpoint family, because it is the one instrument where news tone and price movement are argued about constantly and rarely measured:
| Endpoint | Returns |
|---|---|
/v1/btc/summary | Latest price, recent moves, and the tone of today's coverage. |
/v1/btc/price | BTC/USDT candles by interval. |
/v1/btc/sentiment | News tone per period. |
/v1/btc/series | Price and tone aligned on one timeline. |
/v1/btc/correlation | Correlation between tone and price move by time shift — does coverage lead the price, or follow it? |
/v1/btc/news | Crypto articles with their sentiment label, filterable by label, host, language and query. |
/v1/btc/sources | Which outlets drive crypto coverage, and how each of them leans. |
The sentiment labels come from a language model that runs over fresh crypto articles every five minutes, against a calibrated coin list. /v1/btc/correlation with a max_shift parameter is the one to reach for if you have ever wanted to test the "the news causes the move" claim rather than repeat it.
The Same Search, as a Feed
Three more endpoints take the identical search parameters and render the results as syndication formats instead of JSON:
GET /v1/rss— RSS 2.0GET /v1/atom— Atom 1.0GET /v1/feed.json— JSON Feed 1.1
https://freenewsapi.ai/v1/rss?q=semiconductor+export+controls&lang=en&date=7d&sort=dateWhich means any saved search becomes a feed you can paste into a reader, an n8n node, a Slack integration, a Zapier trigger or a static site generator — with no code and no key. It is a small feature that quietly removes an entire integration layer for non-programmers.
MCP: Twenty-Eight Tools, Two Layers
The MCP server lives at one URL, speaks Streamable HTTP (JSON-RPC 2.0 over POST, protocol version 2025-06-18), supports batching, and — like everything else here — has no authorization step and no session id.
claude mcp add --transport http freenewsapi https://freenewsapi.ai/mcpIt exposes 28 tools in two deliberate layers.
Layer one: six shortcuts that answer a whole question in one call
| Tool | For |
|---|---|
search_news | "What was written about X" — full-text search, trimmed result. |
get_trends | "What is happening" — grouped stories rather than a list of articles. |
trend_keywords | The words the news is built on right now, with story counts and country spread. |
find_publishers | Look up outlets: name, domain, country, language, articles per day. |
list_countries | Which countries have live stories, how many, and how fresh. |
market_vs_news | A price series next to coverage volume. Call with no instrument to see what exists. |
Layer two: every endpoint, generated from the service itself
Beneath the shortcuts, each raw endpoint is exposed as its own tool with every parameter the API accepts — news_get_search, news_get_stats, news_get_article, news_get_trends, news_get_trends_keywords, news_get_markets_slug, the whole news_get_btc_* family, the feed renderers, and news_get_health. These are generated from the live service, so they cannot drift from what the API actually accepts.
Two meta-tools close the loop: news_list_endpoints returns the catalogue of everything that exists, and news_get performs a raw GET on any path — so an agent that meets an endpoint its tool list does not cover can still reach it.
curl "https://freenewsapi.ai/mcp?format=json"One GET, no handshake, and you have the entire machine-readable catalogue: server, transport, protocol, tool count, every tool with its description, and every endpoint with its parameter list.
Built to Be Read by Machines
The documentation is not an afterthought bolted onto the API — it is a first-class output of it. The site ships 665 static pages, and several of them exist specifically so that a model never has to read HTML:
- /openapi.json The full OpenAPI schema.
- /llms.txt A short orientation file — what the service is, the endpoints, how to query well, the errors.
- /llms-full.txt The entire documentation as one plain-text file, well over a hundred kilobytes of it, so an agent can ingest the whole manual in one fetch.
- /agents Thirty-nine pages aimed squarely at agent builders: ready-made OpenAI function definitions, Anthropic tool-use definitions, system prompts for news retrieval, RAG recipes, token-cost tables, and agent recipes.
- /agents/models Tool-calling code per model family — Qwen, DeepSeek, MiniMax, Kimi, GLM, Doubao, Hunyuan, ERNIE, Yi, Step, GPT, Claude, Gemini, Grok, Mistral, Llama, Command, Nova, Phi, Jamba, Sonar, OpenRouter, Ollama, vLLM.
- /data What is inside the corpus, the methodology, the index schema, and a page titled Data quality that documents what the dataset gets wrong.
- /sources A browsable catalogue of 11,668 publishers, sliceable by country, language and domain zone.
- /compare Side-by-side pages against NewsAPI.org, GNews.io, NewsData.io, Mediastack, Currents, TheNewsAPI, NewsCatcher, WorldNewsAPI, Perigon, APITube and FreeNewsAPI.io.
Plus 168 country pages, 121 language pages and 275 TLD pages — one browsable surface per slice of the corpus, each showing what is actually in it.
Where the Articles Come From
Two ingest paths feed the same index, and the difference between them matters.
The archive path
Every ten minutes a job checks Common Crawl's CC-NEWS archive for new WARC files and processes anything it has not seen, using forty parallel workers. The extractor pulls each article out of the raw crawl with a documented cascade per field — and the cascades were measured against real data rather than assumed:
| Field | Cascade | Coverage |
|---|---|---|
| description | JSON-LD → meta → OpenGraph → Twitter card → articleBody → lead paragraph | 98.1% |
| language | <html lang> → JSON-LD inLanguage → og:locale | 99.9% |
| country | ccTLD → JSON-LD addressCountry → language-region → og:locale | 79.1% |
| date | JSON-LD datePublished → meta → trafilatura → crawl time | 100% |
That country figure is the honest one, and it is why country_source is exposed on every article: roughly a fifth of records have no reliable country signal at all, and about a third of the values that do exist are inferences rather than facts. The API tells you which is which instead of pretending.
The live path
A second robot polls publisher RSS feeds every five minutes, in a rotation with conditional requests — a feed that answers 304 Not Modified costs almost nothing, and each feed's polling interval is tuned to how often it actually publishes. An outlet posting five stories a day is not hammered every fifteen minutes.
It also takes only what the publisher put in the feed: title, lead, and full text when the feed carries it. It does not walk onto the publisher's site to fetch more. That is a deliberate boundary, and it is the reason the service can make the promises it makes on its publisher-facing legal page.
And the machinery around them
Around the two ingest paths sit a dozen more robots on schedules: source discovery and sync, per-domain country resolution, trend building and auditing, keyword backfill, crypto sentiment, market pulls, a taxonomy catalogue, retention (the ninety-day window is enforced by a nightly query on published_at, not by index age), day verification, empty-article rechecks, and a health guard that restarts anything that has stopped. The corpus lives on a dedicated Elasticsearch cluster.
What This Dataset Gets Wrong
The service publishes its own limitations, which is the fastest way to judge whether it fits your problem.
- Country is inferred Read
country_sourceon every article, and addstrict_country=truewhen you are counting by country rather than browsing. - published_at is publisher-supplied Backdating is common. Sort by
crawledwhen you are polling for what is new. - total is capped at 10,000 For speed.
total_is_lower_boundtells you when you hit the ceiling. - No sentiment or entity extraction Outside the Bitcoin block, articles carry no sentiment score and no named entities. That is not in scope.
- Ninety days and no more There is no deeper archive. If you need 2019, this is the wrong tool.
- No SLA It is free. It is also monitored and guarded, but nothing is promised in writing.
- The text belongs to the publishers Every response includes the original URL, and callers are expected to link back to it.
Using It Well: Cost, Paging and Errors
Token discipline
For an agent, response size is the real cost. The documented shape of it:
| Call | Rough token cost | When |
|---|---|---|
/v1/stats | ~200 | First. Decide whether the search is worth running at all. |
/v1/search metadata only | a few thousand per page | Scan and select. |
/v1/search?full_text=true | ~900 per article | Only for the handful you actually chose. |
Twenty articles with full_text=true is roughly 40,000 tokens. The recommended pattern is always the same: count, scan, then fetch bodies for the few you need.
Paging past the ceiling
offset stops at 9,900. To walk a large set, do not fight the ceiling — slice by time instead. Loop day by day, or hour by hour on a busy query, with from/to and sort=date. The documentation has a dedicated page on walking a whole day.
Errors
The contract is blunt and easy to code against: 4xx means the request is wrong — fix it, do not retry. 5xx means the service is down — back off. 429 means slow down and retry. Unknown query parameters are ignored rather than rejected, so adding a field can never break an existing caller.
Identify Yourself (Optional, and Genuinely Optional)
With no key there is no way to reach a caller. The suggested courtesy is a header naming your agent, the framework it runs through and the model driving it:
X-Agent: agent_name=<agent>; software=<langchain|llamaindex|n8n|claude-desktop|cursor|openai-assistants|crewai|custom>; model=<model>; version=<v>; purpose=<rag|monitoring|research|digest>; contact=<url or mailto>
User-Agent: <agent>/<version> (+<contact url>)The same values work as plain query parameters, which is usually easier:
https://freenewsapi.ai/v1/search?q=climate&agent_name=newsbot&software=langchain&model=gpt-4oUnknown keys are ignored, so extra keys are always safe to send. Nothing is validated, nothing is throttled for omitting it, and the one instruction is firm: never put end-user personal data in these fields.
Against the Paid News APIs
The comparison pages on the site cover eleven competitors individually. The structural differences that survive all of them:
100 requests/day, 24-hour delay
The standard shape of a free news-API tier: a token bucket small enough to be a demo, with fresh articles held back for paying customers.
- Key required
- Daily cap
- Delayed articles
- Non-commercial only
No cap, no delay, no key
20 requests/second per IP is the only limit. The newest article is typically under two minutes old, and commercial use is allowed.
- No key, no signup
- No daily or monthly cap
- Continuous refresh
- Commercial use allowed
English-first, US-first
Most corpora are built from an English-language publisher list with the rest of the world appended.
- English dominant
- Thin non-Latin coverage
India > US, Turkish > German
Around 100 languages with six-figure volumes in Greek, Vietnamese, Persian, Ukrainian and Bulgarian.
- 100 countries
- ~100 languages
- 11,668 catalogued sources
What the paid services still give you that this does not: sentiment scores and entity extraction as standard fields, archives going back years, and a contract with an SLA behind it. Those are real, and if you need them you should buy them.
Recipes
A live country monitor
curl "https://freenewsapi.ai/v1/search?country=UA&lang=uk&date=today&sort=crawled&size=50"Is this story global or domestic?
curl "https://freenewsapi.ai/v1/trends/keywords?size=30"
# read `countries` on each keyword: 1 country = domestic, 70 = world eventGround a model in today's coverage, cheaply
# 1. count first
curl "https://freenewsapi.ai/v1/stats?q=semiconductor+export+controls&date=7d"
# 2. scan metadata
curl "https://freenewsapi.ai/v1/search?q=semiconductor+export+controls&date=7d&lang=en&size=20&sort=relevance"
# 3. fetch bodies for the three you picked
curl "https://freenewsapi.ai/v1/article?url=<exact-url>&full_text=true"Does coverage lead the price?
curl "https://freenewsapi.ai/v1/btc/correlation?interval=hour&max_shift=12"Turn a saved search into a feed
https://freenewsapi.ai/v1/rss?q=central+bank+rate&lang=en&date=24h&sort=date&size=50Find the outlets that matter in a market
curl "https://freenewsapi.ai/v1/stats?country=BR&date=30d&top=50"
# the `hosts` block is a ranked publisher list for that sliceThe Short Version
Free News API is full-text search over 21.5 million news articles from more than 25,000 publishers in 100 countries and roughly 100 languages, on a rolling ninety-day window, refreshed continuously, with no key, no signup and no quota beyond a per-IP rate limit. On top of the search sit live per-country story clustering across 115 countries, keyword analysis that separates world events from domestic ones, fourteen market instruments plotted against coverage volume, a seven-endpoint Bitcoin sentiment block, RSS/Atom/JSON syndication of any query, and a 28-tool MCP server generated from the service itself.
It documents its own error rates, exposes how every country value was derived, and publishes a page about what the data gets wrong. For an agent that needs to know what the world is saying — in Turkish, in Greek, in Hindi, right now — that combination is difficult to find at any price, and this one is free.
The search is AND across all terms. Use 2–5 keywords, not a natural-language question.
Free News API, on how to query it well
Start here: freenewsapi.ai · MCP at freenewsapi.ai/mcp · the entire manual as one file at /llms-full.txt.