Documentation

ThreatBrief API Reference

Integrate 990,000+ cybersecurity intelligence articles, real-time IOCs, CVE data, and AI-generated briefings into your security stack.

Base URL https://cyberbriefing.info/api/v1

Authentication

All API requests must include your API key in the X-API-Key request header. You can get a free key by signing up below.

How to get an API key

Sign up at /signup with your email and password. Your free API key is returned immediately. Store it securely — it won't be shown again. Use /account/keys/rotate to regenerate a key if compromised.

# Pass your API key in the X-API-Key header
curl https://cyberbriefing.info/api/v1/search?q=ransomware \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

headers = {"X-API-Key": "tp_live_xxxxxxxxxxxx"}
r = requests.get(
    "https://cyberbriefing.info/api/v1/search",
    headers=headers,
    params={"q": "ransomware"},
)
print(r.json())
const res = await fetch(
  "https://cyberbriefing.info/api/v1/search?q=ransomware",
  { headers: { "X-API-Key": "tp_live_xxxxxxxxxxxx" } }
);
const data = await res.json();
console.log(data);

Rate Limits

Rate limits are applied per API key, per minute. Exceeding limits returns 429 Too Many Requests. Limits reset on a rolling window.

Tier Requests / min AI Briefings STIX/TAXII Price
Free 30 Not included Not included $0 / mo
Pro 300 10 / day Not included $99 / mo
Enterprise 3,000 Unlimited Included $499 / mo

Rate limit headers

Each response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (Unix timestamp) headers so you can implement backoff logic.

Errors

All errors return a JSON body with a detail field describing the problem.

StatusMeaning
200Success
401Missing or invalid API key
403Feature requires a higher tier (e.g. briefings need Pro+)
404Resource not found
422Validation error — check your request parameters
429Rate limit exceeded
500Server error — please retry or contact support

Briefings

AI-generated daily threat intelligence briefings. Requires Pro or Enterprise tier.

Tier requirement

Briefings are available to Pro (10/day) and Enterprise (unlimited) subscribers. Free tier requests return 403 Forbidden.

GET /briefings Today's AI threat briefing

Returns today's curated threat intelligence briefing, AI-generated from the latest data in our 20-year database.

curl https://cyberbriefing.info/api/v1/briefings \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

r = requests.get(
    "https://cyberbriefing.info/api/v1/briefings",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
)
briefing = r.json()
print(f"Briefing for {briefing['date']}: {len(briefing['items'])} items")
const res = await fetch(
  "https://cyberbriefing.info/api/v1/briefings",
  { headers: { "X-API-Key": "tp_live_xxxxxxxxxxxx" } }
);
const { date, items } = await res.json();
console.log(`Briefing for ${date}:`, items);

Example Response — 200 OK

{
  "date": "2026-03-30",
  "items": [
    {
      "title": "LockBit 3.0 targets EU financial sector",
      "summary": "Three major banks hit in coordinated campaign...",
      "severity": "critical",
      "published_at": "2026-03-30T08:00:00Z"
    }
  ],
  "tier_note": "You are on the pro tier."
}
403 Forbidden
{ "detail": "This feature requires pro or enterprise tier." }
GET /briefings/topics List available briefing topics

Returns a list of available topic categories for scoped briefings (e.g. ransomware, APT, zero-day). Requires Pro or Enterprise.

curl https://cyberbriefing.info/api/v1/briefings/topics \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests
r = requests.get(
    "https://cyberbriefing.info/api/v1/briefings/topics",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
)
print(r.json())

IOCs

Query indicators of compromise — IPs, domains, file hashes, URLs, and email addresses — with full context and severity.

GET /iocs List and filter IOCs

Returns a paginated list of active IOCs. Filter by type, severity, or keyword.

Query Parameters

ParameterTypeRequiredDescription
qstringOptionalKeyword filter on value or description
typestringOptionalIOC type: ip, domain, hash, url, email
severitystringOptionalcritical, high, medium, low
is_activebooleanOptionalFilter by active status (default: true)
limitintegerOptionalPage size (1–1000, default: 50)
offsetintegerOptionalPagination offset (default: 0)
# List critical IP IOCs
curl "https://cyberbriefing.info/api/v1/iocs?type=ip&severity=critical&limit=10" \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

r = requests.get(
    "https://cyberbriefing.info/api/v1/iocs",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
    params={"type": "ip", "severity": "critical", "limit": 10},
)
for ioc in r.json():
    print(ioc["value"], "-", ioc["severity"])
const res = await fetch(
  "https://cyberbriefing.info/api/v1/iocs?type=ip&severity=critical",
  { headers: { "X-API-Key": "tp_live_xxxxxxxxxxxx" } }
);
const iocs = await res.json();
iocs.forEach(i => console.log(i.value, i.severity));

Example Response — 200 OK

[
  {
    "id": "7c4b1e22-4d3a-4e5f-8b1c-2d3e4f5a6b7c",
    "type": "ip",
    "value": "203.0.113.42",
    "severity": "critical",
    "description": "LockBit 3.0 C2 server",
    "is_active": true,
    "first_seen": "2026-01-15T00:00:00Z",
    "last_seen": "2026-03-29T00:00:00Z"
  }
]
GET /iocs/lookup/{value} Lookup a specific IOC by value

Check if a specific IP, domain, hash, URL, or email is in our IOC database.

# Check if an IP is malicious
curl https://cyberbriefing.info/api/v1/iocs/lookup/203.0.113.42 \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

ip = "203.0.113.42"
r = requests.get(
    f"https://cyberbriefing.info/api/v1/iocs/lookup/{ip}",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
)
if r.json():
    print("MALICIOUS — found in IOC database")
else:
    print("Clean — not in IOC database")

Threats

Threat actor profiles — APT groups, ransomware gangs, nation-state actors — with TTPs, attribution, and campaign history.

GET /threats List threat actors
curl "https://cyberbriefing.info/api/v1/threats?q=APT28&limit=5" \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

r = requests.get(
    "https://cyberbriefing.info/api/v1/threats",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
    params={"q": "APT28"},
)
print(r.json())
const res = await fetch(
  "https://cyberbriefing.info/api/v1/threats?q=APT28",
  { headers: { "X-API-Key": "tp_live_xxxxxxxxxxxx" } }
);
console.log(await res.json());

Example Response — 200 OK

[
  {
    "id": "9a8b7c6d-...",
    "name": "APT28",
    "aliases": ["Fancy Bear", "Sofacy"],
    "origin_country": "RU",
    "motivation": "espionage",
    "description": "Russian GRU-linked APT group...",
    "first_observed": "2007-01-01",
    "is_active": true
  }
]

CVEs

Full CVE database enriched with CVSS scores, exploit availability, vendor advisories, and affected product mapping.

GET /cves List CVEs

Query Parameters

ParameterTypeRequiredDescription
qstringOptionalCVE ID or keyword (e.g. CVE-2024-1234)
severitystringOptionalcritical, high, medium, low
has_exploitbooleanOptionalFilter to CVEs with known public exploits
limitintegerOptionalMax results (default: 50)
# Find critical CVEs with public exploits
curl "https://cyberbriefing.info/api/v1/cves?severity=critical&has_exploit=true" \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests

r = requests.get(
    "https://cyberbriefing.info/api/v1/cves",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
    params={"severity": "critical", "has_exploit": True},
)
for cve in r.json():
    print(cve["cve_id"], cve["cvss_score"])
const res = await fetch(
  "https://cyberbriefing.info/api/v1/cves?severity=critical&has_exploit=true",
  { headers: { "X-API-Key": "tp_live_xxxxxxxxxxxx" } }
);
const cves = await res.json();
cves.forEach(c => console.log(c.cve_id, c.cvss_score));

Example Response — 200 OK

[
  {
    "id": "5e3f1a2b-...",
    "cve_id": "CVE-2024-1234",
    "description": "Remote code execution in Acme Corp widget",
    "cvss_score": 9.8,
    "severity": "critical",
    "has_exploit": true,
    "published_at": "2024-03-01"
  }
]
GET /cves/{cve_id} Get a specific CVE
curl https://cyberbriefing.info/api/v1/cves/CVE-2024-1234 \
  -H "X-API-Key: tp_live_xxxxxxxxxxxx"
import requests
r = requests.get(
    "https://cyberbriefing.info/api/v1/cves/CVE-2024-1234",
    headers={"X-API-Key": "tp_live_xxxxxxxxxxxx"},
)
print(r.json())

Health

Check API availability. No authentication required.

GET /health/db Database health check
curl https://cyberbriefing.info/api/v1/health/db
import requests
r = requests.get("https://cyberbriefing.info/api/v1/health/db")
print(r.json())

Example Response — 200 OK

{ "status": "ok", "db": "connected" }

Sign Up

Create an account and receive a free API key. The key is only shown once — store it immediately.

POST /signup Create account, get free API key

Request Body

FieldTypeRequiredDescription
emailstringRequiredYour email address (unique per account)
passwordstringRequiredMinimum 8 characters
curl -X POST https://cyberbriefing.info/api/v1/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "analyst@company.com", "password": "s3cur3pass"}'
import requests

r = requests.post(
    "https://cyberbriefing.info/api/v1/signup",
    json={"email": "analyst@company.com", "password": "s3cur3pass"},
)
data = r.json()
print("API Key:", data["api_key"])  # save this!
const res = await fetch("https://cyberbriefing.info/api/v1/signup", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    email: "analyst@company.com",
    password: "s3cur3pass",
  }),
});
const { api_key } = await res.json();
console.log("API Key:", api_key); // save this!

Example Response — 201 Created

{
  "message": "Account created. Keep your API key safe — it won't be shown again.",
  "api_key": "tp_live_3f8a2d1044ab...",
  "tier": "free"
}

Login & Key Management

Log in to get a JWT token for managing your account keys.

POST /login Log in and get a JWT
curl -X POST https://cyberbriefing.info/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"email": "analyst@company.com", "password": "s3cur3pass"}'
import requests

r = requests.post(
    "https://cyberbriefing.info/api/v1/login",
    json={"email": "analyst@company.com", "password": "s3cur3pass"},
)
token = r.json()["access_token"]
# Use token in: Authorization: Bearer {token}

Example Response — 200 OK

{ "access_token": "eyJhbGciOiJIUzI1NiJ9...", "token_type": "bearer" }
GET /account/keys List your API keys (JWT required)
curl https://cyberbriefing.info/api/v1/account/keys \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
POST /account/keys/rotate Rotate your API key

Invalidates all existing API keys and returns a new one. Use this if your key is compromised.

curl -X POST https://cyberbriefing.info/api/v1/account/keys/rotate \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."

Example Response — 200 OK

{
  "message": "API key rotated. Previous key(s) are now invalid.",
  "new_key": "tp_live_9b8a7c6d..."
}

Interactive API Explorer

Prefer to try endpoints live in your browser? Use the Interactive API Explorer ↗ — a full Swagger UI with real request/response testing built in.