Private Beta
.md

BountyHub Docs

CVE Watcher API and Scopes

Reference for the CveWatcherService ConnectRPC API: list, filter, and fetch CVEs, read vendor and product facets, and manage push channel assignments.

CVE Watcher API and scopes

CVE Watcher is exposed through the ConnectRPC service bountyhub.cve.v1.CveWatcherService. The Hub UI, the generated TypeScript SDK (cveWatcherClient), and your own clients all call the same unary methods.

#Transport and authentication

  • Protocol: ConnectRPC over HTTPS.
  • RPC path: /<package>.<Service>/<Method>, for example /bountyhub.cve.v1.CveWatcherService/ListCves.
  • Authentication: a session cookie (browser) or a Personal Access Token sent as Authorization: Bearer <token>.
  • Payloads: Connect JSON or protobuf. The examples below use JSON.

Create a PAT with the scopes in the table below — see Personal Access Token scopes for the UI and scope hierarchy.

#Methods and scopes

MethodReturnsRequired scope
ListCvesA page of CVE feed entriesNotificationRo
GetCveOne CVE feed entryNotificationRo
ListCveFacetsDistinct vendor and product valuesNotificationRo
ListCveWatcherNotificationChannelsYour channel assignmentsIntegrationRo
AssignCveWatcherNotificationChannelThe assignment idIntegrationRw
UnassignCveWatcherNotificationChannelEmpty responseIntegrationRw

NotificationRo is the read side of the Notifications scope; IntegrationRo / IntegrationRw are the Integrations scope. Write scopes require their read counterpart.

#ListCves

json
FieldTypeNotes
severitiesCveSeverity[]Empty or omitted means all severities.
ransomwareOnlyboolRestrict to KEV entries with known ransomware use.
searchstringThe query language — see Search and filters.
pageSizeuint32Default 25, maximum 100.
pageTokenstringOpaque cursor from the previous response.

Results are ordered by CVE id descending. Pass nextPageToken from the response as pageToken to continue; an empty token means the last page.

bash

The response contains items and nextPageToken:

json

uint64 fields such as publishedVersion are strings in Connect JSON.

#CveItem fields

FieldTypeMeaning
cveIdstringCVE identifier.
kevAddedtimestampDate CISA added the CVE to KEV. Empty for early exploit-sweep entries.
kevDuetimestampCISA remediation deadline.
vendor, productstringNormalized from KEV when present, otherwise NVD.
shortDescriptionstringOne-line description.
ransomwareboolKnown ransomware campaign use (KEV).
cvssV3doubleCVSS v3 base score, 0.0 – 10.0.
severityenumCVE_SEVERITY_CRITICAL, CVE_SEVERITY_HIGH, CVE_SEVERITY_MEDIUM, CVE_SEVERITY_LOW, CVE_SEVERITY_NONE, or CVE_SEVERITY_UNKNOWN.
epssdoubleFIRST EPSS probability, 0.0 – 1.0.
exploitAvailableboolNVD references public exploit code.
exploitTierstringDerived signal: confirmed, likely, watch, or none.
statusenumPipeline position — see below.
publishedVersionuint64Published version. 0 means never published.
updatedboolTrue when publishedVersion > 1 (a re-announcement).
userVisibleAttimestampWhen the CVE entered every user's feed.
createdAttimestampWhen the row was first ingested.

#Status values

ValueMeaning
CVE_STATUS_INGESTEDRow exists but has not been announced. Early exploit-sweep rows stay here.
CVE_STATUS_PUBLIC_PUBLISHEDPublic digest stage completed.
CVE_STATUS_USER_VISIBLEVisible in every user's in-app feed.
CVE_STATUS_NOTIFIEDPaid push fan-out completed.
CVE_STATUS_FAILEDPublication failed; the worker retries.

#GetCve

json

Returns { "item": CveItem }, or NOT_FOUND when the CVE is not in the feed.

#ListCveFacets

Returns distinct, alphabetically sorted values for filter autocomplete:

json

Up to 1,000 values are returned per list. Empty vendor or product values are excluded.

#Manage push channels

Assignments are per user and limited to one channel per integration kind. Assigning a channel of a kind that is already assigned replaces it.

bash

ListCveWatcherNotificationChannels returns items of CveWatcherNotificationChannelAssignment:

FieldMeaning
idAssignment id, used to unassign.
notificationChannelIdThe assigned notification channel.
integrationKindbountyhub.integration.v1.IntegrationKind as an int64, serialized as a string in JSON (Discord, Slack, Mail, Telegram, Webhook).
notificationChannelNameChannel name, for display.
integrationNameIntegration name, for display.

Pagination: default 25, maximum 500, ordered by assignment id descending.

#Errors

Connect codeWhen
UNAUTHENTICATEDMissing or invalid session cookie or PAT.
PERMISSION_DENIEDThe PAT lacks the required scope.
FAILED_PRECONDITIONAssigning a channel on a free plan.
NOT_FOUNDUnknown CVE, or a notification channel you do not own.
INVALID_ARGUMENTMalformed id or page token.