Search articles with /v1/news/everything
Use /v1/news/everything to search the news archive. Filter by title, language, date, source, category, topic, industry, entity, sentiment, media, readability or location. You can sort results, browse pages, get counts by field, highlight matches and export data. Other article endpoints search a specific part of the same archive.
Each request costs 1 point. Using the prompt parameter adds 2 points for the translation step; prompt requires Basic or above.
Endpoint
GET /v1/news/everything
POST /v1/news/everythingBase URL: https://api.apitube.io. GET and POST return the same results. With GET, put filters in the URL. With POST, send them as JSON in the request body. Use POST for long values, such as a boolean query or a list of source IDs, to avoid URL length limits.
Authenticate with the X-API-Key header, an Authorization: Bearer header, or the api_key query parameter — see Authentication.
Parameters
All query and body parameters are optional. Without any filters the endpoint returns the most recent articles across all sources.
See Filters for the complete parameter reference: search filters, sorting, pagination, faceting, highlighting, field selection and export, with types, accepted values and examples.
Response format
Read articles from results and original article links from href. Use next_page and previous_page to navigate the results.
Response format describes the response envelope, article fields, facets, highlighting and export links.
Request examples
GET with query filters
curl "https://api.apitube.io/v1/news/everything?title=bitcoin&language.code=en&published_at.start=NOW-7DAYS&per_page=10&api_key=YOUR_API_KEY"
import requests
response = requests.get(
"https://api.apitube.io/v1/news/everything",
params={
"title": "bitcoin",
"language.code": "en",
"published_at.start": "NOW-7DAYS",
"per_page": 10,
},
headers={"X-API-Key": "YOUR_API_KEY"},
)
for article in response.json()["results"]:
print(article["published_at"], article["title"], article["href"])
const params = new URLSearchParams({
title: 'bitcoin',
'language.code': 'en',
'published_at.start': 'NOW-7DAYS',
per_page: '10'
});
const response = await fetch(`https://api.apitube.io/v1/news/everything?${params}`, {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const data = await response.json();
for (const article of data.results) {
console.log(article.published_at, article.title, article.href);
}
$query = http_build_query([
'title' => 'bitcoin',
'language.code' => 'en',
'published_at.start' => 'NOW-7DAYS',
'per_page' => 10,
'api_key' => 'YOUR_API_KEY',
]);
$data = json_decode(file_get_contents("https://api.apitube.io/v1/news/everything?$query"), true);
foreach ($data['results'] as $article) {
echo $article['published_at'], ' ', $article['title'], PHP_EOL;
}
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://api.apitube.io/v1/news/everything")
q := u.Query()
q.Set("title", "bitcoin")
q.Set("language.code", "en")
q.Set("published_at.start", "NOW-7DAYS")
q.Set("per_page", "10")
u.RawQuery = q.Encode()
req, _ := http.NewRequest("GET", u.String(), nil)
req.Header.Set("X-API-Key", "YOUR_API_KEY")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var data map[string]any
json.NewDecoder(resp.Body).Decode(&data)
fmt.Println(data["results"])
}
POST with a JSON body
curl -X POST "https://api.apitube.io/v1/news/everything" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "bitcoin AND NOT (etf OR futures)",
"language.code": "en",
"published_at.start": "NOW-7DAYS",
"sort.by": "published_at",
"per_page": 50
}'Excluding values
21 filters have an ignore.* version for excluding values. These cover titles, languages, sources, authors, categories, topics, industries, entity IDs and names, and event types. Combine them with other filters to include and exclude values in one request:
curl "https://api.apitube.io/v1/news/everything?category.id=medtop:04000000&ignore.source.domain=example.com&api_key=YOUR_API_KEY"Limits
per_pageis capped by plan (Free 10, Starter 50, Basic 200, Professional and Corporate 250) and the Free plan cannot go past page 5 — see Rate limits and quotas.- Limits on lists of values: most filters accept the first 3 values, including
source.domain,language.code,category.id,topic.id,industry.id,entity.id, the*.nameentity filters and theirignore.*versions.event.typeandarticle.idaccept 5. Extra values are ignored without an error. For example,source.domain=a.com,b.com,c.com,d.comsearches only the first three domains. Send another request for the rest. - The
promptparameter requires Basic or above; on Free and Starter it returns403 ER0706. Every other filter on this page works on every plan. - A title search (
title,title_starts_with,title_ends_with,title_pattern,query) is limited to a 31-daypublished_atwindow on every plan. A wider explicit range returns400 ER0110; no range at all searches the last 31 days and reportsER0366inmeta.warnings.
Errors
Errors follow the shared format and codes documented in HTTP response codes. The ones you are most likely to hit here:
| Code | Status | Meaning |
|---|---|---|
ER0110 | 400 | Title search requested over a window wider than 31 days |
ER0171 | 400 | per_page above the plan ceiling |
ER0173 | 400 | Page 6 or beyond on the Free plan |
ER0179 | 400 | The same parameter passed twice |
ER0175 | 401 | API key is missing or invalid |
ER0176 | 402 | No points left on the account |
ER0203 | 429 | Rate limit exceeded |
ER0706 | 403 | prompt used on a plan below Basic |
ER0701–ER0712 | 400 | Boolean query failed to parse |
Related
- Count articles — the same filters, returning only the total.
- Top headlines — the same filters, narrowed to current headlines.
- Parameters reference — syntax, edge cases and workflow examples for every filter family.