API
API-Dokumentation
Öffentliche Schnittstellen von NEOSEC Intel: Public-API ohne Anmeldung, Feeds, Export, Badges und die Token-API für Kunden.
Authentifizierung
Die Public-API (/v1/public), Feeds, Export und Badges brauchen keine Anmeldung. Die Token-API (/v1/api) erwartet ein API-Token Ihrer Organisation als Bearer-Token; Rechte werden über Scopes je Token vergeben.
curl -H "Authorization: Bearer <API-Token>" \ "https://api.intel.neosec.eu/v1/api/search?q=log4j&limit=10"
Scopes
- api:advisories.read
- api:misp.read
- api:misp.write
- api:tokens.read
- api:tokens.write
- api:tokens.revoke
- api:webhooks.read
- api:webhooks.write
- api:webhooks.revoke
- api:webhooks.rotate
Rate-Limits
Token-API: 60 Anfragen pro Sekunde und 10.000 pro Stunde je Token (Standard, je Token anpassbar). Bei Überschreitung antwortet die API mit HTTP 429 und Retry-After.
Öffentliche Endpunkte: kein festes Kontingent, aber Schutz gegen Missbrauch – einzelne Endpunkte begrenzen je IP, automatisierte Massenabrufe werden gebremst (HTTP 429).
Endpunkte
Erzeugt aus der OpenAPI-Spezifikation. Basis-URL: https://api.intel.neosec.eu
Public-API
GET
/v1/public/cpe/suggestVendor/Product-Autocomplete aus dem CPE-DictionaryParameter von /v1/public/cpe/suggest Name Ort Typ Pflicht q query string ja limit query integer nein Antworten: 200, 422
POST
/v1/public/cve/batchBatch-Lookup mehrerer CVE-IDs — Sammel-Response mit CVSS/EPSS/KEVParameter von /v1/public/cve/batch Name Ort Typ Pflicht format query string nein authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/public/cve/{advisory_id}Advisory detail by CVE id or external_idParameter von /v1/public/cve/{advisory_id} Name Ort Typ Pflicht advisory_id path string ja Antworten: 200, 422
GET
/v1/public/cve/{cve_id}/changesNVD change-history timeline für eine einzelne CVEParameter von /v1/public/cve/{cve_id}/changes Name Ort Typ Pflicht cve_id path string ja limit query integer nein Antworten: 200, 422
GET
/v1/public/healthzLivenessAntworten: 200
GET
/v1/public/kevKEV-flagged advisories shortcutParameter von /v1/public/kev Name Ort Typ Pflicht limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/patchdayLetzte Patch-Zyklen aller VendorenParameter von /v1/public/patchday Name Ort Typ Pflicht vendor query string nein cycle_type query string nein limit query integer nein Antworten: 200, 422
GET
/v1/public/patchday/{vendor}/{cycle_date}Ein Patch-Zyklus mit allen CVEs (Zero-Day-Ranking zuerst)Parameter von /v1/public/patchday/{vendor}/{cycle_date} Name Ort Typ Pflicht vendor path string ja cycle_date path string ja cycle_type query string nein Antworten: 200, 422
GET
/v1/public/searchList or search advisoriesParameter von /v1/public/search Name Ort Typ Pflicht q query string nein kev_only query boolean nein severity query array nein year query array nein os_family query array nein vendor query array nein cvss_min query number nein epss_min query number nein source_kind query array nein industry query array nein has_poc query boolean nein ransomware_only query boolean nein sort query string nein order query string nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/search/facetsFacet counts honouring the active filter setParameter von /v1/public/search/facets Name Ort Typ Pflicht q query string nein kev_only query boolean nein severity query array nein year query array nein os_family query array nein vendor query array nein cvss_min query number nein epss_min query number nein source_kind query array nein industry query array nein has_poc query boolean nein ransomware_only query boolean nein Antworten: 200, 422
GET
/v1/public/search/globalCross-Domain-Suche für die Topbar / Cmd+K-ModalParameter von /v1/public/search/global Name Ort Typ Pflicht q query string ja per_kind query integer nein Antworten: 200, 422
Token-API (Kunden)
GET
/v1/api/cve/{cve_id}CVE-Detail (Customer-Spiegel)Parameter von /v1/api/cve/{cve_id} Name Ort Typ Pflicht cve_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/api/misp/endpointsMISP-Push-Endpoints der eigenen Org auflistenParameter von /v1/api/misp/endpoints Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/misp/endpointsMISP-Push-Endpoint anlegen (Premium)Parameter von /v1/api/misp/endpoints Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
DELETE
/v1/api/misp/endpoints/{endpoint_id}MISP-Endpoint pausierenParameter von /v1/api/misp/endpoints/{endpoint_id} Name Ort Typ Pflicht endpoint_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/api/misp/eventsMISP-Event-Feed (Pull-Modus, Modus A laut docs/misp-integration.md)Parameter von /v1/api/misp/events Name Ort Typ Pflicht since query string nein until query string nein limit query integer nein only_kev query boolean nein only_ransomware query boolean nein authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/api/searchAdvisory-Suche mit höherem Rate-Limit (Customer-Spiegel der Public-API)Parameter von /v1/api/search Name Ort Typ Pflicht q query string nein limit query integer nein offset query integer nein authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/api/tokensEigene Tokens auflistenParameter von /v1/api/tokens Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/tokensToken für die eigene Org anlegenParameter von /v1/api/tokens Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
PATCH
/v1/api/tokens/{token_id}Token-Ablauf ändern (verlängern, verkürzen, entfristen)Parameter von /v1/api/tokens/{token_id} Name Ort Typ Pflicht token_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/tokens/{token_id}/revokeToken revoken (sofort wirksam)Parameter von /v1/api/tokens/{token_id}/revoke Name Ort Typ Pflicht token_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
GET
/v1/api/webhooksEigene Webhooks auflistenParameter von /v1/api/webhooks Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/webhooksWebhook-Subscription anlegen — Secret wird einmal zurückgegebenParameter von /v1/api/webhooks Name Ort Typ Pflicht authorization header string nein X-Api-Key header string nein Antworten: 200, 422
DELETE
/v1/api/webhooks/{webhook_id}Webhook-Subscription löschenParameter von /v1/api/webhooks/{webhook_id} Name Ort Typ Pflicht webhook_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/webhooks/{webhook_id}/replayOutbox-Replay: DLQ-Rows reaktivieren, optional Bestand der letzten N StundenParameter von /v1/api/webhooks/{webhook_id}/replay Name Ort Typ Pflicht webhook_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
POST
/v1/api/webhooks/{webhook_id}/rotateWebhook-Secret rotieren — alter Secret wird sofort ungültigParameter von /v1/api/webhooks/{webhook_id}/rotate Name Ort Typ Pflicht webhook_id path string ja authorization header string nein X-Api-Key header string nein Antworten: 200, 422
Feeds
GET
/api/v1/public/alerts/topTop-N alerts as plain JSON (programmatic consumers)Parameter von /api/v1/public/alerts/top Name Ort Typ Pflicht lang query string nein filter query string nein sort query string nein since_days query integer nein limit query integer nein Antworten: 200, 422
GET
/feed.jsonJSON Feed 1.1 of top advisoriesParameter von /feed.json Name Ort Typ Pflicht lang query string nein filter query string nein sort query string nein since_days query integer nein limit query integer nein Antworten: 200, 422
GET
/feed.xmlRSS 2.0 feed of top advisoriesParameter von /feed.xml Name Ort Typ Pflicht lang query string nein filter query string nein sort query string nein since_days query integer nein limit query integer nein industry query nein Antworten: 200, 422
GET
/v1/public/editorial/feed.xmlRSS 2.0 feed of published editorial postsParameter von /v1/public/editorial/feed.xml Name Ort Typ Pflicht lang query string nein for_neosec_de query boolean nein limit query integer nein Antworten: 200, 422
briefings
GET
/v1/public/briefingsList BriefingsAntworten: 200
GET
/v1/public/briefings/{year}/{week}Get BriefingParameter von /v1/public/briefings/{year}/{week} Name Ort Typ Pflicht year path integer ja week path integer ja Antworten: 200, 422
detection
GET
/v1/public/cve/{cve_id}/detectionCve DetectionParameter von /v1/public/cve/{cve_id}/detection Name Ort Typ Pflicht cve_id path string ja Antworten: 200, 422
POST
/v1/public/cve/{cve_id}/detection-requestCve Detection RequestParameter von /v1/public/cve/{cve_id}/detection-request Name Ort Typ Pflicht cve_id path string ja H-Captcha-Response header string nein Antworten: 200, 422
Blog
GET
/v1/public/editorialList published editorial postsParameter von /v1/public/editorial Name Ort Typ Pflicht lang query string nein for_neosec_de query boolean nein since query string nein limit query integer nein Antworten: 200, 422
GET
/v1/public/editorial/{slug}Single editorial post by slugParameter von /v1/public/editorial/{slug} Name Ort Typ Pflicht slug path string ja lang query string nein Antworten: 200, 422
industry
GET
/v1/public/industry/{slug}Industry ViewParameter von /v1/public/industry/{slug} Name Ort Typ Pflicht slug path string ja limit query integer nein Antworten: 200, 422
Indikatoren (IoC)
GET
/api/v1/ioc/searchLook up an indicator. Drop-in compatible with api.socfortress.coParameter von /api/v1/ioc/search Name Ort Typ Pflicht value query string ja customer_code query string nein module-version header string nein X-Request-Id header string nein authorization header string nein X-Api-Key header string nein Antworten: 200, 422
Aktiv ausgenutzt (KEV)
GET
/kev/catalogKEV-Katalog (CISA-Schema-kompatibel) für xCentral-SyncParameter von /kev/catalog Name Ort Typ Pflicht If-None-Match header string nein authorization header string nein X-Api-Key header string nein Antworten: 200, 304, 422, 503
neosec-advisories
GET
/v1/public/neosec-advisoriesNEOSEC-SicherheitshinweiseParameter von /v1/public/neosec-advisories Name Ort Typ Pflicht vendor query string nein product query string nein advisory_type query string nein severity query string nein q query string nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/neosec-advisories/feed.xmlRSS 2.0 der NEOSEC-SicherheitshinweiseParameter von /v1/public/neosec-advisories/feed.xml Name Ort Typ Pflicht lang query string nein Antworten: 200, 422
GET
/v1/public/neosec-advisories/{sa_id}NEOSEC-SicherheitshinweisParameter von /v1/public/neosec-advisories/{sa_id} Name Ort Typ Pflicht sa_id path string ja Antworten: 200, 422
News
GET
/v1/public/news/by-cve/{cve_id}News items mentioning a specific CVE idParameter von /v1/public/news/by-cve/{cve_id} Name Ort Typ Pflicht cve_id path string ja limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/news/latestMost recent news items, filtered to public-safe categoriesParameter von /v1/public/news/latest Name Ort Typ Pflicht category query string nein source query string nein lang query string nein industry query string nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/news/sourcesSource filter — counts per source for the public-safe sliceAntworten: 200
GET
/v1/public/news/{news_id}One news item with expert notes and linked advisoriesParameter von /v1/public/news/{news_id} Name Ort Typ Pflicht news_id path string ja Antworten: 200, 422
GET
/v1/public/news/{news_id}/relatedOther news items + advisories mentioning the same product / vendorParameter von /v1/public/news/{news_id}/related Name Ort Typ Pflicht news_id path string ja limit query integer nein Antworten: 200, 422
Statistik
GET
/v1/public/sources/statusDatenfrische je Advisory-Quelle (ohne Fehlertexte)Antworten: 200
GET
/v1/public/stats/cpeCPE Dictionary statistics — mirror of nvd.nist.gov/products/cpe/statisticsAntworten: 200
GET
/v1/public/stats/daily-advisoriesAdvisory-Publikationen pro Tag — 30-Tage-FensterParameter von /v1/public/stats/daily-advisories Name Ort Typ Pflicht window_days query integer nein Antworten: 200, 422
GET
/v1/public/stats/daily-kevNeue CISA-KEV-Aufnahmen pro Tag — 30-Tage-FensterParameter von /v1/public/stats/daily-kev Name Ort Typ Pflicht window_days query integer nein Antworten: 200, 422
GET
/v1/public/stats/deltasRolling deltas — advisories + KEV der letzten 24 hAntworten: 200
GET
/v1/public/stats/ingest-timelineIngest-Events pro Stunde — 72-Stunden-FensterParameter von /v1/public/stats/ingest-timeline Name Ort Typ Pflicht window_hours query integer nein Antworten: 200, 422
GET
/v1/public/stats/overviewBestandszahlen und aktive Quellen (stündlicher Snapshot)Antworten: 200
GET
/v1/public/stats/ransomware-summaryAnzahl + jüngste Beispiele der bestätigten Ransomware-CVEsParameter von /v1/public/stats/ransomware-summary Name Ort Typ Pflicht limit query integer nein Antworten: 200, 422
GET
/v1/public/stats/time-to-kevDays from CVE publication to KEV listing, per KEV-add yearParameter von /v1/public/stats/time-to-kev Name Ort Typ Pflicht since query integer nein Antworten: 200, 422
GET
/v1/public/stats/yearlyCVE counts per publication year, split by severity tier + KEVParameter von /v1/public/stats/yearly Name Ort Typ Pflicht since query integer nein until query integer nein Antworten: 200, 422
GET
/v1/public/stats/ytd-publicationsDaily cumulative CVE publications per year (FIRST-style chart)Parameter von /v1/public/stats/ytd-publications Name Ort Typ Pflicht since query integer nein Antworten: 200, 422
Taxonomien (CWE, CAPEC, OWASP)
GET
/v1/public/capecCAPEC-Liste (Filter + Suche)Parameter von /v1/public/capec Name Ort Typ Pflicht q query string nein abstraction query string nein severity query string nein limit query integer nein Antworten: 200, 422
GET
/v1/public/capec/{capec_id}CAPEC-DetailParameter von /v1/public/capec/{capec_id} Name Ort Typ Pflicht capec_id path integer ja Antworten: 200, 422
GET
/v1/public/cweCWE-Liste (Filter + Suche)Parameter von /v1/public/cwe Name Ort Typ Pflicht q query string nein abstraction query string nein limit query integer nein Antworten: 200, 422
GET
/v1/public/cwe/{cwe_id}CWE-DetailParameter von /v1/public/cwe/{cwe_id} Name Ort Typ Pflicht cwe_id path integer ja Antworten: 200, 422
GET
/v1/public/owaspOWASP-Kategorien (Filter nach Katalog + Jahr)Parameter von /v1/public/owasp Name Ort Typ Pflicht catalog query string nein year query integer nein Antworten: 200, 422
GET
/v1/public/owasp/{category_id}OWASP-Kategorie-DetailParameter von /v1/public/owasp/{category_id} Name Ort Typ Pflicht category_id path string ja Antworten: 200, 422
GET
/v1/public/owasp/{category_id}/cvesCVEs einer OWASP-Kategorie (abgeleitet via v_cve_owasp)Parameter von /v1/public/owasp/{category_id}/cves Name Ort Typ Pflicht category_id path string ja limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/products/{vendor_slug}/{product_slug}Produkt-DetailParameter von /v1/public/products/{vendor_slug}/{product_slug} Name Ort Typ Pflicht vendor_slug path string ja product_slug path string ja Antworten: 200, 422
GET
/v1/public/products/{vendor_slug}/{product_slug}/cvesCVEs zu einem ProduktParameter von /v1/public/products/{vendor_slug}/{product_slug}/cves Name Ort Typ Pflicht vendor_slug path string ja product_slug path string ja kev_only query boolean nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/vendorsVendor-VerzeichnisParameter von /v1/public/vendors Name Ort Typ Pflicht q query string nein sort query string nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/vendors/{vendor_slug}Vendor-DetailParameter von /v1/public/vendors/{vendor_slug} Name Ort Typ Pflicht vendor_slug path string ja Antworten: 200, 422
GET
/v1/public/vendors/{vendor_slug}/productsProdukte eines VendorsParameter von /v1/public/vendors/{vendor_slug}/products Name Ort Typ Pflicht vendor_slug path string ja sort query string nein limit query integer nein offset query integer nein Antworten: 200, 422
Bedrohungsakteure
GET
/v1/public/threat-actorsList Threat ActorsParameter von /v1/public/threat-actors Name Ort Typ Pflicht q query string nein country query array nein motivation query array nein activity_status query array nein has_attack query boolean nein dach query array nein has_summary query boolean nein sort query string nein order query string nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/threat-actors/facetsThreat Actor FacetsAntworten: 200
GET
/v1/public/threat-actors/{identifier}Get Threat ActorParameter von /v1/public/threat-actors/{identifier} Name Ort Typ Pflicht identifier path string ja Antworten: 200, 422
Indikatoren (IoC)
GET
/v1/public/threat-intel/blocklistDownloadable blocklist for firewalls / CrowdSec / WazuhParameter von /v1/public/threat-intel/blocklist Name Ort Typ Pflicht kind query string nein format query string nein min_confidence query number nein max_age_days query integer nein limit query integer nein offset query integer nein Antworten: 200, 422
GET
/v1/public/threat-intel/by-id/{indicator_id}Vollständige Detail-Sicht auf einen Indikator (heute öffentlich)Parameter von /v1/public/threat-intel/by-id/{indicator_id} Name Ort Typ Pflicht indicator_id path string ja Antworten: 200, 422
GET
/v1/public/threat-intel/latestMost recently observed indicators (redacted preview)Parameter von /v1/public/threat-intel/latest Name Ort Typ Pflicht kind query string nein limit query integer nein offset query integer nein sort query string nein order query string nein Antworten: 200, 422
GET
/v1/public/threat-intel/lookupAnonymous IoC lookup teaser — hit/miss + score onlyParameter von /v1/public/threat-intel/lookup Name Ort Typ Pflicht value query string ja Antworten: 200, 422
GET
/v1/public/threat-intel/statsThreat-intel counts by kind + freshness signalAntworten: 200
vendors
GET
/v1/public/catalog/resolveCPE-Herstellerschreibweisen auf Herstellerseiten abbildenParameter von /v1/public/catalog/resolve Name Ort Typ Pflicht cpe query array ja Antworten: 200, 422
GET
/v1/public/catalog/sitemapAlle Hersteller-/ProduktseitenAntworten: 200
GET
/v1/public/catalog/vendorsHersteller mit eigener SeiteParameter von /v1/public/catalog/vendors Name Ort Typ Pflicht q query string nein limit query integer nein offset query integer nein sort query string nein order query string nein Antworten: 200, 422
GET
/v1/public/catalog/vendors/{vendor_slug}Hersteller-ÜbersichtParameter von /v1/public/catalog/vendors/{vendor_slug} Name Ort Typ Pflicht vendor_slug path string ja Antworten: 200, 422
GET
/v1/public/catalog/vendors/{vendor_slug}/{product_slug}Produkt-ÜbersichtParameter von /v1/public/catalog/vendors/{vendor_slug}/{product_slug} Name Ort Typ Pflicht vendor_slug path string ja product_slug path string ja Antworten: 200, 422
Webhooks
Webhooks legen Sie über die Token-API an (/v1/api/webhooks). Jede Zustellung ist ein POST mit JSON-Body und diesen Headern:
POST <Ihre URL> Content-Type: application/json User-Agent: neosec-intel-webhooks/1.0 X-Neosec-Signature: t=<Unix-Zeit>,v1=<HMAC-SHA256 hex> X-Idempotency-Key: <Schlüssel> X-Event-Kind: vulnerability.kev_listed
Beispiel-Payload
{
"event": "vulnerability.kev_listed",
"cve_id": "CVE-2024-4577",
"kev_added_at": "2024-06-12",
"source": "cisa_kev"
}Signatur prüfen
Die Signatur ist HMAC-SHA256 mit Ihrem Webhook-Secret über „t=<Zeitstempel>.“ plus den unveränderten Body. Verwerfen Sie Zustellungen, die älter als fünf Minuten sind, und erkennen Sie Wiederholungen am X-Idempotency-Key.
import hashlib, hmac, time
def verify(secret: str, header: str, body: bytes) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
ts, sig = int(parts["t"]), parts["v1"]
if abs(time.time() - ts) > 300: # älter als 5 Minuten: verwerfen
return False
mac = hmac.new(secret.encode(), f"t={ts}.".encode() + body, hashlib.sha256)
return hmac.compare_digest(mac.hexdigest(), sig)Ereignisse
- vulnerability.kev_listed
- vulnerability.ransomware_confirmed
- advisory.critical_published
- editorial.published
- editorial.updated
- editorial.deleted
- editorial.restored
Zustellungen eines Zeitraums lassen sich über POST /v1/api/webhooks/{id}/replay erneut auslösen.
MISP-Export
Pull: Tragen Sie in Ihrer MISP-Instanz unter „Sync Actions“, „List Feeds“, „Add Feed“ diese URL als Feed im Format „MISP Feed“ ein, mit Authorization-Header; ein Abruf alle 15 Minuten genügt.
GET https://api.intel.neosec.eu/v1/api/misp/events?since=2026-10-01T00:00:00Z Authorization: Bearer <API-Token>
Push: Alternativ liefert NEOSEC aktiv an Ihre MISP-Instanz; die Ziele verwalten Sie über /v1/api/misp/endpoints.
RSS-Feeds
/feed.xml mit lang (de, en), filter (kev, critical, priority, headline, all, ot) und limit (1–100). Mit denselben Parametern wie die Suche (z. B. severity, vendor, kev, industry, year) liefert /feed.xml die neuesten 50 Treffer genau dieser Suche.
https://intel.neosec.eu/feed.xml?lang=de&filter=kev&limit=30https://intel.neosec.eu/feed.xml?severity=critical&vendor=microsofthttps://intel.neosec.eu/feed.xml?kev=1&industry=energy
Export
Trefferliste und Bedrohungsakteure lassen sich mit dem aktuellen Filter als CSV oder JSON exportieren (format=csv|json), höchstens 1 000 Zeilen je Abruf.
https://intel.neosec.eu/search/export?format=csv&kev=1https://intel.neosec.eu/search/export?format=json&severity=critical&vendor=fortinet
Badges
SVG-Badges zum Einbetten: je CVE mit Schweregrad, KEV-Status und Stand; je Hersteller mit der Zahl der Einträge im CISA-KEV-Katalog. Caching eine Stunde; ?lang=en für Englisch. Den Einbett-Code mit Backlink finden Sie auf jeder CVE-Seite.
https://intel.neosec.eu/badge/cve/CVE-2024-4577.svghttps://intel.neosec.eu/badge/vendor/microsoft.svg