Skip to content

Search cyber security news with /v1/cyber-security/news ​

Search cyber crime and cyber warfare news with /v1/cyber-security/news. Each article includes cyber with its categories, CVE IDs, KEV status, vendors and highest CVSS score. Use the same filters and response options as /v1/news/everything.

Each request that returns articles costs 1 point; an empty page is free. The prompt parameter adds 2 points when the wording has not been parsed before and requires Basic or above.

Endpoint ​

GET  /v1/cyber-security/news
POST /v1/cyber-security/news

Base URL: https://api.apitube.io. Send parameters in the URL with GET or as JSON with POST. If a POST request also includes URL parameters, values in the body take priority.

Authenticate with the X-API-Key header, an Authorization: Bearer header or the api_key query parameter — see Authentication. API keys restricted to specific endpoints need the cyber_security_news scope.

Parameters ​

ParameterTypeRequiredDescription
cyber.typestringNocrime for cyber crime (medtop:20000086), warfare for cyber warfare (medtop:20001361). Omit to include both. One lowercase value; anything else returns 400 ER0900.

Use the same search filters as /v1/news/everything, including title, language, dates, source, entities, sentiment and readability. Sorting, pagination, facets, highlighting, fl and export also work here. See Filters for how they combine with the cyber categories.

Response ​

The response uses the standard News API format. Articles are in results, and pagination links are in next_page and previous_page. It may also include facets, highlighting and meta. Each article has a cyber block:

json
{
  "id": 3017161400,
  "title": "Apple e iOS 26.2: patch urgente per due zero-day",
  "published_at": "2025-12-29T06:12:28.000Z",
  "language": "it",
  "cyber": {
    "type": ["crime"],
    "cves": ["CVE-2025-43529", "CVE-2025-14174"],
    "vendors": ["Apple", "Google"],
    "in_kev": true,
    "exploited": true,
    "cvss": null
  }
}

The Response format page explains every cyber field and how it appears in exports.

Request examples ​

GET with query parameters ​

bash
curl "https://api.apitube.io/v1/cyber-security/news?cyber.type=crime&language.code=en&per_page=10&fl=id,title,href,published_at,cyber" \
  -H "X-API-Key: YOUR_API_KEY"
python
import requests

response = requests.get(
    "https://api.apitube.io/v1/cyber-security/news",
    params={
        "cyber.type": "crime",
        "language.code": "en",
        "per_page": 10,
        "fl": "id,title,href,published_at,cyber",
    },
    headers={"X-API-Key": "YOUR_API_KEY"},
)

for article in response.json()["results"]:
    print(article["title"], article["cyber"]["cves"], article["cyber"]["in_kev"])
javascript
const params = new URLSearchParams({
  'cyber.type': 'crime',
  'language.code': 'en',
  per_page: '10',
  fl: 'id,title,href,published_at,cyber'
});

const response = await fetch(`https://api.apitube.io/v1/cyber-security/news?${params}`, {
  headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
const data = await response.json();

for (const article of data.results) {
  console.log(article.title, article.cyber.cves, article.cyber.in_kev);
}
php
$query = http_build_query([
    'cyber.type' => 'crime',
    'language.code' => 'en',
    'per_page' => 10,
    'fl' => 'id,title,href,published_at,cyber',
]);

$context = stream_context_create([
    'http' => ['header' => "X-API-Key: YOUR_API_KEY\r\n"],
]);

$data = json_decode(
    file_get_contents("https://api.apitube.io/v1/cyber-security/news?$query", false, $context),
    true
);

foreach ($data['results'] as $article) {
    echo $article['title'], ' ', implode(', ', $article['cyber']['cves']), PHP_EOL;
}
go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	u, _ := url.Parse("https://api.apitube.io/v1/cyber-security/news")
	q := u.Query()
	q.Set("cyber.type", "crime")
	q.Set("language.code", "en")
	q.Set("per_page", "10")
	q.Set("fl", "id,title,href,published_at,cyber")
	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 struct {
		Results []struct {
			Title string `json:"title"`
			Cyber struct {
				CVEs  []string `json:"cves"`
				InKEV *bool    `json:"in_kev"`
			} `json:"cyber"`
		} `json:"results"`
	}
	json.NewDecoder(resp.Body).Decode(&data)

	for _, article := range data.Results {
		fmt.Println(article.Title, article.Cyber.CVEs)
	}
}

POST with a JSON body ​

bash
curl -X POST "https://api.apitube.io/v1/cyber-security/news" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "cyber.type": "warfare",
    "query": "satellite OR \"power grid\"",
    "language.code": "en",
    "published_at.start": "2026-10-01",
    "published_at.end": "2026-10-15",
    "sort.by": "published_at",
    "per_page": 50
  }'

query is a title search, so the request needs a published_at window of 31 days or less. Without published_at.end, the window runs to the current moment.

Export to CSV ​

bash
curl "https://api.apitube.io/v1/cyber-security/news?cyber.type=crime&per_page=100&export=csv" \
  -H "X-API-Key: YOUR_API_KEY" -o cyber-news.csv

Limits ​

  • per_page is capped by plan: Free 10, Starter 50, Basic 200, Professional and Corporate 250. The Free plan cannot go past page 5. See Rate limits and quotas.
  • On the Free plan the article body is hidden and exports other than JSON return 403 ER0706.
  • Title search (title, title_starts_with, title_ends_with, title_pattern, query) covers at most 31 days of published_at.
  • A page may contain fewer articles than per_page. If some results are unavailable, the response includes an ER0901 warning. Follow next_page to continue.
  • The cyber fields are output only. There are no query parameters for CVE IDs, vendors, KEV status or CVSS score.

Errors ​

Errors follow the shared format and codes in HTTP response codes. The ones you are most likely to see on this endpoint:

CodeStatusMeaning
ER0900400cyber.type is not crime or warfare (also empty, uppercase or a list)
ER0179400The same parameter appears twice in the URL
ER0110400Title search over a window wider than 31 days
ER0171400per_page above the plan limit
ER0201401No API key in the request
ER0202401The API key is invalid
ER0176402No points left on the account
ER0603403The API key is restricted and lacks the cyber_security_news scope
ER0706403Export or prompt on a plan that does not include it
ER0203429Rate limit exceeded

Two warnings arrive in meta.warnings with a 200 response:

CodeMeaning
ER0901Some matching articles are unavailable or no longer in the cyber categories; the page may contain fewer results
ER0368Unknown parameters were ignored; the warning names them