Building a news aggregator, content curation tool, or media monitoring app? News APIs let you access articles from thousands of sources worldwide. This guide compares the best free news APIs for developers in 2026.
Quick Comparison Table
| Provider | Free Tier | Rate Limit | Sources | Best For |
|---|---|---|---|---|
| NewsAPI | 100 req/day | Dev only | 80,000+ | Development |
| GNews | 100 req/day | 10/min | 60,000+ | Simple projects |
| Currents API | 600 req/day | - | 14,000+ | Global news |
| TheNewsAPI | 100 req/day | - | 50,000+ | Multi-language |
| Mediastack | 500 req/mo | - | 7,500+ | Budget apps |
| Newscatcher | 1000 req/mo | 1/sec | 70,000+ | Research |
| Google News RSS | Unlimited | - | RSS integration | |
| Bing News Search | 3 req/sec | 1000/mo | Bing | Microsoft users |
1. NewsAPI
NewsAPI is the most popular news API with access to over 80,000 news sources and blogs.
Free Tier:
- 100 requests/day
- Development use only
- Headlines and everything endpoints
- 1 month historical data
Key Features:
- 80,000+ sources
- Headlines and full search
- Source filtering
- Language support (14 languages)
- Country filtering
- Category filtering
JavaScript Example:
const axios = require('axios');
const NEWS_API_KEY = process.env.NEWS_API_KEY;
async function getTopHeadlines(options = {}) {
const {
country = 'us',
category = null,
sources = null,
q = null,
pageSize = 10
} = options;
const response = await axios.get('https://newsapi.org/v2/top-headlines', {
params: {
apiKey: NEWS_API_KEY,
country: sources ? undefined : country, // Can't use with sources
category,
sources,
q,
pageSize
}
});
return response.data.articles.map(article => ({
title: article.title,
description: article.description,
url: article.url,
image: article.urlToImage,
publishedAt: article.publishedAt,
source: article.source.name,
author: article.author
}));
}
// Get US tech headlines
const techNews = await getTopHeadlines({
country: 'us',
category: 'technology'
});
console.log(techNews);
Search Everything:
async function searchNews(query, options = {}) {
const {
from = null,
to = null,
language = 'en',
sortBy = 'publishedAt', // relevancy, popularity, publishedAt
pageSize = 10
} = options;
const response = await axios.get('https://newsapi.org/v2/everything', {
params: {
apiKey: NEWS_API_KEY,
q: query,
from,
to,
language,
sortBy,
pageSize
}
});
return response.data;
}
// Search for AI news from the last week
const aiNews = await searchNews('artificial intelligence', {
from: '2026-01-26',
sortBy: 'popularity'
});
Get Sources:
async function getSources(category = null, language = 'en', country = null) {
const response = await axios.get('https://newsapi.org/v2/sources', {
params: {
apiKey: NEWS_API_KEY,
category,
language,
country
}
});
return response.data.sources;
}
// Get tech sources
const techSources = await getSources('technology', 'en', 'us');
Note: Free tier is for development only. Production use requires a paid plan.
Best For: Development and prototyping news apps.
2. GNews API
GNews provides access to Google News articles with a simple API.
Free Tier:
- 100 requests/day
- 10 requests/minute
- Top headlines and search
- 10 articles per request
Key Features:
- Google News data
- Simple API
- Multi-language (40+)
- Topic filtering
- Country filtering
- Date filtering
JavaScript Example:
const GNEWS_API_KEY = process.env.GNEWS_API_KEY;
async function getGNewsHeadlines(options = {}) {
const {
topic = 'general', // world, nation, business, technology, entertainment, sports, science, health
country = 'us',
language = 'en',
max = 10
} = options;
const response = await axios.get('https://gnews.io/api/v4/top-headlines', {
params: {
apikey: GNEWS_API_KEY,
topic,
country,
lang: language,
max
}
});
return response.data.articles;
}
// Get technology headlines
const techNews = await getGNewsHeadlines({ topic: 'technology' });
Search Articles:
async function searchGNews(query, options = {}) {
const {
country = null,
language = 'en',
from = null,
to = null,
sortBy = 'publishedAt', // publishedAt, relevance
max = 10
} = options;
const response = await axios.get('https://gnews.io/api/v4/search', {
params: {
apikey: GNEWS_API_KEY,
q: query,
country,
lang: language,
from,
to,
sortby: sortBy,
max
}
});
return response.data.articles;
}
// Search for specific topic
const cryptoNews = await searchGNews('bitcoin cryptocurrency', {
from: '2026-01-01',
sortBy: 'relevance'
});
Best For: Simple news integrations with Google News data.
3. Currents API
Currents API provides global news from over 14,000 sources in 78 languages.
Free Tier:
- 600 requests/day
- Latest news endpoint
- Search endpoint
- All features included
Key Features:
- 14,000+ sources
- 78 languages
- Category filtering
- Region filtering
- Keyword search
- No attribution required
JavaScript Example:
const CURRENTS_API_KEY = process.env.CURRENTS_API_KEY;
async function getCurrentsNews(options = {}) {
const {
keywords = null,
language = 'en',
country = null,
category = null
} = options;
const response = await axios.get('https://api.currentsapi.services/v1/latest-news', {
params: {
apiKey: CURRENTS_API_KEY,
keywords,
language,
country,
category
}
});
return response.data.news;
}
// Get latest news with keywords
const news = await getCurrentsNews({
keywords: 'climate change',
language: 'en',
category: 'science'
});
Search Historical:
async function searchCurrentsNews(keywords, options = {}) {
const {
language = 'en',
country = null,
start_date = null,
end_date = null
} = options;
const response = await axios.get('https://api.currentsapi.services/v1/search', {
params: {
apiKey: CURRENTS_API_KEY,
keywords,
language,
country,
start_date,
end_date
}
});
return response.data.news;
}
Best For: Global news coverage with generous free tier.
4. TheNewsAPI
TheNewsAPI offers news from 50,000+ sources with excellent filtering options.
Free Tier:
- 100 requests/day
- All endpoints
- 3 articles per request
- 1 day historical data
Key Features:
- 50,000+ sources
- Multi-language support
- Sentiment analysis
- Similar articles
- Entity extraction
- Real-time updates
JavaScript Example:
const THE_NEWS_API_KEY = process.env.THE_NEWS_API_KEY;
async function getTheNewsAPIHeadlines(options = {}) {
const {
locale = 'us',
language = 'en',
categories = null, // business, entertainment, general, health, science, sports, tech
limit = 3
} = options;
const response = await axios.get('https://api.thenewsapi.com/v1/news/top', {
params: {
api_token: THE_NEWS_API_KEY,
locale,
language,
categories,
limit
}
});
return response.data.data;
}
// Get top headlines
const headlines = await getTheNewsAPIHeadlines({
categories: 'tech,business'
});
Search with Entities:
async function searchWithEntities(query, options = {}) {
const response = await axios.get('https://api.thenewsapi.com/v1/news/all', {
params: {
api_token: THE_NEWS_API_KEY,
search: query,
language: 'en',
...options
}
});
return response.data.data.map(article => ({
...article,
entities: article.entities, // People, organizations, locations mentioned
sentiment: article.sentiment
}));
}
Best For: News apps needing sentiment and entity data.
5. Mediastack
Mediastack provides real-time news from 7,500+ sources worldwide.
Free Tier:
- 500 requests/month
- Live news only
- Single country/source per request
- Standard support
Key Features:
- 7,500+ sources
- 50+ countries
- Category filtering
- Keyword search
- Date filtering
- Source filtering
JavaScript Example:
const MEDIASTACK_API_KEY = process.env.MEDIASTACK_API_KEY;
async function getMediastackNews(options = {}) {
const {
keywords = null,
countries = 'us',
categories = null,
languages = 'en',
limit = 25
} = options;
const response = await axios.get('http://api.mediastack.com/v1/news', {
params: {
access_key: MEDIASTACK_API_KEY,
keywords,
countries,
categories,
languages,
limit
}
});
return response.data.data;
}
// Get US business news
const businessNews = await getMediastackNews({
countries: 'us',
categories: 'business',
keywords: 'stocks'
});
Best For: Budget-friendly news integration.
6. Newscatcher API
Newscatcher is designed for research and media monitoring with extensive filtering.
Free Tier:
- 1000 requests/month
- 1 request/second
- Search and headlines
- All features
Key Features:
- 70,000+ sources
- Advanced search operators
- Clustering (similar articles)
- Authors extraction
- NLP enrichment
- 100+ languages
JavaScript Example:
const NEWSCATCHER_API_KEY = process.env.NEWSCATCHER_API_KEY;
async function searchNewscatcher(query, options = {}) {
const {
lang = 'en',
countries = null,
topic = null,
from = null,
to = null,
page_size = 10
} = options;
const response = await axios.get('https://api.newscatcherapi.com/v2/search', {
params: {
q: query,
lang,
countries,
topic,
from_,
to_,
page_size
},
headers: {
'x-api-key': NEWSCATCHER_API_KEY
}
});
return response.data.articles;
}
// Advanced search with operators
const news = await searchNewscatcher(
'"artificial intelligence" AND (startup OR funding)',
{
lang: 'en',
topic: 'tech',
from: '2026-01-01'
}
);
Get Latest Headlines:
async function getNewscatcherHeadlines(options = {}) {
const {
lang = 'en',
countries = 'US',
topic = 'tech'
} = options;
const response = await axios.get('https://api.newscatcherapi.com/v2/latest_headlines', {
params: {
lang,
countries,
topic
},
headers: {
'x-api-key': NEWSCATCHER_API_KEY
}
});
return response.data.articles;
}
Best For: Research and media monitoring applications.
7. Google News RSS
Free access to Google News via RSS feeds. No API key required!
Free Tier:
- Unlimited requests
- No API key needed
- RSS/Atom format
- Topic and search feeds
JavaScript Example:
const Parser = require('rss-parser');
const parser = new Parser();
async function getGoogleNewsRSS(query = null, topic = null) {
let url;
if (query) {
// Search URL
url = `https://news.google.com/rss/search?q=${encodeURIComponent(query)}&hl=en-US&gl=US&ceid=US:en`;
} else if (topic) {
// Topic URL (WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SPORTS, SCIENCE, HEALTH)
url = `https://news.google.com/rss/headlines/section/topic/${topic}?hl=en-US&gl=US&ceid=US:en`;
} else {
// Top stories
url = 'https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en';
}
const feed = await parser.parseURL(url);
return feed.items.map(item => ({
title: item.title,
link: item.link,
pubDate: item.pubDate,
source: item.source,
content: item.content
}));
}
// Get top stories
const topStories = await getGoogleNewsRSS();
// Get technology news
const techNews = await getGoogleNewsRSS(null, 'TECHNOLOGY');
// Search for specific topic
const aiNews = await getGoogleNewsRSS('artificial intelligence');
With Caching:
const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: 300 }); // 5 minute cache
async function getCachedGoogleNews(query, topic) {
const cacheKey = `gnews:${query || ''}:${topic || ''}`;
let news = cache.get(cacheKey);
if (news) return news;
news = await getGoogleNewsRSS(query, topic);
cache.set(cacheKey, news);
return news;
}
Best For: Free unlimited access to Google News.
8. Bing News Search API
Bing News Search is part of Microsoft's Cognitive Services with powerful search capabilities.
Free Tier:
- 1000 transactions/month
- 3 requests/second
- All search features
- Image thumbnails
Key Features:
- Bing's news index
- Trending topics
- Category filtering
- Image/video news
- Freshness control
- Market filtering
JavaScript Example:
const BING_API_KEY = process.env.BING_API_KEY;
async function searchBingNews(query, options = {}) {
const {
count = 10,
mkt = 'en-US',
freshness = null, // Day, Week, Month
category = null
} = options;
const response = await axios.get('https://api.bing.microsoft.com/v7.0/news/search', {
params: {
q: query,
count,
mkt,
freshness,
category
},
headers: {
'Ocp-Apim-Subscription-Key': BING_API_KEY
}
});
return response.data.value;
}
// Search news
const news = await searchBingNews('electric vehicles', {
freshness: 'Week',
count: 20
});
Get Trending Topics:
async function getTrendingTopics(market = 'en-US') {
const response = await axios.get('https://api.bing.microsoft.com/v7.0/news/trendingtopics', {
params: { mkt: market },
headers: {
'Ocp-Apim-Subscription-Key': BING_API_KEY
}
});
return response.data.value;
}
Best For: Microsoft ecosystem integration.
Building a News Aggregator API
Complete example combining multiple sources:
const express = require('express');
const NodeCache = require('node-cache');
const app = express();
const cache = new NodeCache({ stdTTL: 300 });
// Unified news interface
async function fetchFromSource(source, query, options) {
switch (source) {
case 'newsapi':
return fetchNewsAPI(query, options);
case 'gnews':
return fetchGNews(query, options);
case 'google':
return fetchGoogleRSS(query, options);
default:
throw new Error('Unknown source');
}
}
// Aggregate from multiple sources
async function aggregateNews(query, sources = ['google', 'gnews']) {
const cacheKey = `agg:${query}:${sources.join(',')}`;
let cached = cache.get(cacheKey);
if (cached) return cached;
const results = await Promise.allSettled(
sources.map(source => fetchFromSource(source, query, {}))
);
// Combine and deduplicate
const allArticles = results
.filter(r => r.status === 'fulfilled')
.flatMap(r => r.value);
// Remove duplicates by title similarity
const unique = deduplicateArticles(allArticles);
// Sort by date
unique.sort((a, b) => new Date(b.publishedAt) - new Date(a.publishedAt));
cache.set(cacheKey, unique);
return unique;
}
// Simple deduplication
function deduplicateArticles(articles) {
const seen = new Set();
return articles.filter(article => {
const key = article.title.toLowerCase().slice(0, 50);
if (seen.has(key)) return false;
seen.add(key);
return true;
});
}
// API endpoints
app.get('/api/news/search', async (req, res) => {
try {
const { q, sources } = req.query;
const news = await aggregateNews(q, sources?.split(','));
res.json({ articles: news });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get('/api/news/headlines', async (req, res) => {
try {
const { category } = req.query;
const news = await aggregateNews(category || 'top news');
res.json({ articles: news.slice(0, 20) });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000);
Choosing the Right News API
| Need | Recommended |
|---|---|
| Development/prototyping | NewsAPI |
| Unlimited free access | Google News RSS |
| Global coverage | Currents API |
| Simple integration | GNews |
| Research/monitoring | Newscatcher |
| Budget-friendly | Mediastack |
| Microsoft ecosystem | Bing News |
| Sentiment analysis | TheNewsAPI |
Best Practices
1. Implement Caching
News doesn't change every second. Cache responses:
const cache = new NodeCache({ stdTTL: 300 }); // 5 minutes
async function getCachedNews(key, fetcher) {
let data = cache.get(key);
if (!data) {
data = await fetcher();
cache.set(key, data);
}
return data;
}
2. Handle Rate Limits
const Bottleneck = require('bottleneck');
const limiter = new Bottleneck({
reservoir: 100, // 100 requests
reservoirRefreshAmount: 100,
reservoirRefreshInterval: 24 * 60 * 60 * 1000, // per day
maxConcurrent: 1,
minTime: 100 // 100ms between requests
});
const rateLimitedFetch = limiter.wrap(fetchNews);
3. Fallback Sources
async function getNewsWithFallback(query) {
const sources = ['newsapi', 'gnews', 'google'];
for (const source of sources) {
try {
return await fetchFromSource(source, query);
} catch (error) {
console.log(`${source} failed, trying next...`);
}
}
throw new Error('All news sources failed');
}
Conclusion
For development, NewsAPI offers the best features but restricts production use. Google News RSS is completely free with unlimited access. For production apps, GNews or Currents API provide good free tiers with reasonable limits.
Consider combining multiple sources for better coverage and reliability.
Related Resources: