Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.1.0
info:
title: APITube News API
version: 1.0.0
summary: Search and filter news articles from thousands of sources worldwide.
description: 'APITube News API provides programmatic access to a comprehensive, real-time news database
aggregated from thousands of sources worldwide. Use it to search, filter, and retrieve news articles
with advanced query capabilities.
## Key Endpoints
- **Everything** (`/v1/news/everything`) — full-text search across all indexed articles with filters
by title, date range, language, country, source, sentiment, category, topic, industry, and named entities
(people, organizations, locations, brands, etc.).
- **Top Headlines** (`/v1/news/top-headlines`) — breaking and trending news from high-authority sources
ranked by OPR score.
- **Story** (`/v1/news/story/{articleId}`) — retrieve related articles for a given story.
- **Article** (`/v1/news/article`) — fetch one or more articles by ID.
- **Dictionaries** — list available categories, topics, industries, and entities.
- **Trends** — discover trending topics and entities over time.
- **Stream** (`/v1/news/stream`) — real-time Server-Sent Events (SSE) stream of new articles.
- **Webhooks** — subscribe to push notifications for new articles matching your filters.
## Export Formats
JSON (default), CSV, TSV, XML, RSS, XLSX, Parquet, JSONL, and NDJSON.
## Authentication
All requests require an API key passed via the `X-API-Key` header or the `api_key` query parameter.'
contact:
name: APITube Support
url: https://apitube.io
email: support@apitube.io
termsOfService: https://apitube.io/terms/terms-of-service
components:
securitySchemes:
ApiKeyHeader:
type: apiKey
in: header
name: X-API-Key
description: API key passed via X-API-Key header
ApiKeyQuery:
type: apiKey
in: query
name: api_key
description: API key passed as query parameter
schemas: {}
paths:
/ping:
get:
summary: Ping (Health Check)
tags:
- System
description: Returns "pong" if the server is running.
responses:
'200':
description: Server is healthy
content:
application/json:
schema:
description: Server is healthy
type: string
example: pong
/v1/balance:
get:
summary: Get API key balance
tags:
- Account
description: Returns the current balance and plan information for the provided API key.
responses:
'200':
description: API key balance information
content:
application/json:
schema:
description: API key balance information
type: object
properties:
api_key:
type: string
description: The API key
points:
type: integer
description: Remaining points
plan:
type: string
description: Subscription plan name
example:
api_key: ak_live_abc123...
points: 48500
plan: professional
'400':
description: API key is required
content:
application/json:
schema:
description: API key is required
type: object
properties:
status:
type: string
enum:
- not_ok
description: Response status
request_id:
type:
- 'null'
- string
description: Unique request identifier
errors:
type: array
items:
type: object
properties:
status:
type: integer
description: HTTP status code
code:
type: string
description: Error code (e.g. ER0201)
message:
type: string
description: Human-readable error message
links:
type: object
properties:
about:
type: string
description: Link to error documentation
timestamp:
type: string
format: date-time
description: Error timestamp
example:
status: not_ok
request_id: req_abc123def456
errors:
- status: 401
code: ER0201
message: Invalid or missing API key.
links:
about: https://docs.apitube.io/platform/news-api/http-response-codes
timestamp: '2026-03-23T14:30:00Z'
'401':
description: Invalid API key
content:
application/json:
schema:
description: Invalid API key
type: object
properties:
status:
type: string
enum:
- not_ok
description: Response status
request_id:
type:
- 'null'
- string
description: Unique request identifier
errors:
type: array
items:
type: object
properties:
status:
type: integer
description: HTTP status code
code:
type: string
description: Error code (e.g. ER0201)
message:
type: string
description: Human-readable error message
links:
type: object
properties:
about:
type: string
description: Link to error documentation
timestamp:
type: string
format: date-time
description: Error timestamp
example:
status: not_ok
request_id: req_abc123def456
errors:
- status: 401
code: ER0201
message: Invalid or missing API key.
links:
about: https://docs.apitube.io/platform/news-api/http-response-codes
timestamp: '2026-03-23T14:30:00Z'
/v1/news/everything:
post:
summary: Search all news articles
tags:
- News
description: Search and filter news articles from thousands of sources worldwide. Supports advanced
filtering by title, date, language, source, category, topic, industry, entity, sentiment, readability,
media, location, and more. Results can be exported in multiple formats (CSV, TSV, XML, RSS, XLSX,
Parquet, JSONL).
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
prompt:
type: string
minLength: 3
maxLength: 500
description: 'Plain-language description of the news you want, e.g. "Elon Musk, Tesla,
news for the last 10 days". It is translated into the regular filters below before
the search runs, and the resulting parameters are returned in meta.prompt. Explicit
parameters always win over the prompt. Costs 2 extra points when the wording has not
been parsed before (repeats are served from cache). Available on Basic and above —
on Free and Starter the request fails with 403 ER0706. Errors: ER0706 (plan), ER0800
(length), ER0801 (translation service unavailable), ER0802 (nothing usable in the
prompt).'
page:
type: integer
minimum: 1
default: 1
description: Page number for pagination
per_page:
type: integer
minimum: 1
maximum: 250
default: 100
description: Number of results per page (max 250; the Free plan is capped at 10 and
Starter at 50)
sort.by:
type: string
enum:
- published_at
- relevance
- engagement
- quality
- controversy
- trust
- id
- new
- created_at
- source.rank.opr
- sentiment.overall.score
- sentiment.title.score
- sentiment.body.score
- read_time
- sentences_count
- paragraphs_count
- characters_count
- media.images.count
- media.videos.count
- media.images.width.min
- media.images.width.max
- media.images.height.min
- media.images.height.max
- media_richness
- shares.facebook.min
- shares.facebook.max
- shares.twitter.min
- shares.twitter.max
- shares.reddit.min
- shares.reddit.max
default: published_at
description: Field to sort results by
sort.order:
type: string
enum:
- asc
- desc
default: desc
description: Sort order
article.id:
type: string
description: Comma-separated article IDs (max 5)
example: '12345'
title:
type: string
minLength: 2
maxLength: 100
description: 'Search in article titles. Supports phrase search with proximity: "climate
change"~2. Title search is limited to a 31-day published_at window: without published_at.start
/ published_at.end the last 31 days are searched, a wider explicit range returns ER0110.'
ignore.title:
type: string
minLength: 2
maxLength: 100
description: Exclude articles containing this text in the title
title_starts_with:
type: string
minLength: 2
maxLength: 100
description: Filter articles whose title starts with the given text. Same 31-day window
limit as title
title_ends_with:
type: string
minLength: 2
maxLength: 100
description: Filter articles whose title ends with the given text. Same 31-day window
limit as title
title_pattern:
type: string
minLength: 2
maxLength: 200
description: Filter articles whose title matches the given pattern. Same 31-day window
limit as title
published_at:
type: string
description: 'Exact date (creates 24-hour range). Format: YYYY-MM-DD or ISO 8601'
example: '2025-01-15'
published_at.start:
type: string
description: 'Start of date range. Format: YYYY-MM-DD or ISO 8601. Combined with a title
search the range may not exceed 31 days (ER0110)'
example: '2025-01-01'
published_at.end:
type: string
description: 'End of date range. Format: YYYY-MM-DD or ISO 8601. Combined with a title
search the range may not exceed 31 days (ER0110)'
example: '2025-01-31'
language.code:
type: string
description: Comma-separated ISO 639-1 language codes (max 3)
example: en
ignore.language.code:
type: string
description: Exclude articles in these languages (comma-separated, max 3)
example: zh,ar
source.country.code:
type: string
description: Filter by source country ISO 3166-1 alpha-2 codes (comma-separated, max
3)
example: us
ignore.source.country.code:
type: string
description: Exclude sources from these countries (comma-separated, max 3)
example: us
source.rank.opr.min:
type: integer
minimum: 0
description: Minimum Open PageRank score
source.rank.opr.max:
type: integer
minimum: 0
description: Maximum Open PageRank score
source.id:
type: string
description: Comma-separated source IDs (max 3)
example: '100'
ignore.source.id:
type: string
description: Exclude these source IDs (comma-separated, max 3)
source.domain:
type: string
description: Comma-separated source domains (max 3)
example: nytimes.com
ignore.source.domain:
type: string
description: Exclude these source domains (comma-separated, max 3)
source.bias:
type: string
description: 'Filter by media bias (comma-separated). Values: left, center, right'
example: left
ignore.source.bias:
type: string
description: 'Exclude sources with this media bias (comma-separated). Values: left,
center, right'
example: right
is_premium_source:
type: integer
enum:
- 0
- 1
description: Filter by premium source status
is_verified_source:
type: integer
enum:
- 0
- 1
description: Filter by verified source status
category.id:
type: string
description: Comma-separated category IDs (max 3)
example: iab-1
ignore.category.id:
type: string
description: Exclude these categories (comma-separated, max 3)
topic.id:
type: string
description: Comma-separated topic IDs (max 3)
example: technology
ignore.topic.id:
type: string
description: Exclude these topics (comma-separated, max 3)
industry.id:
type: string
description: Comma-separated industry IDs (max 3)
example: '1'
ignore.industry.id:
type: string
description: Exclude these industries (comma-separated, max 3)
entity.id:
type: string
description: Comma-separated entity IDs (max 3)
example: '12345'
ignore.entity.id:
type: string
description: Exclude these entity IDs (comma-separated, max 3)
entity.sentiment.polarity:
type: string
enum:
- positive
- negative
- neutral
description: Filter by sentiment polarity toward the entity (combine with entity.id
or *.name; standalone = any entity)
entity.sentiment.score.min:
type: number
minimum: -1
maximum: 1
description: Minimum sentiment score toward the entity
entity.sentiment.score.max:
type: number
minimum: -1
maximum: 1
description: Maximum sentiment score toward the entity
person.name:
type: string
maxLength: 120
description: Filter by person name (comma-separated, max 3)
example: Elon Musk
ignore.person.name:
type: string
maxLength: 120
description: Exclude articles mentioning these persons (comma-separated, max 3)
organization.name:
type: string
maxLength: 120
description: Filter by organization name (comma-separated, max 3)
example: Google
ignore.organization.name:
type: string
maxLength: 120
description: Exclude articles mentioning these organizations (comma-separated, max 3)
location.name:
type: string
maxLength: 120
description: Filter by location name (comma-separated, max 3)
example: New York
ignore.location.name:
type: string
maxLength: 120
description: Exclude articles mentioning these locations (comma-separated, max 3)
brand.name:
type: string
maxLength: 120
description: Filter by brand name (comma-separated, max 3)
ignore.brand.name:
type: string
maxLength: 120
description: Exclude articles mentioning these brands (comma-separated, max 3)
disaster.name:
type: string
maxLength: 120
description: Filter by natural disaster name (comma-separated, max 3)
ignore.disaster.name:
type: string
maxLength: 120
description: Exclude articles mentioning these disasters (comma-separated, max 3)
disease.name:
type: string
maxLength: 120
description: Filter by disease name (comma-separated, max 3)
ignore.disease.name:
type: string
maxLength: 120
description: Exclude articles mentioning these diseases (comma-separated, max 3)
event.name:
type: string
maxLength: 120
description: Filter by event name (comma-separated, max 3)
ignore.event.name:
type: string
maxLength: 120
description: Exclude articles mentioning these events (comma-separated, max 3)
sport.name:
type: string
maxLength: 120
description: Filter by sport name (comma-separated, max 3)
ignore.sport.name:
type: string
maxLength: 120
description: Exclude articles mentioning these sports (comma-separated, max 3)
event.type:
type: string
description: 'Comma-separated event types (max 5). Values: merger-acquisition, ipo,
layoffs, bankruptcy, product-launch, funding-round, earnings, partnership, executive-change,
lawsuit, data-breach, recall, expansion, closure, stock-movement, contract-award,
spin-off, regulatory-action, election, protest, crime, terrorism, accident, policy-change,
scandal, death, award-ceremony, conflict, diplomacy, health-crisis, migration, human-rights,
earthquake, hurricane, flood, wildfire, tornado, tsunami, volcanic-eruption, drought,
climate-event, pollution, wildlife-event, avalanche'
example: ipo
event.category:
type: string
enum:
- business
- society
- environment
description: Filter by event category
ignore.event.type:
type: string
description: Exclude these event types (comma-separated, max 5)
sentiment.overall.score:
type: number
minimum: -1
maximum: 1
description: Exact overall sentiment score
sentiment.overall.score.min:
type: number
minimum: -1
maximum: 1
description: Minimum overall sentiment score
sentiment.overall.score.max:
type: number
minimum: -1
maximum: 1
description: Maximum overall sentiment score
sentiment.overall.polarity:
type: string
enum:
- positive
- negative
- neutral
description: Overall sentiment polarity
sentiment.title.score:
type: number
minimum: -1
maximum: 1
description: Exact title sentiment score
sentiment.title.score.min:
type: number
minimum: -1
maximum: 1
description: Minimum title sentiment score
sentiment.title.score.max:
type: number
minimum: -1
maximum: 1
description: Maximum title sentiment score
sentiment.title.polarity:
type: string
enum:
- positive
- negative
- neutral
description: Title sentiment polarity
sentiment.body.score:
type: number
minimum: -1
maximum: 1
description: Exact body sentiment score
sentiment.body.score.min:
type: number
minimum: -1
maximum: 1
description: Minimum body sentiment score
sentiment.body.score.max:
type: number
minimum: -1
maximum: 1
description: Maximum body sentiment score
sentiment.body.polarity:
type: string
enum:
- positive
- negative
- neutral
description: Body sentiment polarity
sentiment.mixed:
type: integer
enum:
- 0
- 1
description: Filter for mixed sentiment (title polarity != body polarity)
sentiment.consistent:
type: integer
enum:
- 0
- 1
description: Filter for consistent sentiment (title polarity == body polarity)
is_clickbait:
type: integer
enum:
- 0
- 1
description: Filter by clickbait detection
sentiment_gap.min:
type: number
minimum: 0
maximum: 2
description: Minimum sentiment gap between title and body
sentiment_gap.max:
type: number
minimum: 0
maximum: 2
description: Maximum sentiment gap between title and body
media.images.count:
type: integer
minimum: 0
description: Exact number of images
media.images.count.min:
type: integer
minimum: 0
description: Minimum number of images
media.images.count.max:
type: integer
minimum: 0
description: Maximum number of images
media.images.width.min:
type: integer
minimum: 0
description: Minimum image width in pixels
media.images.width.max:
type: integer
minimum: 0
description: Maximum image width in pixels
media.images.height.min:
type: integer
minimum: 0
description: Minimum image height in pixels
media.images.height.max:
type: integer
minimum: 0
description: Maximum image height in pixels
media.videos.count:
type: integer
minimum: 0
description: Exact number of videos
media.videos.count.min:
type: integer
minimum: 0
description: Minimum number of videos
media.videos.count.max:
type: integer
minimum: 0
description: Maximum number of videos
has_image:
type: integer
enum:
- 0
- 1
description: Filter articles with/without images
has_video:
type: integer
enum:
- 0
- 1
description: Filter articles with/without videos
has_hq_images:
type: integer
enum:
- 0
- 1
description: Filter articles with high-quality images (>= 1200px width)
is_media_rich:
type: integer
enum:
- 0
- 1
description: Filter articles with both images and videos
is_landscape_media:
type: integer
enum:
- 0
- 1
description: Filter articles with landscape-oriented media
is_portrait_media:
type: integer
enum:
- 0
- 1
description: Filter articles with portrait-oriented media
has_multiple_images:
type: integer
enum:
- 0
- 1
description: Filter articles with 2+ images
has_fullhd_images:
type: integer
enum:
- 0
- 1
description: Filter articles with Full HD images (>= 1920px width)
has_4k_images:
type: integer
enum:
- 0
- 1
description: Filter articles with 4K images (>= 3840px width)
has_mobile_optimized_images:
type: integer
enum:
- 0
- 1
description: Filter articles with mobile-optimized images (320-800px width)
is_instagram_ready:
type: integer
enum:
- 0
- 1
description: Filter articles with Instagram-ready images (>= 1080px + aspect ratio)
is_twitter_card_ready:
type: integer
enum:
- 0
- 1
description: Filter articles with Twitter Card-ready images (>= 800px + landscape)
has_consistent_image_sizes:
type: integer
enum:
- 0
- 1
description: Filter articles with consistent image dimensions
has_thumbnail:
type: integer
enum:
- 0
- 1
description: Filter articles with thumbnail images (<= 300px width)
has_social_share_image:
type: integer
enum:
- 0
- 1
description: Filter articles with social share images (>= 1200x630px)
has_mixed_media:
type: integer
enum:
- 0
- 1
description: Filter articles with both image and video media types
readability.fk_grade:
type: number
minimum: 0
maximum: 30
description: Exact Flesch-Kincaid grade level
readability.fk_grade.min:
type: number
minimum: 0
maximum: 30
description: Minimum Flesch-Kincaid grade level
readability.fk_grade.max:
type: number
minimum: 0
maximum: 30
description: Maximum Flesch-Kincaid grade level
readability.ease:
type: number
minimum: 0
maximum: 100
description: Exact Flesch Reading Ease score
readability.ease.min:
type: number
minimum: 0
maximum: 100
description: Minimum Flesch Reading Ease score
readability.ease.max:
type: number
minimum: 0
maximum: 100
description: Maximum Flesch Reading Ease score
readability.ari:
type: number
minimum: 0
maximum: 30
description: Exact Automated Readability Index
readability.ari.min:
type: number
minimum: 0
maximum: 30
description: Minimum Automated Readability Index
readability.ari.max:
type: number
minimum: 0
maximum: 30
description: Maximum Automated Readability Index
readability.difficulty:
type: string
enum:
- beginner
- intermediate
- advanced
- expert
description: Difficulty level
readability.audience:
type: string
enum:
- children
- general
- professional
- academic
description: Target audience
readability.age:
type: integer
# --- truncated at 32 KB (860 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/apitube/refs/heads/main/openapi/apitube-news-api-openapi.yml