Skip to content

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.

Only the last ~24 hours are available

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/raw

GET 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.

ParameterTypeRequiredDescription
promptstringNoDescribe 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_atstringNoSearch one day (a 24-hour range). Accepts ISO 8601, YYYY-MM-DD or relative dates. Example: 2026-05-27.
published_at.endstringNoEnd of the publication date range. Example: 2026-05-27.
published_at.startstringNoStart of the publication date range. Example: 2026-05-26.
ignore.source.idstringNoComma-separated source IDs to exclude (max 3). Example: 789.
source.idstringNoSource IDs, separated by commas (max 3). Example: 123.
sort.bystringNoSort field (default id). One of: id, published_at, created_at. Example: id.
sort.orderstringNoSort direction (default desc). One of: asc, desc. Example: desc.
pageintegerNoPage number (default 1). Example: 1.
per_pageintegerNoResults per page (default 100, max 250; Free is capped at 10, Starter at 50, Basic at 200). Example: 100.

prompt supports only some filters here. On Basic and above, prompt can set published_at.start, published_at.end, sort.order and per_page. Free and Starter return 403 ER0706. Other generated filters appear in meta.prompt.ignored with reason: 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/everything if you need these filters.

Each request costs 1 point (charged only when the response contains at least one article).

Response Format ​

json
{
  "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 ​

FieldTypeDescription
statusstringAlways ok on success.
limitintegerNumber of results per page.
pageintegerCurrent page number.
has_next_pagesbooleanWhether more pages exist.
next_pagestringURL for the next page (empty if none).
has_previous_pagebooleanWhether a previous page exists.
previous_pagestringURL for the previous page (empty if none).
request_idstringUnique identifier for the request.
resultsarrayArray of raw article objects (see below).

Each item in results:

FieldTypeDescription
idintegerRaw article id.
titlestring | nullArticle title.
hrefstring | nullArticle URL.
created_atstring | nullPublication date (may be null).
descriptionstring | nullShort description.
bodystringArticle body with HTML stripped (plain text).
body_htmlstringArticle body as received from the feed (HTML preserved).
authorstring | nullAuthor.
keywordsarray | nullRaw categories/keywords.
sourceobjectPublisher details.
source.idinteger | nullSource ID.
source.domainstringSource domain.
source.home_page_urlstringSource home page URL.
source.typestringSource resource type.
source.biasstringPolitical bias (left / center / right).
source.rankings.oprnumber | nullOpen PageRank score.
source.location.country_namestringSource country name.
source.location.country_codestringSource country ISO code.
source.faviconstringFavicon 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 ​

bash
curl "https://api.apitube.io/v1/news/raw?source.id=1024&per_page=5&api_key=YOUR_API_KEY"
python
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())
javascript
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());
php
$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);
go
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)
}
java
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());
    }
}
text
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 ​

bash
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
  }'
python
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())
javascript
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());
php
$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);
go
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)
}
java
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());
    }
}
text
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 ​

shell
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.apitube.io/v1/news/raw?source.id=1024"

Response Example ​

json
{
  "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 ​

json
{
  "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 ​

json
{
  "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 ​

json
{
  "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:

CodeParameterCondition
ER0050 / ER0051 / ER0052source.idNot an integer / negative / wrong length (1–20 chars).
ER0053 / ER0054 / ER0055ignore.source.idNot an integer / negative / wrong length (1–20 chars).
ER0104 / ER0105published_at.startInvalid value / wrong length (1–30 chars).
ER0106 / ER0107published_at.endInvalid value / wrong length (1–30 chars).
ER0108 / ER0109published_atWrong length (1–30 chars) / invalid value.
ER0170 / ER0171per_pageNot an integer / greater than 250.
ER0172pageNot an integer.