The security advisories API · v1
Know when your
AI stack is exposed.
Reviewed advisories, exploited CVEs and reported incidents for AI packages, agents and infrastructure.
No sign-up. No API key. Just one request.
01 / Start here
One URL. Recent advisories.
https://www.aidatahub.io/api/latest-securityReturns advisories disclosed today or in the previous six UTC days. No key, install, or pagination. Pick a severity or a type to add a real server-side query filter; the endpoint accepts one filter at a time.
Loading recent advisories…
const response = await fetch('https://www.aidatahub.io/api/latest-security');
if (!response.ok) throw new Error(`Latest security: HTTP ${response.status}`);
const { advisories, status } = await response.json();
if (status !== 'ok') console.warn('A source check is delayed.');
console.log(advisories);These examples call /api/latest-security directly. ?severity=critical, ?severity=high, ?type=exploited, ?type=advisory and ?type=incident filter at the API. Combining both filters or sending an unknown value returns HTTP 400.
See the exact JSON response
Waiting for the feed.02 / Follow what’s new
Alerts without the noise.
For a no-code option, add our RSS feed to your reader or an RSS-triggered automation. Titles are prefixed with [CRITICAL], [HIGH], [EXPLOITED], [INCIDENT] or [MALICIOUS PACKAGE] so you can route on severity. Initial history is excluded.
For reliable alerts, use the full history feed and download the tiny JavaScript client. Poll every 15 minutes. Save the first set of IDs without sending alerts. On later checks, process unseen advisories whose baseline is false.
import { FEED_URL, findNewAdvisories } from './security-advisories-client-v1.mjs';
// Your app supplies durable storage and notification delivery.
const savedIds = await loadSeenIds(); // null on first run; otherwise string[]
const response = await fetch(FEED_URL, { signal: AbortSignal.timeout(15000) });
if (!response.ok) throw new Error('Feed request failed');
const { advisories, seenIds } = findNewAdvisories(await response.json(), savedIds);
for (const advisory of advisories.filter(a => a.type === 'exploited' || a.severity === 'critical')) {
await sendAlert(advisory); // deduplicate by advisory.id at your destination
}
await saveSeenIds(seenIds); // save only AFTER successful deliveryThis integration outline requires your own loadSeenIds, sendAlert, and saveSeenIds functions. Persist IDs across restarts. A failed delivery must not advance the checkpoint; retries can repeat earlier deliveries, so the destination should also deduplicate by ID. Match affected[].name against your own dependency list to alert only on packages you run.
Send the last response’s ETag as If-None-Match on later requests. A 304 has no body: keep your previous data. On errors, retain your checkpoint and retry with backoff. The tiny client uses normal HTTP caching; custom conditional requests belong in your integration.
03 / The contract
Small API. Clear fields.
The simple endpoint returns generatedAt, from, through, severity, type, status, count, and advisories. Each advisory carries the identifiers, severity, score, affected package names, disclosure date, exploitation details and source link. An empty advisories array means no recognized advisories in that period. status: "degraded" means a required source check failed, or more than a fifth of the supplementary incident feeds did; inspect sources in the full feed for details. Check that generatedAt is recent before treating an empty result as complete.
Full history feed
Use /api/security-advisories.json for the 90-day archive, CVSS vectors, references, evidence, source health, and alert IDs. It returns the entire archive; query parameters do not filter it.
The response has schemaVersion: 1, generatedAt, initializedAt, pollIntervalSeconds, coverage, sources, and events. Optional links point to these docs, the schema, client, and RSS. Unknown additive fields should be ignored.
Events are ordered by disclosure date, newest first. They are not ordered by detection time. The feed contains the collected archive; it does not paginate.
| Field | Meaning |
|---|---|
id | Stable event identifier: ghsa:GHSA-…, kev:CVE-…, osv:MAL-…, or incident:<CVE or hash of the first report URL>. Deduplicate alerts with this value. |
type | advisory = reviewed GitHub Security Advisory; exploited = CISA Known Exploited Vulnerabilities entry; incident = vendor notice, security report or malicious-package record, usually without a CVE. |
advisoryId / cveId | GHSA or MAL identifier (the CVE for KEV entries and CVE-tracked incidents) and the CVE identifier when one exists. |
title / summary | Plain-text advisory title and a one-sentence summary with severity, identifiers and patched versions. |
severity / cvssScore / cvssVector | critical, high, medium, low, or unknown (KEV entries and incidents), with the CVSS v4 or v3 score and vector when published. |
epssPercentile / cwes | EPSS exploitation percentile when GitHub publishes it, and CWE identifiers. |
affected | Up to 12 affected packages: ecosystem, name, vulnerableVersionRange, firstPatchedVersion. KEV entries and incidents use ecosystem “product”. |
matchedTerms / signals | Watchlist packages, products or AI terms that qualified this entry, and for incidents the security vocabulary found in the report. |
disclosedAt / sourceUpdatedAt | Disclosure date, KEV addition date, report date or OSV record modification date as YYYY-MM-DD, and the source’s last update timestamp. |
exploitation | null for advisories. For KEV entries: dateAdded, dueDate, requiredAction, knownRansomwareCampaignUse. |
publishedAt | When this event first entered our feed. Use this for arrival-time filtering. |
firstSeenAt / updatedAt | First detection and most recent revision, as UTC timestamps. |
baseline | true for history imported on a source’s first successful scan. Do not alert on it. |
revision | Increases when an existing event changes. Corrections keep the same id. |
sourceId / sourceUrl / references / evidence | Source identity (see sources[] for names and whether a source is required), canonical advisory or report link, up to eight https references, and a plain-text excerpt. An incident reported by several outlets keeps the first report as its link and lists the others as references. |
JavaScript client options
getSecurityAdvisories({ severity, type, limit, since, signal }) fetches the feed and returns events, count, total, generatedAt, sources, and stale. HTTP errors and unsupported feeds throw. selectAdvisories(feed, options) filters an already loaded feed.
severity:critical,high,medium,low, orunknown. Omit for all.type:all(default),advisory,exploited, orincident.limit: integer 1–1,000; default 10.totalcounts all matches before this limit.since: exclusive cutoff onpublishedAt; ISO date or timestamp with timezone. Omit for all dates.signal: optional AbortSignal. Default timeout: 15 seconds.
04 / Know the limits
Evidence, with a heartbeat.
What we cover
Two required sources: reviewed entries from the GitHub Advisory Database and the CISA Known Exploited Vulnerabilities catalog that affect a watchlist of AI packages, frameworks, agents, MCP servers, inference servers and model tooling, or whose text describes AI systems. Plus supplementary incident sources: vendor status pages, release notes and security bulletins, security research and reporting feeds, and OSV malicious-package records. A report becomes an incident only when its headline names a watchlisted product and its text carries security vocabulary, so a trojanized extension or poisoned release surfaces without waiting for a CVE. This is not a complete vulnerability database; run a dependency scanner for your own lockfiles.
When data arrives
Source checks run every 15 minutes. Source delays, outages, and format changes can delay or miss an advisory. The CDN caches the historical feed for up to 60 seconds; the simple endpoint also uses cached files. There is no realtime or uptime guarantee.
When a source fails
Collected history is preserved. Inspect each source’s required, status, lastSuccessAt, lastAttemptAt, and error. A failing required source fails the scan; supplementary feeds may flap and only degrade the view when more than a fifth fail. The client marks data stale if a required source fails or a successful check or feed timestamp is at least an hour old. Silence is not proof of no advisories.
Free to read
No authentication or per-user quota. Poll no more often than every 15 minutes and share one cached response across your users. Browser requests are supported with CORS. There is no hosted webhook or email service; deliver alerts through your own workflow.
GitHub, CISA, OSV and the linked vendors and publications are the authoritative sources for every entry; incidents are reports to verify with the vendor before acting. AIDataHub is independent and is not endorsed by any of them.