Alerts¶
Manage automated notifications for new or updated records — add/list/modify webhook subscriptions or create email subscriptions. These endpoints let applications react to new security data in real time (webhooks) or on a schedule (email digests).
Subscriptions (v4)¶
Webhook & subscription management redesigned: v4 subscriptions provide a typed query object, explicit delivery configuration, selectable bulletin_fields, and control over timestamp_source and empty-result deliveries. These endpoints are intended for programmatic subscription lifecycle management (create, update, list, get, delete) and to support both webhook and pooling deliveries.
Note
v4 endpoints use JSON bodies and typed fields as described below. Authentication: X-Api-Key header required.
Create subscription¶
Create a new subscription. Provide name, typed query, delivery, and optional settings.
Auth: X-Api-Key header required.
Request body parameters:
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
name |
body | string | yes | — | Subscription name. |
query |
body | object | yes | — | Typed query object. Check below. |
delivery |
body | object | yes | — | Delivery object (webhook or pooling). Check below. |
send_empty_result |
body | boolean | yes | false |
Send delivery even when empty. |
licenseId |
body | string/null | no | null |
Optional license identifier (v4 field name: licenseId). |
bulletin_fields |
body | list[string] | no | default list | Which bulletin fields to return. |
is_active |
body | boolean | no | true |
Activate immediately if true. |
timestamp_source |
body | string | no | "modified" |
See allowed values above. |
send_empty_result |
body | boolean | no | false |
Send delivery even when empty. |
The query object is discriminated by type. Supported type values and examples:
| Type | Meaning | Example |
|---|---|---|
query |
Lucene query | { "type":"query", "query":"package:nginx severity:high" } |
software |
Software / CPE-based query | { "type":"software", "software":[{ "vendor":"nginx","product":"nginx","version":"1.24.0" }]} |
host/generic |
Generic host query (software + optional app/OS/hw) | { "type":"host/generic", "software":[...], "application": {...}, "operating_system": {...} } |
host/linux |
Linux host query (os + packages list) | { "type":"host/linux", "os":"Ubuntu","os_version":"22.04","packages":["nginx=1.24.0-2"] } |
host/windows |
Windows host query (os + kb_list + packages) | { "type":"host/windows", "os":"Windows Server","os_version":"2019","kb_list":["KB5030211"],"packages":["IIS"] } |
Delivery object is discriminated by type.
| Type | Example | Notes |
|---|---|---|
webhook |
{ "type": "webhook", "address": "https://example.com/webhook", "crontab": "0 6 * * *" } |
Webhook address must be a valid HTTP(S) URL. crontab uses standard 5-field cron (minute hour day month day_of_week). |
pooling |
{ "type": "pooling", "endpoint": "https://example.com/fetch" } |
Pooling (pull) delivery — the service will store results and the endpoint may be used to fetch results. |
The bulletin_fields parameter controls which fields are included in subscription results. Allowed values:
| Field name | Description |
|---|---|
title |
Bulletin title |
short_description |
Short AI-generated description |
type |
Bulletin source/type |
published |
Published timestamp |
modified |
Modified timestamp |
href |
Link to source |
metrics |
Metrics object (CVSS, etc.) |
exploitation |
Exploitation info |
cvelist |
Related CVE identifiers |
ai_score |
AI-based prioritization score |
epss |
EPSS probability |
description |
Full description |
enchantments |
Internal enrichment info |
webApplicability |
Web applicability metadata |
cvelistMetrics |
CVE metrics |
Default bulletin_fields (if not provided):
["title", "short_description", "type", "href", "published", "modified", "ai_score"]
Allowed timestamp_source here
Query:
POST /api/v4/subscriptions/create/
Request example:
curl -X POST "https://vulners.com/api/v4/subscriptions/create/" \
-H "X-Api-Key: QWNOEGW7VF99YRDWHTQBGWI4006FEUEGSSNEEVU7HR82J9MOKCTS3JT5Z0TTZ7ZC" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"name": "test_v4",
"query": {
"type": "query",
"query": "cvss:[7 TO *] AND family:cve"
},
"delivery": {
"type": "webhook",
"address": "https://example.com/webhook",
"crontab": "0 * * * *"
},
"send_empty_result": true
}
JSON
vulners_api.subscription_v4.create(
name="Critical Linux vulns",
query={"type":"query","query":"package:linux severity:critical"},
delivery={"type":"webhook","address":"https://example.com/webhook","crontab":"0 6 * * *"},
bulletin_fields=["id","title","description","cvss"],
timestamp_source="modified",
is_active=True,
send_empty_result=False,
licenseId="user-license-id"
)
{
"id": "subscription-uuid",
"name": "Critical Linux vulns",
"query": { "type": "query", "query": "package:linux severity:critical" },
"delivery": { "type": "webhook", "address": "https://example.com/webhook", "crontab": "0 6 * * *" },
"bulletin_fields": ["id", "title", "description", "cvss"],
"timestamp_source": "modified",
"is_active": true,
"send_empty_result": false,
"licenseId": "user-license-id"
}
List subscriptions¶
Return all subscriptions available to the authenticated account (supports paging via query params if needed).
Auth: X-Api-Key header required.
Query:
GET /api/v4/subscriptions/list/
Example:
curl -G "https://vulners.com/api/v4/subscriptions/list/" -H "X-Api-Key: YOUR_API_KEY"
vulners_api.subscription_v4.get_list()
[
{
"id": "subscription-uuid-1",
"name": "Critical Linux vulns",
"query": { "type": "query", "query": "package:linux severity:critical" },
"delivery": { "type": "webhook", "address": "https://example.com/webhook", "crontab": "0 6 * * *" },
"is_active": true
}
]
Get subscription¶
Retrieve full subscription object by id.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscription_id |
query | string | yes | Subscription identifier |
Query:
GET /api/v4/subscriptions/get/?subscription_id=subscription-uuid
Example:
curl -G "https://vulners.com/api/v4/subscriptions/get/" -H "X-Api-Key: YOUR_API_KEY" --data-urlencode "subscription_id=subscription-uuid"
vulners_api.subscription_v4.get(subscription_id="subscription-uuid")
{
"id": "subscription-uuid",
"name": "Critical Linux vulns",
"query": { "type": "query", "query": "package:linux severity:critical" },
"delivery": { "type": "webhook", "address": "https://example.com/webhook", "crontab": "0 6 * * *" },
"bulletin_fields": ["title","short_description","href","published"],
"timestamp_source": "modified",
"is_active": true,
"send_empty_result": false,
"licenseId": null
}
Update subscription¶
Update an existing subscription. Provide id and the fields to change.
Auth: X-Api-Key header required.
Request body parameters:
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
id |
body | string | yes | — | Subscription identifier. |
name |
body | string | yes | — | Subscription name. |
query |
body | object | yes | — | Typed query object. Check below. |
delivery |
body | object | yes | — | Delivery object (webhook or pooling). Check below. |
send_empty_result |
body | boolean | yes | false |
Send delivery even when empty. |
| All other parameters from Create | body | — | no | — | Same meanings as create. |
Errors
| Code | Description |
|---|---|
149 |
Subscription not found |
400 |
Invalid license ID |
Query:
PUT /api/v4/subscriptions/update/
Request example:
curl -X PUT "https://vulners.com/api/v4/subscriptions/update/" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"id": "subscription-uuid",
"name": "",
"query": {
"type": "query",
"query": "cvss:[7 TO *] AND family:cve"
},
"delivery": {
"type": "webhook",
"address": "https://example.com/webhook",
"crontab": "0 * * * *"
},
"sendEmptyResult":"true"
}
JSON
vulners_api.subscription_v4.update(
id="subscription-uuid",
name="Updated subscription",
query={"type":"query","query":"package:nginx severity:high"},
delivery={"type":"webhook","address":"https://example.com/new-webhook","crontab":"*/30 * * * *"},
bulletin_fields=["id","title"],
timestamp_source="published",
is_active=False,
send_empty_result=True
)
{ "id": "subscription-uuid" }
Delete subscription¶
Delete a subscription by id.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id |
body | string | yes | Subscription identifier |
Errors
| Code | Description |
|---|---|
404 |
Subscription not found |
Query:
DELETE /api/v4/subscriptions/delete/
Request example:
curl -X DELETE "https://vulners.com/api/v4/subscriptions/delete/?id=subscription-uuid" \
-H "X-Api-Key: YOUR_API_KEY"
vulners_api.subscription_v4.delete(id="subscription-uuid")
{ "id": "subscription-uuid" }
Webhook¶
Webhook subscriptions send HTTP POSTs to a generated webhook URL whenever new results match the subscription query.
Add webhook¶
Create a new webhook subscription that will POST search results to a generated webhook endpoint.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
query |
body | string | yes | Lucene search query that defines matching criteria (e.g. viewCount:[50 TO *] order:viewCount last 8 days). |
Query:
POST /api/v3/subscriptions/addWebhookSubscription/
Query example:
curl -XPOST https://vulners.com/api/v3/subscriptions/addWebhookSubscription/ -H "X-Api-Key: YOUR_API_KEY" -H 'Content-Type: application/json' -d '{
"query": "viewCount:[50 TO *] order:viewCount last 8 days"
}'
new_webhook = vulners_api.add_webhook("viewCount:[50 TO *] order:viewCount last 8 days")
{
"result": "OK",
"data": {
"subscriptionid": "{subscription id}",
"subscription": {
"id": "{subscription id}",
"query": "viewCount:[50 TO *] order:viewCount last 8 days",
"active": true,
"webhook": "https://vulners.com/api/v3/subscriptions/webhook?newest_only=true&subscriptionid={subscription id}&apiKey={api key}"
}
}
}
List webhooks¶
Retrieve all webhook subscriptions for the authenticated account.
Auth: X-Api-Key header required.
Query:
GET /api/v3/subscriptions/listWebhookSubscriptions/
Query example:
curl -G "https://vulners.com/api/v3/subscriptions/listWebhookSubscriptions/" -H "X-Api-Key: YOUR_API_KEY"
vulners_api.get_webhooks()
{
"result": "OK",
"data": {
"subscriptions": [
{
"id": "{subscription id}",
"query": "viewCount:[50 TO *] order:viewCount last 8 days",
"active": true,
"webhook": "https://vulners.com/api/v3/subscriptions/webhook?newest_only=true&subscriptionid={subscription id}&apiKey={api key}"
}
]
}
}
Enable/Disable webhook¶
Toggle an existing webhook subscription on or off.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionid |
body | string | yes | Subscription identifier returned when creating the webhook. |
active |
body | string | yes | true to enable, false to disable. |
Query:
POST /api/v3/subscriptions/enableWebhookSubscription/
Query example:
curl -XPOST https://vulners.com/api/v3/subscriptions/enableWebhookSubscription/ -H "X-Api-Key: YOUR_API_KEY" -H 'Content-Type: application/json' -d '{
"subscriptionid": "{subscription id}",
"active": false
}'
{
"result": "OK",
"data": {}
}
Read webhook¶
Webhook endpoint used by Vulners to deliver results — you can also poll the webhook endpoint to retrieve recent deliveries. Use newest_only to fetch only newest updates.
Auth: X-Api-Key header required (when calling as API), but note that the generated webhook URL already includes the apiKey query parameter for delivery.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionid |
query | string | yes | Subscription identifier returned when creating the webhook. |
newest_only |
query | boolean/string | no | true to return only newest items; false for full result set. |
Query:
GET /api/v3/subscriptions/webhook/
Query example:
curl -G "https://vulners.com/api/v3/subscriptions/webhook/" -H "X-Api-Key: YOUR_API_KEY" \
--data-urlencode "subscriptionid={subscription-id}" \
--data-urlencode "newest_only=false"
Search results
Email notifications¶
Email notifications (subscriptions) management via API as well as via web interface.
List email subscriptions¶
List all email subscriptions for the authenticated account.
Auth: X-Api-Key header required.
Query:
GET /api/v3/subscriptions/listEmailSubscriptions/
Query example:
curl -X GET 'https://vulners.com/api/v3/subscriptions/listEmailSubscriptions/' -H "X-Api-Key: YOUR_API_KEY"
subsctiptions = vulners_api.subscription.list()
{
"result": "OK",
"data": {
"subscriptions": [
{
"id": "3C5SC5C5IS6DG9HE8BG470LBWBJWU0GTO2OAN93DLUJCSCH3SYWO1S13I8K17DSB",
"active": false,
"confirmed": false,
"query": "viewCount:[50 TO *] order:viewCount last 5 days",
"query_type": "lucene",
"link_query": "/search?query=viewCount%3A%5B50%20TO%20%2A%5D%20order%3AviewCount%20last%205%20days",
"crontab": "0 0 * * *",
"deliveryAddress": "[email protected]",
"deliveryFormat": "html"
}
]
}
}
Add subscription¶
Create a new scheduled email subscription.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
query |
body | string | yes | Lucene query for items to include in the digest. |
email |
body | string | yes | Recipient email address. |
format |
body | string | yes | html or json. |
crontab |
body | string | yes | Cron-style schedule (e.g. 0 0 * * *). |
query_type |
body | string | no | Typically "lucene". |
Query:
POST /api/v3/subscriptions/addEmailSubscription/
Query example:
curl -X POST 'https://vulners.com/api/v3/subscriptions/addEmailSubscription/' -H "X-Api-Key: YOUR_API_KEY" -H 'Content-Type: application/json' -d '{
"query": "viewCount:[50 TO *] order:viewCount last 5 days",
"email": "[email protected]",
"format": "html",
"crontab": "0 0 * * *",
"query_type": "lucene"
}'
add_subscription = vulners_api.subscription.add("viewCount:[50 TO *] order:viewCount last 9 days",
email="[email protected]")
{
"result": "OK",
"data": {
"id": "{subscription id}",
"active": false,
"confirmed": false,
"query": "viewCount:[50 TO *] order:viewCount last 5 days",
"query_type": "lucene",
"link_query": "/search?query=viewCount%3A%5B50%20TO%20%2A%5D%20order%3AviewCount%20last%205%20days",
"crontab": "0 0 * * *",
"deliveryAddress": "[email protected]",
"deliveryFormat": "html"
}
}
Edit subscription¶
Modify delivery schedule, format, or activation status.
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionid |
body | string | yes | Subscription identifier. |
format |
body | string | yes | New format (json or html). |
crontab |
body | string | yes | New cron schedule. |
active |
body | string | yes | true to enable, false to disable. |
Query:
POST api/v3/subscriptions/editEmailSubscription/
Query example:
curl -X POST 'https://vulners.com/api/v3/subscriptions/editEmailSubscription/' -H "X-Api-Key: YOUR_API_KEY" -H 'Content-Type: application/json' -d '{
"subscriptionid": "{subscription id}",
"format": "json",
"crontab": "0 1 * * *",
"active": "false"
}'
edit_subscription = vulners_api.subscription.edit(
subscriptionid="subscription_id",
active="false"
)
{
"result": "OK",
"data": {
"id": "3C5SC5C5IS6DG9HE8BG470LBWBJWU0GTO2OAN93DLUJCSCH3SYWO1S13I8K17DSB",
"active": false,
"confirmed": false,
"query": "",
"query_type": "lucene",
"link_query": "/search?query=",
"crontab": "0 1 * * *",
"deliveryAddress": "[email protected]",
"deliveryFormat": "json"
}
}
Delete subscription¶
Remove an email subscription
Auth: X-Api-Key header required.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionid |
body | string | yes | Subscription identifier. |
Query:
POST /api/v3/subscriptions/removeEmailSubscription/
Query example:
curl -X POST 'https://vulners.com/api/v3/subscriptions/removeEmailSubscription/' -H "X-Api-Key: YOUR_API_KEY" -H 'Content-Type: application/json' -d '{
"subscriptionid": "{subscription id}"
}'
delete_subscription = vulners_api.subscription.delete(
subscriptionid="subscription_id",
)
{
"result": "OK",
"data": {}
}