Raw Articles
Use /v1/news/raw for the earliest available articles in a basic format. Choose it if you want to process and analyse article content yourself.
Raw articles include a title, link, body, author, original categories and publisher details when available. They do not include detected language, APITube categories, topics, entities, industries or sentiment.
Sign up at APITube to get your API key. Include it with every API request.
This endpoint only returns articles from roughly the last 24 hours. Use /v1/news/everything to search the full archive.
Endpoint
GET /v1/news/raw
POST /v1/news/rawGET and POST return the same results. Send filters in the URL with GET or as JSON in the request body with POST.
Query Parameters
Only the parameters below are supported by this endpoint. For the full search filter set, use Search articles with Filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | No | Describe the news you want. On this endpoint, the prompt can only set published_at.start, published_at.end, sort.order and per_page. Other filters appear in meta.prompt.ignored with reason unsupported_on_endpoint. A new translation costs 2 extra points. Requires Basic or above; Free and Starter return 403 ER0706. Range: 3–500 characters. |
published_at | string | No | Search one day (a 24-hour range). Accepts ISO 8601, YYYY-MM-DD or relative dates. Example: 2026-05-27. |
published_at.end | string | No | End of the publication date range. Example: 2026-05-27. |
published_at.start | string | No | Start of the publication date range. Example: 2026-05-26. |
ignore.source.id | string | No | Comma-separated source IDs to exclude (max 3). Example: 789. |
source.id | string | No | Source IDs, separated by commas (max 3). Example: 123. |
sort.by | string | No | Sort field (default id). One of: id, published_at, created_at. Example: id. |
sort.order | string | No | Sort direction (default desc). One of: asc, desc. Example: desc. |
page | integer | No | Page number (default 1). Example: 1. |
per_page | integer | No | Results per page (default 100, max 250; Free is capped at 10, Starter at 50, Basic at 200). Example: 100. |
promptsupports only some filters here. On Basic and above,promptcan setpublished_at.start,published_at.end,sort.orderandper_page. Free and Starter return403 ER0706. Other generated filters appear inmeta.prompt.ignoredwithreason: unsupported_on_endpoint. An uncached translation still costs 2 points. To avoid this charge, send the date range directly.
Most search filters are unavailable here. This includes
title,language.code,category.*,topic.*,entity.*,industry.*,sentiment.*and media filters. Use/v1/news/everythingif you need these filters.
Each request costs 1 point (charged only when the response contains at least one article).
Response Format
{
"status": "ok",
"limit": 100,
"path": "https://api.apitube.io/v1/news/raw?page=1&per_page=100",
"page": 1,
"has_next_pages": true,
"next_page": "https://api.apitube.io/v1/news/raw?page=2&per_page=100",
"has_previous_page": false,
"previous_page": "",
"request_id": "string",
"results": [
{
"id": 0,
"title": "string",
"href": "string",
"created_at": "string",
"description": "string",
"body": "string",
"body_html": "string",
"author": "string",
"keywords": ["string"],
"source": {
"id": 0,
"domain": "string",
"home_page_url": "string",
"type": "string",
"bias": "string",
"rankings": { "opr": 0 },
"location": { "country_name": "string", "country_code": "string" },
"favicon": "string"
}
}
]
}Unlike /v1/news/everything, the raw response has no export block — bulk export formats are not available for this endpoint.
Response Fields
| Field | Type | Description |
|---|---|---|
status | string | Always ok on success. |
limit | integer | Number of results per page. |
page | integer | Current page number. |
has_next_pages | boolean | Whether more pages exist. |
next_page | string | URL for the next page (empty if none). |
has_previous_page | boolean | Whether a previous page exists. |
previous_page | string | URL for the previous page (empty if none). |
request_id | string | Unique identifier for the request. |
results | array | Array of raw article objects (see below). |
Each item in results:
| Field | Type | Description |
|---|---|---|
id | integer | Raw article id. |
title | string | null | Article title. |
href | string | null | Article URL. |
created_at | string | null | Publication date (may be null). |
description | string | null | Short description. |
body | string | Article body with HTML stripped (plain text). |
body_html | string | Article body as received from the feed (HTML preserved). |
author | string | null | Author. |
keywords | array | null | Raw categories/keywords. |
source | object | Publisher details. |
source.id | integer | null | Source ID. |
source.domain | string | Source domain. |
source.home_page_url | string | Source home page URL. |
source.type | string | Source resource type. |
source.bias | string | Political bias (left / center / right). |
source.rankings.opr | number | null | Open PageRank score. |
source.location.country_name | string | Source country name. |
source.location.country_code | string | Source country ISO code. |
source.favicon | string | Favicon URL. |
The body / body_html pair mirrors /v1/news/everything: body is the plain-text version (HTML removed and whitespace collapsed), while body_html keeps the original HTML markup.
Request Examples
GET with query filters
curl "https://api.apitube.io/v1/news/raw?source.id=1024&per_page=5&api_key=YOUR_API_KEY"
import requests
resp = requests.get(
"https://api.apitube.io/v1/news/raw",
params={"source.id": 1024, "per_page": 5, "api_key": "YOUR_API_KEY"},
)
print(resp.json())
const params = new URLSearchParams({ "source.id": "1024", per_page: "5", api_key: "YOUR_API_KEY" });
const resp = await fetch(`https://api.apitube.io/v1/news/raw?${params}`);
console.log(await resp.json());
$query = http_build_query(["source.id" => 1024, "per_page" => 5, "api_key" => "YOUR_API_KEY"]);
$data = json_decode(file_get_contents("https://api.apitube.io/v1/news/raw?$query"), true);
print_r($data);
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
u, _ := url.Parse("https://api.apitube.io/v1/news/raw")
q := u.Query()
q.Set("source.id", "1024")
q.Set("per_page", "5")
q.Set("api_key", "YOUR_API_KEY")
u.RawQuery = q.Encode()
resp, _ := http.Get(u.String())
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var data map[string]any
json.Unmarshal(body, &data)
fmt.Println(data)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.apitube.io/v1/news/raw?source.id=1024&per_page=5&api_key=YOUR_API_KEY"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
Write a script in your preferred language that calls the APITube News API:
GET https://api.apitube.io/v1/news/raw?source.id=1024&per_page=5
Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/everything
POST with JSON body
curl -X POST "https://api.apitube.io/v1/news/raw" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"published_at.start": "NOW-1DAY",
"published_at.end": "NOW",
"sort.by": "published_at",
"sort.order": "desc",
"per_page": 5
}'
import requests
resp = requests.post(
"https://api.apitube.io/v1/news/raw",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"published_at.start": "NOW-1DAY",
"published_at.end": "NOW",
"sort.by": "published_at",
"sort.order": "desc",
"per_page": 5,
},
)
print(resp.json())
const resp = await fetch("https://api.apitube.io/v1/news/raw", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
"published_at.start": "NOW-1DAY",
"published_at.end": "NOW",
"sort.by": "published_at",
"sort.order": "desc",
per_page: 5,
}),
});
console.log(await resp.json());
$ch = curl_init("https://api.apitube.io/v1/news/raw");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["X-API-Key: YOUR_API_KEY", "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"published_at.start" => "NOW-1DAY",
"published_at.end" => "NOW",
"sort.by" => "published_at",
"sort.order" => "desc",
"per_page" => 5,
]),
]);
$data = json_decode(curl_exec($ch), true);
print_r($data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload, _ := json.Marshal(map[string]any{
"published_at.start": "NOW-1DAY",
"published_at.end": "NOW",
"sort.by": "published_at",
"sort.order": "desc",
"per_page": 5,
})
req, _ := http.NewRequest("POST", "https://api.apitube.io/v1/news/raw", bytes.NewBuffer(payload))
req.Header.Set("X-API-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var data map[string]any
json.Unmarshal(body, &data)
fmt.Println(data)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
String payload = "{\"published_at.start\": \"NOW-1DAY\", \"published_at.end\": \"NOW\", \"sort.by\": \"published_at\", \"sort.order\": \"desc\", \"per_page\": 5}";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.apitube.io/v1/news/raw"))
.header("X-API-Key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
Write a script in your preferred language that calls the APITube News API:
POST https://api.apitube.io/v1/news/raw
Body (JSON):
{
"published_at.start": "NOW-1DAY",
"published_at.end": "NOW",
"sort.by": "published_at",
"sort.order": "desc",
"per_page": 5
}
Read the API key from an environment variable (do not hardcode it), handle request
errors, and print the key fields of each result.
Docs: https://docs.apitube.io/platform/news-api/everything
Using Bearer token
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.apitube.io/v1/news/raw?source.id=1024"Response Example
{
"status": "ok",
"limit": 2,
"path": "https://api.apitube.io/v1/news/raw?per_page=2",
"page": 1,
"has_next_pages": true,
"next_page": "https://api.apitube.io/v1/news/raw?page=2&per_page=2",
"has_previous_page": false,
"previous_page": "",
"request_id": "req_def456ghi789",
"results": [
{
"id": 84512377,
"title": "AI advances reshape the chip industry in 2026",
"href": "https://example.com/ai-advances-2026",
"created_at": "2026-05-27 08:00:00",
"description": "A look at how new accelerators are changing the market.",
"body": "The field of artificial intelligence continues to move quickly...",
"body_html": "<p>The field of artificial intelligence continues to move quickly...</p>",
"author": "Jane Doe",
"keywords": ["technology", "ai", "semiconductors"],
"source": {
"id": 1024,
"domain": "example.com",
"home_page_url": "https://example.com",
"type": "news",
"bias": "center",
"rankings": { "opr": 6 },
"location": { "country_name": "United States", "country_code": "us" },
"favicon": "https://www.google.com/s2/favicons?domain=https://example.com"
}
},
{
"id": 84512376,
"title": "Tech company announces AI partnership",
"href": "https://news.example.org/ai-partnership",
"created_at": "2026-05-27 07:15:00",
"description": "Two firms join forces on model infrastructure.",
"body": "A major technology company announced today...",
"body_html": "<p>A major technology company announced today...</p>",
"author": null,
"keywords": ["business", "ai"],
"source": {
"id": 2048,
"domain": "news.example.org",
"home_page_url": "https://news.example.org",
"type": "news",
"bias": "left",
"rankings": { "opr": 4 },
"location": { "country_name": "United Kingdom", "country_code": "gb" },
"favicon": "https://www.google.com/s2/favicons?domain=https://news.example.org"
}
}
]
}Error Responses
Invalid or Missing API Key
{
"status": "not_ok",
"request_id": "req_abc123def456",
"errors": [
{
"status": 401,
"code": "ER0175",
"message": "API key is invalid or missing.",
"links": { "about": "https://docs.apitube.io/platform/news-api/http-response-codes" },
"timestamp": "2026-05-27T14:30:00Z"
}
]
}Status Code: 401
No Points on Account
{
"status": "not_ok",
"request_id": "req_abc123def456",
"errors": [
{
"status": 402,
"code": "ER0176",
"message": "You have no points on your account.",
"links": { "about": "https://docs.apitube.io/platform/news-api/http-response-codes" },
"timestamp": "2026-05-27T14:30:00Z"
}
]
}Status Code: 402
Rate Limit Exceeded
{
"status": "not_ok",
"request_id": "req_abc123def456",
"errors": [
{
"status": 429,
"code": "ER0203",
"message": "Rate limit exceeded.",
"links": { "about": "https://docs.apitube.io/platform/news-api/http-response-codes" },
"timestamp": "2026-05-27T14:30:00Z"
}
]
}Status Code: 429
Invalid Parameters
Invalid parameter values return HTTP 400 with a specific error code:
| Code | Parameter | Condition |
|---|---|---|
ER0050 / ER0051 / ER0052 | source.id | Not an integer / negative / wrong length (1–20 chars). |
ER0053 / ER0054 / ER0055 | ignore.source.id | Not an integer / negative / wrong length (1–20 chars). |
ER0104 / ER0105 | published_at.start | Invalid value / wrong length (1–30 chars). |
ER0106 / ER0107 | published_at.end | Invalid value / wrong length (1–30 chars). |
ER0108 / ER0109 | published_at | Wrong length (1–30 chars) / invalid value. |
ER0170 / ER0171 | per_page | Not an integer / greater than 250. |
ER0172 | page | Not an integer. |