← Developer docs

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.

CriticalHighMediumLowActively exploitedIncident

01 / Start here

One URL. Recent advisories.

Open JSON ↗
GEThttps://www.aidatahub.io/api/latest-security

Returns 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 delivery

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

JSON Schema ↗

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.

Event fields
FieldMeaning
idStable event identifier: ghsa:GHSA-…, kev:CVE-…, osv:MAL-…, or incident:<CVE or hash of the first report URL>. Deduplicate alerts with this value.
typeadvisory = reviewed GitHub Security Advisory; exploited = CISA Known Exploited Vulnerabilities entry; incident = vendor notice, security report or malicious-package record, usually without a CVE.
advisoryId / cveIdGHSA or MAL identifier (the CVE for KEV entries and CVE-tracked incidents) and the CVE identifier when one exists.
title / summaryPlain-text advisory title and a one-sentence summary with severity, identifiers and patched versions.
severity / cvssScore / cvssVectorcritical, high, medium, low, or unknown (KEV entries and incidents), with the CVSS v4 or v3 score and vector when published.
epssPercentile / cwesEPSS exploitation percentile when GitHub publishes it, and CWE identifiers.
affectedUp to 12 affected packages: ecosystem, name, vulnerableVersionRange, firstPatchedVersion. KEV entries and incidents use ecosystem “product”.
matchedTerms / signalsWatchlist packages, products or AI terms that qualified this entry, and for incidents the security vocabulary found in the report.
disclosedAt / sourceUpdatedAtDisclosure date, KEV addition date, report date or OSV record modification date as YYYY-MM-DD, and the source’s last update timestamp.
exploitationnull for advisories. For KEV entries: dateAdded, dueDate, requiredAction, knownRansomwareCampaignUse.
publishedAtWhen this event first entered our feed. Use this for arrival-time filtering.
firstSeenAt / updatedAtFirst detection and most recent revision, as UTC timestamps.
baselinetrue for history imported on a source’s first successful scan. Do not alert on it.
revisionIncreases when an existing event changes. Corrections keep the same id.
sourceId / sourceUrl / references / evidenceSource 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, or unknown. Omit for all.
  • type: all (default), advisory, exploited, or incident.
  • limit: integer 1–1,000; default 10. total counts all matches before this limit.
  • since: exclusive cutoff on publishedAt; 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.