For AI agents: a documentation index is available at https://docs.coverbase.com/llms.txt — this page is also available in markdown by appending .md to the URL.
A vendor (cbvndr_...) is a parent supplier entity. A service (cbsvc_...) is a child entity under a vendor. This API creates and reads both.
All endpoints are org-scoped to the API key. See API conventions for authentication, IDs, timestamps, idempotency, and the error envelope.
To upload, version, and search bills of materials (SBOM, AIBOM, HBOM, SaaSBOM) for a vendor or service, see the Bill of Materials API.
To upload evidence documents (SOC 2 reports, policies, contracts, questionnaires) for a vendor and link them to its services and assessments, see the Documents API.
| Method | Path | Idempotent |
|---|---|---|
POST | /v1/vendors | Yes (Idempotency-Key) |
GET | /v1/vendors/{vendor_id} | — |
PATCH | /v1/vendors/{vendor_id} | No |
POST | /v1/vendors/{vendor_id}/services | No |
PATCH | /v1/vendors/{vendor_id}/services/{service_id} | No |
GET | /v1/vendors/{vendor_id}/fact-sheet | — |
POST | /v1/vendors/{vendor_id}/fact-sheet/refresh | No |
The primary contact object
Both vendor and service endpoints accept/return aprimary_contact. On a vendor it is the address the inherent-risk-questionnaire portal invite (and other vendor emails) are sent to; on a service it is the service-level point-of-contact.
| Field | Type | Notes |
|---|---|---|
email | string | Required, validated as an email address. |
name | string | null | Contact name. |
title | string | null | Contact title. |
phone_number | string | null | Contact phone. |
primary_contact is derived from the stored contact personnel (first entry with an email) — for vendors it falls back to the vendor’s security contact email. It is null if no contact is set.
Assigning people (analysts, owners, watchers)
Vendors and services accept optional personnel assignments as arrays of user IDs (cbuser_...). All are optional; on create, omit them to assign no one. On update (PATCH), supplying an array replaces the existing set — pass [] to clear it, or omit the field to leave it unchanged.
| Field | Vendor | Service | Meaning |
|---|---|---|---|
risk_analyst_ids | ✓ | — | Risk analysts. Vendor-only — services do not have risk analysts. |
relationship_owner_ids | ✓ | ✓ | Relationship owners. |
watcher_ids | ✓ | ✓ | Watchers (users who follow the vendor/service for notifications). |
Create a vendor
POST /v1/vendors201 Created with the full vendor object.
Request body
Vendor name.
Vendor website URL.
Vendor description.
Headquarters location.
How the vendor is used within the organization.
Your system’s identifier for this vendor (e.g. an Ariba request ID). Stored and echoed back; useful for correlation.
Risk analyst user IDs (
cbuser_...) to assign. See assigning people.Relationship owner user IDs (
cbuser_...) to assign.Watcher user IDs (
cbuser_...) to assign.The vendor point-of-contact (see the primary contact object). If supplied,
email is required and validated.Headers
Bearer ak_...Optional. Replaying the same key within 24 hours returns the original
201 body. See Idempotency.Example request
Example response
201 Created — the full vendor object (see response fields below):
Error responses
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "invalid_vendor", "message": "..."}} | Creation rejected by a business rule. |
| 422 | Standard validation error | name missing, body malformed, or primary_contact.email not a valid email. |
Create a child service
POST /v1/vendors/{vendor_id}/services201 Created.
This endpoint does not honor
Idempotency-Key — sending the header is harmless but has no effect. Retrying after a successful create makes a second service.Path parameters
The parent vendor ID (
cbvndr_...).Request body
Service name.
Service description.
Your system’s identifier for this service.
Tag IDs (
cbtag_...) to attach to the service.Relationship owner user IDs (
cbuser_...) to assign. See assigning people.Watcher user IDs (
cbuser_...) to assign.The service point-of-contact (see the primary contact object). If supplied,
email is required and validated.Services do not have risk analysts — risk analysts are assigned on the parent vendor. Sending
risk_analyst_ids to a service endpoint has no effect.Example request
cURL
Example response
201 Created (see the service object):
Service object
Service ID (
cbsvc_...).The parent vendor ID.
Service name.
Service description.
Your external identifier, if supplied.
Tag value strings (empty array if none).
Relationship owner user IDs (
cbuser_...). Empty array if none.Watcher user IDs (
cbuser_...). Empty array if none.The service point-of-contact (see the primary contact object), or
null.Unix timestamp (seconds).
Error responses
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "invalid_service", "message": "..."}} | Creation rejected by a business rule. |
| 404 | {"detail": {"code": "vendor_not_found", "message": "Vendor not found."}} | vendor_id does not exist or is not in the API key’s org. |
| 422 | Standard validation error | name missing or body malformed. |
Update a service
PATCH /v1/vendors/{vendor_id}/services/{service_id}Path parameters
The parent vendor ID (
cbvndr_...).The service ID (
cbsvc_...). Must belong to vendor_id.Request body
Service name.
Service description.
Replace the service’s tag set (tag IDs
cbtag_...).Replace the relationship owner set (user IDs
cbuser_...). Pass [] to clear.Replace the watcher set (user IDs
cbuser_...). Pass [] to clear.Replace the service point-of-contact (see the primary contact object). When supplied,
email is required and validated.external_id is set only at creation and is not updatable here. Services do not have risk analysts.Example request
cURL
Error responses
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "invalid_service", "message": "..."}} | Update rejected by a business rule. |
| 404 | {"detail": {"code": "service_not_found", "message": "Service not found."}} | The service does not exist, or does not belong to vendor_id, or is not in the API key’s org. |
| 422 | Standard validation error | Body failed schema validation. |
Retrieve a vendor
GET /v1/vendors/{vendor_id}Path parameters
The vendor ID (
cbvndr_...).Example request
cURL
Example response
Vendor object
Vendor ID (
cbvndr_...).Your external identifier, if set.
Vendor name.
Vendor website URL.
Vendor description.
Headquarters location.
Current status as a plain label string (e.g.
"Active"). Org-customizable. null if unset.ID (
cbst_...) of the current status record.Tag value strings (empty array if none).
Assigned risk analyst user IDs (
cbuser_...).Relationship owner user IDs (
cbuser_...).Watcher user IDs (
cbuser_...).Scale level ID (
cbsclvl_...) for inherent risk.Scale level ID (
cbsclvl_...) for residual risk.Type of engagement with this vendor.
How the vendor is used.
Derived vendor tier (e.g.
tier_1, tier_2). Set by workflow tiering actions; null until derived.The vendor point-of-contact (see the primary contact object), or
null.The vendor’s child services, each a service object. Empty array if none.
Unix timestamp (seconds) of creation.
Unix timestamp (seconds) of last update.
Error responses
| Status | Body | When |
|---|---|---|
| 404 | {"detail": {"code": "vendor_not_found", "message": "Vendor not found."}} | vendor_id does not exist or is not in the API key’s org. |
Update a vendor
PATCH /v1/vendors/{vendor_id}Every body field is optional. Sending
null for a field is treated the same as omitting it (no change) — there is no clear-to-null behavior.Request body
Vendor name.
Vendor website URL.
Vendor description.
Headquarters location.
ID (
cbst_...) of a status record to transition to.Replace the entire tag set, using tag IDs (
cbtag_...).Replace the risk analyst set (user IDs
cbuser_...). Pass [] to clear.Replace the relationship owner set (user IDs
cbuser_...). Pass [] to clear.Replace the watcher set (user IDs
cbuser_...). Pass [] to clear.Scale level ID (
cbsclvl_...) for inherent risk.Scale level ID (
cbsclvl_...) for residual risk.How the vendor is used.
Type of engagement.
Replace the vendor point-of-contact (see the primary contact object). When supplied,
email is required and validated.external_id and tier are not updatable through this endpoint (external_id is set only at creation; tier is derived by workflows).Example request
cURL
Error responses
| Status | Body | When |
|---|---|---|
| 400 | {"detail": {"code": "invalid_update", "message": "..."}} | Update rejected (e.g. an invalid reference ID). |
| 404 | {"detail": {"code": "vendor_not_found", "message": "Vendor not found."}} | vendor_id not found / not in org. |
| 422 | Standard validation error | Body failed schema validation. |
The vendor fact sheet
The fact sheet is AI-generated company intelligence about a vendor — company profile, products, public perception, financials, leadership, compliance/legal posture, and security posture. Coverbase assembles it from public sources; in the dashboard it powers the vendor “Fact Sheet” tab and its PDF export. These two endpoints let you read that data and trigger a regeneration programmatically. Generation is asynchronous. Trigger it with the refresh endpoint, then poll the fact sheet endpoint untilstatus is "completed".
status | Meaning |
|---|---|
null | Never generated. Call the refresh endpoint to populate it. |
"pending" | Generation is in progress. |
"completed" | The most recent generation run finished successfully. |
"failed" | The most recent generation run failed. Trigger another refresh to retry. |
Retrieve a vendor’s fact sheet
GET /v1/vendors/{vendor_id}/fact-sheet200 with status: null and every section null — it is not a 404.
Path parameters
The vendor ID (
cbvndr_...).Example request
cURL
Example response
200 OK:
Fact sheet object
The vendor ID (
cbvndr_...).ID of the underlying entity that holds the fact sheet data.
null if the vendor is not yet linked to an entity.Section names completed so far in the in-progress / most recent run. Empty array if none.
Unix timestamp (seconds) the fact sheet was last updated.
null if never generated.Company profile (name, website, industry, HQ, founding year, headcount, revenue, etc.).
null until generated.Known products and offerings.
null until generated.News mentions, third-party reviews (BBB, Trustpilot, CFPB), and competitors.
null until generated.Public/private status, market cap, ticker/exchange, funding, and transactions.
null until generated.Leadership and headcount estimate.
null until generated.Legal actions, enforcement actions, and data-privacy certifications.
null until generated.Trust center URL, security contact, and known security incidents.
null until generated.Section objects are best-effort and their internal shape may evolve as Coverbase improves enrichment. Treat the presence of each field defensively; any individual section can be
null even when status is "completed" if no data was found for it.Error responses
| Status | Body | When |
|---|---|---|
| 404 | {"detail": {"code": "vendor_not_found", "message": "Vendor not found."}} | vendor_id does not exist or is not in the API key’s org. |
Refresh a vendor’s fact sheet
POST /v1/vendors/{vendor_id}/fact-sheet/refresh202 Accepted and status: "pending". Existing fact sheet data is cleared at the start of the run, so a GET made right after a refresh reflects the pending state. Poll the fact sheet endpoint until status is "completed".
This endpoint is not idempotent — each call queues a fresh generation run.
Path parameters
The vendor ID (
cbvndr_...).Example request
cURL
Example response
202 Accepted:
The vendor ID (
cbvndr_...).ID of the underlying entity, or
null when the vendor is being linked to one for the first time as part of this run.Always
"pending" on a successful enqueue.Human-readable acknowledgement.
Error responses
| Status | Body | When |
|---|---|---|
| 404 | {"detail": {"code": "vendor_not_found", "message": "Vendor not found."}} | vendor_id does not exist or is not in the API key’s org. |