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/newsBase 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
| Parameter | Type | Required | Description |
|---|---|---|---|
cyber.type | string | No | crime 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:
{
"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
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"
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"])
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);
}
$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;
}
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
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
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.csvLimits
per_pageis 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 ofpublished_at. - A page may contain fewer articles than
per_page. If some results are unavailable, the response includes anER0901warning. Follownext_pageto continue. - The
cyberfields 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:
| Code | Status | Meaning |
|---|---|---|
ER0900 | 400 | cyber.type is not crime or warfare (also empty, uppercase or a list) |
ER0179 | 400 | The same parameter appears twice in the URL |
ER0110 | 400 | Title search over a window wider than 31 days |
ER0171 | 400 | per_page above the plan limit |
ER0201 | 401 | No API key in the request |
ER0202 | 401 | The API key is invalid |
ER0176 | 402 | No points left on the account |
ER0603 | 403 | The API key is restricted and lacks the cyber_security_news scope |
ER0706 | 403 | Export or prompt on a plan that does not include it |
ER0203 | 429 | Rate limit exceeded |
Two warnings arrive in meta.warnings with a 200 response:
| Code | Meaning |
|---|---|
ER0901 | Some matching articles are unavailable or no longer in the cyber categories; the page may contain fewer results |
ER0368 | Unknown parameters were ignored; the warning names them |
Related
- Cyber Security API introduction — what the feed covers and its limits.
- Quickstart — the first request in five steps.
- Search articles — the general endpoint this one is built on.