API
API documentation
Public interfaces of NEOSEC Intel: public API without sign-in, feeds, export, badges and the token API for customers.
Authentication
The public API (/v1/public), feeds, export and badges need no sign-in. The token API (/v1/api) expects an API token of your organisation as a bearer token; permissions are granted via scopes per token.
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 requests per second and 10,000 per hour per token (default, adjustable per token). When exceeded, the API responds with HTTP 429 and Retry-After.
Public endpoints: no fixed quota, but protection against abuse – some endpoints limit per IP, automated bulk retrieval is throttled (HTTP 429).
Endpoints
Generated from the OpenAPI specification. Base URL: https://api.intel.neosec.eu
Public API
GET
/v1/public/cpe/suggestVendor/Product-Autocomplete aus dem CPE-DictionaryParameters of /v1/public/cpe/suggest Name In Type Required q query string yes limit query integer no Responses: 200, 422
POST
/v1/public/cve/batchBatch-Lookup mehrerer CVE-IDs — Sammel-Response mit CVSS/EPSS/KEVParameters of /v1/public/cve/batch Name In Type Required format query string no authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/public/cve/{advisory_id}Advisory detail by CVE id or external_idParameters of /v1/public/cve/{advisory_id} Name In Type Required advisory_id path string yes Responses: 200, 422
GET
/v1/public/cve/{cve_id}/changesNVD change-history timeline für eine einzelne CVEParameters of /v1/public/cve/{cve_id}/changes Name In Type Required cve_id path string yes limit query integer no Responses: 200, 422
GET
/v1/public/healthzLivenessResponses: 200
GET
/v1/public/kevKEV-flagged advisories shortcutParameters of /v1/public/kev Name In Type Required limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/patchdayLetzte Patch-Zyklen aller VendorenParameters of /v1/public/patchday Name In Type Required vendor query string no cycle_type query string no limit query integer no Responses: 200, 422
GET
/v1/public/patchday/{vendor}/{cycle_date}Ein Patch-Zyklus mit allen CVEs (Zero-Day-Ranking zuerst)Parameters of /v1/public/patchday/{vendor}/{cycle_date} Name In Type Required vendor path string yes cycle_date path string yes cycle_type query string no Responses: 200, 422
GET
/v1/public/searchList or search advisoriesParameters of /v1/public/search Name In Type Required q query string no kev_only query boolean no severity query array no year query array no os_family query array no vendor query array no cvss_min query number no epss_min query number no source_kind query array no industry query array no has_poc query boolean no ransomware_only query boolean no sort query string no order query string no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/search/facetsFacet counts honouring the active filter setParameters of /v1/public/search/facets Name In Type Required q query string no kev_only query boolean no severity query array no year query array no os_family query array no vendor query array no cvss_min query number no epss_min query number no source_kind query array no industry query array no has_poc query boolean no ransomware_only query boolean no Responses: 200, 422
GET
/v1/public/search/globalCross-Domain-Suche für die Topbar / Cmd+K-ModalParameters of /v1/public/search/global Name In Type Required q query string yes per_kind query integer no Responses: 200, 422
Token API (customers)
GET
/v1/api/cve/{cve_id}CVE-Detail (Customer-Spiegel)Parameters of /v1/api/cve/{cve_id} Name In Type Required cve_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/api/misp/endpointsMISP-Push-Endpoints der eigenen Org auflistenParameters of /v1/api/misp/endpoints Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/misp/endpointsMISP-Push-Endpoint anlegen (Premium)Parameters of /v1/api/misp/endpoints Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
DELETE
/v1/api/misp/endpoints/{endpoint_id}MISP-Endpoint pausierenParameters of /v1/api/misp/endpoints/{endpoint_id} Name In Type Required endpoint_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/api/misp/eventsMISP-Event-Feed (Pull-Modus, Modus A laut docs/misp-integration.md)Parameters of /v1/api/misp/events Name In Type Required since query string no until query string no limit query integer no only_kev query boolean no only_ransomware query boolean no authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/api/searchAdvisory-Suche mit höherem Rate-Limit (Customer-Spiegel der Public-API)Parameters of /v1/api/search Name In Type Required q query string no limit query integer no offset query integer no authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/api/tokensEigene Tokens auflistenParameters of /v1/api/tokens Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/tokensToken für die eigene Org anlegenParameters of /v1/api/tokens Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
PATCH
/v1/api/tokens/{token_id}Token-Ablauf ändern (verlängern, verkürzen, entfristen)Parameters of /v1/api/tokens/{token_id} Name In Type Required token_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/tokens/{token_id}/revokeToken revoken (sofort wirksam)Parameters of /v1/api/tokens/{token_id}/revoke Name In Type Required token_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
GET
/v1/api/webhooksEigene Webhooks auflistenParameters of /v1/api/webhooks Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/webhooksWebhook-Subscription anlegen — Secret wird einmal zurückgegebenParameters of /v1/api/webhooks Name In Type Required authorization header string no X-Api-Key header string no Responses: 200, 422
DELETE
/v1/api/webhooks/{webhook_id}Webhook-Subscription löschenParameters of /v1/api/webhooks/{webhook_id} Name In Type Required webhook_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/webhooks/{webhook_id}/replayOutbox-Replay: DLQ-Rows reaktivieren, optional Bestand der letzten N StundenParameters of /v1/api/webhooks/{webhook_id}/replay Name In Type Required webhook_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
POST
/v1/api/webhooks/{webhook_id}/rotateWebhook-Secret rotieren — alter Secret wird sofort ungültigParameters of /v1/api/webhooks/{webhook_id}/rotate Name In Type Required webhook_id path string yes authorization header string no X-Api-Key header string no Responses: 200, 422
Feeds
GET
/api/v1/public/alerts/topTop-N alerts as plain JSON (programmatic consumers)Parameters of /api/v1/public/alerts/top Name In Type Required lang query string no filter query string no sort query string no since_days query integer no limit query integer no Responses: 200, 422
GET
/feed.jsonJSON Feed 1.1 of top advisoriesParameters of /feed.json Name In Type Required lang query string no filter query string no sort query string no since_days query integer no limit query integer no Responses: 200, 422
GET
/feed.xmlRSS 2.0 feed of top advisoriesParameters of /feed.xml Name In Type Required lang query string no filter query string no sort query string no since_days query integer no limit query integer no industry query no Responses: 200, 422
GET
/v1/public/editorial/feed.xmlRSS 2.0 feed of published editorial postsParameters of /v1/public/editorial/feed.xml Name In Type Required lang query string no for_neosec_de query boolean no limit query integer no Responses: 200, 422
briefings
GET
/v1/public/briefingsList BriefingsResponses: 200
GET
/v1/public/briefings/{year}/{week}Get BriefingParameters of /v1/public/briefings/{year}/{week} Name In Type Required year path integer yes week path integer yes Responses: 200, 422
detection
GET
/v1/public/cve/{cve_id}/detectionCve DetectionParameters of /v1/public/cve/{cve_id}/detection Name In Type Required cve_id path string yes Responses: 200, 422
POST
/v1/public/cve/{cve_id}/detection-requestCve Detection RequestParameters of /v1/public/cve/{cve_id}/detection-request Name In Type Required cve_id path string yes H-Captcha-Response header string no Responses: 200, 422
Blog
GET
/v1/public/editorialList published editorial postsParameters of /v1/public/editorial Name In Type Required lang query string no for_neosec_de query boolean no since query string no limit query integer no Responses: 200, 422
GET
/v1/public/editorial/{slug}Single editorial post by slugParameters of /v1/public/editorial/{slug} Name In Type Required slug path string yes lang query string no Responses: 200, 422
industry
GET
/v1/public/industry/{slug}Industry ViewParameters of /v1/public/industry/{slug} Name In Type Required slug path string yes limit query integer no Responses: 200, 422
Indicators (IoC)
GET
/api/v1/ioc/searchLook up an indicator. Drop-in compatible with api.socfortress.coParameters of /api/v1/ioc/search Name In Type Required value query string yes customer_code query string no module-version header string no X-Request-Id header string no authorization header string no X-Api-Key header string no Responses: 200, 422
Known exploited (KEV)
GET
/kev/catalogKEV-Katalog (CISA-Schema-kompatibel) für xCentral-SyncParameters of /kev/catalog Name In Type Required If-None-Match header string no authorization header string no X-Api-Key header string no Responses: 200, 304, 422, 503
neosec-advisories
GET
/v1/public/neosec-advisoriesNEOSEC-SicherheitshinweiseParameters of /v1/public/neosec-advisories Name In Type Required vendor query string no product query string no advisory_type query string no severity query string no q query string no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/neosec-advisories/feed.xmlRSS 2.0 der NEOSEC-SicherheitshinweiseParameters of /v1/public/neosec-advisories/feed.xml Name In Type Required lang query string no Responses: 200, 422
GET
/v1/public/neosec-advisories/{sa_id}NEOSEC-SicherheitshinweisParameters of /v1/public/neosec-advisories/{sa_id} Name In Type Required sa_id path string yes Responses: 200, 422
News
GET
/v1/public/news/by-cve/{cve_id}News items mentioning a specific CVE idParameters of /v1/public/news/by-cve/{cve_id} Name In Type Required cve_id path string yes limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/news/latestMost recent news items, filtered to public-safe categoriesParameters of /v1/public/news/latest Name In Type Required category query string no source query string no lang query string no industry query string no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/news/sourcesSource filter — counts per source for the public-safe sliceResponses: 200
GET
/v1/public/news/{news_id}One news item with expert notes and linked advisoriesParameters of /v1/public/news/{news_id} Name In Type Required news_id path string yes Responses: 200, 422
GET
/v1/public/news/{news_id}/relatedOther news items + advisories mentioning the same product / vendorParameters of /v1/public/news/{news_id}/related Name In Type Required news_id path string yes limit query integer no Responses: 200, 422
Statistics
GET
/v1/public/sources/statusDatenfrische je Advisory-Quelle (ohne Fehlertexte)Responses: 200
GET
/v1/public/stats/cpeCPE Dictionary statistics — mirror of nvd.nist.gov/products/cpe/statisticsResponses: 200
GET
/v1/public/stats/daily-advisoriesAdvisory-Publikationen pro Tag — 30-Tage-FensterParameters of /v1/public/stats/daily-advisories Name In Type Required window_days query integer no Responses: 200, 422
GET
/v1/public/stats/daily-kevNeue CISA-KEV-Aufnahmen pro Tag — 30-Tage-FensterParameters of /v1/public/stats/daily-kev Name In Type Required window_days query integer no Responses: 200, 422
GET
/v1/public/stats/deltasRolling deltas — advisories + KEV der letzten 24 hResponses: 200
GET
/v1/public/stats/ingest-timelineIngest-Events pro Stunde — 72-Stunden-FensterParameters of /v1/public/stats/ingest-timeline Name In Type Required window_hours query integer no Responses: 200, 422
GET
/v1/public/stats/overviewBestandszahlen und aktive Quellen (stündlicher Snapshot)Responses: 200
GET
/v1/public/stats/ransomware-summaryAnzahl + jüngste Beispiele der bestätigten Ransomware-CVEsParameters of /v1/public/stats/ransomware-summary Name In Type Required limit query integer no Responses: 200, 422
GET
/v1/public/stats/time-to-kevDays from CVE publication to KEV listing, per KEV-add yearParameters of /v1/public/stats/time-to-kev Name In Type Required since query integer no Responses: 200, 422
GET
/v1/public/stats/yearlyCVE counts per publication year, split by severity tier + KEVParameters of /v1/public/stats/yearly Name In Type Required since query integer no until query integer no Responses: 200, 422
GET
/v1/public/stats/ytd-publicationsDaily cumulative CVE publications per year (FIRST-style chart)Parameters of /v1/public/stats/ytd-publications Name In Type Required since query integer no Responses: 200, 422
Taxonomies (CWE, CAPEC, OWASP)
GET
/v1/public/capecCAPEC-Liste (Filter + Suche)Parameters of /v1/public/capec Name In Type Required q query string no abstraction query string no severity query string no limit query integer no Responses: 200, 422
GET
/v1/public/capec/{capec_id}CAPEC-DetailParameters of /v1/public/capec/{capec_id} Name In Type Required capec_id path integer yes Responses: 200, 422
GET
/v1/public/cweCWE-Liste (Filter + Suche)Parameters of /v1/public/cwe Name In Type Required q query string no abstraction query string no limit query integer no Responses: 200, 422
GET
/v1/public/cwe/{cwe_id}CWE-DetailParameters of /v1/public/cwe/{cwe_id} Name In Type Required cwe_id path integer yes Responses: 200, 422
GET
/v1/public/owaspOWASP-Kategorien (Filter nach Katalog + Jahr)Parameters of /v1/public/owasp Name In Type Required catalog query string no year query integer no Responses: 200, 422
GET
/v1/public/owasp/{category_id}OWASP-Kategorie-DetailParameters of /v1/public/owasp/{category_id} Name In Type Required category_id path string yes Responses: 200, 422
GET
/v1/public/owasp/{category_id}/cvesCVEs einer OWASP-Kategorie (abgeleitet via v_cve_owasp)Parameters of /v1/public/owasp/{category_id}/cves Name In Type Required category_id path string yes limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/products/{vendor_slug}/{product_slug}Produkt-DetailParameters of /v1/public/products/{vendor_slug}/{product_slug} Name In Type Required vendor_slug path string yes product_slug path string yes Responses: 200, 422
GET
/v1/public/products/{vendor_slug}/{product_slug}/cvesCVEs zu einem ProduktParameters of /v1/public/products/{vendor_slug}/{product_slug}/cves Name In Type Required vendor_slug path string yes product_slug path string yes kev_only query boolean no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/vendorsVendor-VerzeichnisParameters of /v1/public/vendors Name In Type Required q query string no sort query string no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/vendors/{vendor_slug}Vendor-DetailParameters of /v1/public/vendors/{vendor_slug} Name In Type Required vendor_slug path string yes Responses: 200, 422
GET
/v1/public/vendors/{vendor_slug}/productsProdukte eines VendorsParameters of /v1/public/vendors/{vendor_slug}/products Name In Type Required vendor_slug path string yes sort query string no limit query integer no offset query integer no Responses: 200, 422
Threat actors
GET
/v1/public/threat-actorsList Threat ActorsParameters of /v1/public/threat-actors Name In Type Required q query string no country query array no motivation query array no activity_status query array no has_attack query boolean no dach query array no has_summary query boolean no sort query string no order query string no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/threat-actors/facetsThreat Actor FacetsResponses: 200
GET
/v1/public/threat-actors/{identifier}Get Threat ActorParameters of /v1/public/threat-actors/{identifier} Name In Type Required identifier path string yes Responses: 200, 422
Indicators (IoC)
GET
/v1/public/threat-intel/blocklistDownloadable blocklist for firewalls / CrowdSec / WazuhParameters of /v1/public/threat-intel/blocklist Name In Type Required kind query string no format query string no min_confidence query number no max_age_days query integer no limit query integer no offset query integer no Responses: 200, 422
GET
/v1/public/threat-intel/by-id/{indicator_id}Vollständige Detail-Sicht auf einen Indikator (heute öffentlich)Parameters of /v1/public/threat-intel/by-id/{indicator_id} Name In Type Required indicator_id path string yes Responses: 200, 422
GET
/v1/public/threat-intel/latestMost recently observed indicators (redacted preview)Parameters of /v1/public/threat-intel/latest Name In Type Required kind query string no limit query integer no offset query integer no sort query string no order query string no Responses: 200, 422
GET
/v1/public/threat-intel/lookupAnonymous IoC lookup teaser — hit/miss + score onlyParameters of /v1/public/threat-intel/lookup Name In Type Required value query string yes Responses: 200, 422
GET
/v1/public/threat-intel/statsThreat-intel counts by kind + freshness signalResponses: 200
vendors
GET
/v1/public/catalog/resolveCPE-Herstellerschreibweisen auf Herstellerseiten abbildenParameters of /v1/public/catalog/resolve Name In Type Required cpe query array yes Responses: 200, 422
GET
/v1/public/catalog/sitemapAlle Hersteller-/ProduktseitenResponses: 200
GET
/v1/public/catalog/vendorsHersteller mit eigener SeiteParameters of /v1/public/catalog/vendors Name In Type Required q query string no limit query integer no offset query integer no sort query string no order query string no Responses: 200, 422
GET
/v1/public/catalog/vendors/{vendor_slug}Hersteller-ÜbersichtParameters of /v1/public/catalog/vendors/{vendor_slug} Name In Type Required vendor_slug path string yes Responses: 200, 422
GET
/v1/public/catalog/vendors/{vendor_slug}/{product_slug}Produkt-ÜbersichtParameters of /v1/public/catalog/vendors/{vendor_slug}/{product_slug} Name In Type Required vendor_slug path string yes product_slug path string yes Responses: 200, 422
Webhooks
Create webhooks via the token API (/v1/api/webhooks). Each delivery is a POST with a JSON body and these headers:
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
Example payload
{
"event": "vulnerability.kev_listed",
"cve_id": "CVE-2024-4577",
"kev_added_at": "2024-06-12",
"source": "cisa_kev"
}Verify the signature
The signature is HMAC-SHA256 with your webhook secret over “t=<timestamp>.” plus the unmodified body. Discard deliveries older than five minutes and detect repeats via 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)Events
- vulnerability.kev_listed
- vulnerability.ransomware_confirmed
- advisory.critical_published
- editorial.published
- editorial.updated
- editorial.deleted
- editorial.restored
Deliveries of a time range can be triggered again via POST /v1/api/webhooks/{id}/replay.
MISP export
Pull: in your MISP instance, add this URL under “Sync Actions”, “List Feeds”, “Add Feed” as a feed in “MISP Feed” format with an Authorization header; polling every 15 minutes is sufficient.
GET https://api.intel.neosec.eu/v1/api/misp/events?since=2026-10-01T00:00:00Z Authorization: Bearer <API-Token>
Push: alternatively, NEOSEC delivers actively to your MISP instance; manage the targets via /v1/api/misp/endpoints.
RSS feeds
/feed.xml with lang (de, en), filter (kev, critical, priority, headline, all, ot) and limit (1–100). With the same parameters as the search (e.g. severity, vendor, kev, industry, year), /feed.xml returns the 50 newest hits of exactly that search.
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
Search results and threat actors can be exported with the current filter as CSV or JSON (format=csv|json), up to 1,000 rows per request.
https://intel.neosec.eu/search/export?format=csv&kev=1https://intel.neosec.eu/search/export?format=json&severity=critical&vendor=fortinet
Badges
Embeddable SVG badges: per CVE with severity, KEV status and date; per vendor with the number of entries in the CISA KEV catalog. Cached for one hour; ?lang=en for English. The embed code with backlink is on every CVE page.
https://intel.neosec.eu/badge/cve/CVE-2024-4577.svghttps://intel.neosec.eu/badge/vendor/microsoft.svg