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.
These endpoints give you API access to four monitoring features: Inspect schedules (internal controls monitoring), the document insight review queue, dark web monitoring, and the Certificate Vault.
All endpoints are scoped to the API key’s organization. See API conventions for shared behavior. List endpoints take limit and offset and return items, total, limit, and offset.
Routes that need a
dark_web_exposure permission, a role permission, or org_settings:update:org work with a user API key only. Service account keys do not hold those permissions, so use a key created by a person whose role holds them.
Each feature has its own gate. When your organization does not have the feature, its endpoints return 404 with one of these codes:
When your organization enforces roles and the key lacks the permission, the endpoint returns
403.
Some actions stay with a signed-in person. When an API key calls one of them, the endpoint returns 403 with the code api_key_not_allowed. These actions are: archiving or restoring a document insight (one at a time or in bulk), unlinking a custom field from an insight, resetting a dark web playbook, retiring a decision model, deleting an insight group or target, stopping an Inspect schedule, removing a watchlist identifier, marking a certificate verified, archiving a certificate, archiving a rule set, deleting an insight example or value, archiving or restoring an org document, deleting a document insight, rejecting a pending change, creating dark web roles, confirming a dark web setup step, provisioning or deprovisioning an Okta or Entra inspection identity, and rejecting or manually completing an access removal request. API keys never change roles.
List Inspect schedules
GET
GET /v1/inspect-schedulesboolean
default:"false"
Set to
true to include stopped schedules.integer
default:"20"
Page size, from 1 to 100.
integer
default:"0"
Number of schedules to skip.
Response
object[]
Pause or resume an Inspect schedule
POST
POST /v1/inspect-schedules/{schedule_id}/pausePOST
POST /v1/inspect-schedules/{schedule_id}/resumestring
required
The schedule ID.
Errors
List document insight pending changes
GET
GET /v1/document-insight-pending-changesstring
Only changes from this document insight.
string
Only changes from this document.
string[]
Any of
pending, approved, rejected, superseded. Repeat the parameter for more than one.integer
default:"50"
Page size, from 1 to 200.
integer
default:"0"
Number of changes to skip.
Response
object[]
Get the dark web summary
GET
GET /v1/dark-web/summaryResponse
boolean
Whether monitoring is switched on.
integer
Open exposures.
object
Open exposures per severity.
object
Open exposures per category.
integer
Exposures first seen in the last 7 days.
integer
Closed exposures.
integer
Exposures waiting for review.
integer
Exposures sent to Legal.
integer
Identifiers on the watchlist.
integer
Vendors in monitoring scope.
integer | null
Unix timestamp of the last sweep.
List dark web exposures
GET
GET /v1/dark-web/exposuresstring[]
Review statuses to include, for example
new or confirmed.string[]
Severities to include, for example
critical or high.string[]
Only exposures for these vendors.
string
Text match on the title and source.
integer
default:"50"
Page size, from 1 to 200.
integer
default:"0"
Number of exposures to skip.
Response
object[]
List vendor certificates
GET
GET /v1/vendor-certificatesstring
Only this vendor’s certificates.
string[]
Certificate types to include.
string[]
Any of
valid, expiring, expired.string
Text match on the certificate or vendor name.
integer
default:"50"
Page size, from 1 to 500.
integer
default:"0"
Number of certificates to skip.
Response
object[]
List Inspect applications
GET
GET /v1/inspect-applicationsboolean
default:"false"
Set to
true to include archived applications.integer
default:"50"
Page size, from 1 to 500.
integer
default:"0"
Number of applications to skip.
id, display_name, auth_method, platform_key, vendor_id, and is_archived.
List inspections
GET
GET /v1/inspectionsstring
Only inspections of this application.
integer
default:"20"
Page size, from 1 to 500.
integer
default:"0"
Number of inspections to skip.
id, target_id, app_name, purpose, status, is_archived, started_at, finished_at, and created_at.
List document insights
GET
GET /v1/document-insightsstring
Text match on the insight name.
boolean
Only enabled (
true) or disabled (false) insights.boolean
default:"false"
Set to
true to include archived insights.integer
default:"100"
Page size, from 1 to 500.
integer
default:"0"
Number of insights to skip.
id, field_name, field_key, field_description, field_type, field_mode, enabled, is_archived, document_types, and update_policy.
List a document’s insight values
GET
GET /v1/document-insight-valuesitems and total.
string
required
The vendor document ID.
id, config_id, field_name, value, source_quote, source_page_number, confidence, source_type, and answer_accepted_at.
Create an Inspect schedule
POST
POST /v1/inspect-schedules201 with the new schedule. A drift schedule repeats every interval_seconds; every other purpose runs monthly on day_of_month.
string
required
The Inspect application to inspect.
string[]
required
Control sets each inspection checks, in order.
integer
Day of the month to run, for evaluative and exploratory schedules.
integer
Seconds between runs, for drift schedules.
string
default:"evaluative"
evaluative, exploratory, or drift.boolean
default:"true"
Whether inspections may collect browser evidence.
422 with target_not_found, an archived one target_archived, and an invalid cadence or control set schedule_invalid.
To change a schedule’s cadence or control sets, send PATCH /v1/inspect-schedules/{schedule_id} with any of day_of_month, interval_seconds, and control_set_ids. To stop it for good, send DELETE /v1/inspect-schedules/{schedule_id}.
Create and manage document insights
To create an insight, sendPOST /v1/document-insights. It returns 201 with the insight.
string
required
The insight’s name, for example “Governing law”.
string
A stable key. Defaults to
field_name. A key already in use returns 409 with field_key_exists.string
What to extract and how.
string
default:"string"
string, number, date, or boolean.string
default:"extraction"
extraction quotes the document; synthesis writes text from it.string[]
Document types the insight reads. Empty means all.
string
The insight group to file it under.
string
default:"auto_fill"
auto_fill, or review_required to hold each change for a reviewer.string
The reviewer for
review_required changes.PATCH /v1/document-insights/{config_id} with the fields to change. Send reviewer_user_id: null to clear the reviewer. apply_mode decides what the new definition reaches: forward_only (the default) re-runs nothing, selected re-runs the documents in document_ids, and all_historical re-runs every in-scope document an older revision filled. A re-run starts in the background and its id comes back as backfill_id; poll GET /v1/document-insight-backfills/{backfill_id}. When a running backfill or a daily ceiling blocks the re-run, nothing is saved and the response is 409, 422, or 429 with backfill_refused. Making a synthesis insight anything but text returns 422 with synthesis_needs_text.
To edit many insights at once, send POST /v1/document-insights/bulk-update with config_ids (up to 200) and any of enabled, group_id, clear_group, add_document_types, and remove_document_types. Document types are added and removed, never replaced. To archive many at once, send POST /v1/document-insights/bulk-archive with config_ids; API keys cannot do this. Both return updated_count and the changed insights in items.
To retire an insight and keep its values, send POST /v1/document-insights/{config_id}/archive. To bring it back, send POST /v1/document-insights/{config_id}/restore.
Targets
A target links an insight to a built-in contract or document field it fills. To list them, sendGET /v1/document-insights/{config_id}/targets. To add one, send POST /v1/document-insights/{config_id}/targets with object_type (contract or vendor_document), field_name, and optionally conflict_policy (fill_if_empty, latest_document_wins, never_overwrite), min_confidence (low, medium, high), require_grounded, and enabled. A pairing no parser covers returns 422 with target_not_supported; a field the insight already fills returns 409 with target_exists.
To change a target, send PATCH /v1/document-insight-targets/{target_id}. To stop filling the field, send DELETE /v1/document-insight-targets/{target_id}. Values already written stay.
Groups
To list groups, sendGET /v1/document-insight-groups. To create one, send POST /v1/document-insight-groups with name and optionally description, document_types, sort_order, and enabled. To change one, send PATCH /v1/document-insight-groups/{group_id}; changing document_types rescopes every insight that inherits from the group. To delete one, send DELETE /v1/document-insight-groups/{group_id}. Its insights stay, outside any group.
Coverage
GET /v1/document-insight-stats returns one row per insight with how many eligible documents it applies to, how many hold a value, and its fill rate. Pass config_id one or more times to read only those insights.
Manage dark web monitoring
To read the policy, sendGET /v1/dark-web/config. To change it, send PATCH /v1/dark-web/config with any of is_enabled, monitor_organization, vendor_scope (radar_monitored or all), enabled_sources, lookalikes_for_vendors, confidence_threshold (0 to 1), and business_hours. Coverbase re-derives the watchlist right away, and switching monitoring on creates the dark web roles.
Review an exposure
To record a triage decision, sendPATCH /v1/dark-web/exposures/{exposure_id}/review. Only the fields you send change.
string
The new review status. Coverbase records every step in between.
string
A note on the decision. Send
null to clear it.string
Required with
false_positive.string
Assign the exposure to this member. They are notified.
boolean
default:"false"
Remove the current assignee.
new, confirmed, or with_legal runs your alert rules. Errors: 404 exposure_not_found, 422 assignee_not_member, 422 review_not_allowed.
Watchlist
To list watched identifiers, sendGET /v1/dark-web/watchlist. Values are masked. To add one, send POST /v1/dark-web/watchlist with subject_kind (organization or vendor), asset_type, value, and vendor_id for a vendor identifier. Optional fields: label, role (domains), program_vendor_id, card_kind, card_network (BINs), and linked_asset_id (mailboxes). Adding an identifier already there re-enables it.
To turn one on or off or change its details, send PATCH /v1/dark-web/watchlist/{asset_id}. To stop watching it, send DELETE /v1/dark-web/watchlist/{asset_id}; a derived identifier is switched off instead of removed.
Playbooks
To list every response checklist, sendGET /v1/dark-web/playbooks. To replace one with your own steps, send PUT /v1/dark-web/playbooks/{key} with steps, a list of { "id": optional, "label": required }. To go back to Coverbase’s default, send DELETE /v1/dark-web/playbooks/{key}.
Manage certificates and prequalification
To record a certificate by hand, sendPOST /v1/vendor-certificates with vendor_id, certificate_type, name, and optionally issuer, scope, result, coverages, valid_from, valid_to, and vendor_document_id. Coverbase re-checks the vendor’s prequalification.
To record a person’s check, send PATCH /v1/vendor-certificates/{certificate_id}/verification with verification_status (unverified, verified, discrepancy) and verification_note. To archive a certificate, send DELETE /v1/vendor-certificates/{certificate_id}.
To ask a vendor for a certificate, send POST /v1/vendor-certificate-requests with vendor_id, certificate_type, message, and due_at. The response gives the unsent supplier portal’s portal_id.
To ask for renewals in bulk, send POST /v1/certificate-renewal-jobs with certificate_ids, message, and due_at. It returns 202 with the job. To follow it, poll GET /v1/certificate-renewal-jobs/{job_id} until status is final; the counts show how many requests were sent, skipped, or failed.
To pull certificates from a connected network now, send POST /v1/certificate-networks/{network}/sync with isnetworld, avetta, or ecovadis. It returns 202.
Rule sets
A rule set lists the certificates vendors must hold. To list them, sendGET /v1/prequalification-rule-sets. To create or replace one, send POST /v1/prequalification-rule-sets or PUT /v1/prequalification-rule-sets/{rule_set_id} with name, description, applies_to, rules, expiry_reminder_days, and blocks_on_failure. Coverbase re-checks every governed vendor in the background. To archive one, send DELETE /v1/prequalification-rule-sets/{rule_set_id}.
To see where a vendor stands, send GET /v1/vendors/{vendor_id}/prequalification. To re-check it now, send POST /v1/vendors/{vendor_id}/prequalification/refresh.
Get a vendor’s security benchmark
GET
GET /v1/vendors/{vendor_id}/security-benchmarkscore, rated_vendors, percentile (null until enough vendors are rated), and grade_counts.
Query the Certificate Vault
POST
POST /v1/vendor-certificates/querystring
Only this vendor’s certificates.
string
Text match on the certificate or vendor name.
object
A unified filter rule group, the same DSL the other
/query endpoints take.string
One of
vendor_name, name, certificate_type, source, valid_to, created_at.boolean
default:"false"
Sort descending.
integer
default:"50"
Page size, from 1 to 500.
integer
default:"0"
Number of certificates to skip.
GET /v1/certificate-networks. Each item has network, display_name, is_connected, certificate_count, and last_synced_at. Credentials are never returned.
Correct a vendor’s external security scan
These endpoints change what the outside-in scan sees. The scan target belongs to the company, so every org linked to it sees the correction. Each write that changes the scan starts a rescan;rescan_started false means the rescan is queued, not dropped.
- To point the scan at the right domain, send
POST /v1/vendors/{vendor_id}/external-security/rescanwithdomain. The response gives the host it reduced to. - To record whether an attributed asset is the vendor’s, send
POST /v1/vendors/{vendor_id}/external-security/estate-reviewswithkind(domainorhost),identifier,review(unreviewed,confirmed,disputed), and an optionalnote. Only a change into or out ofdisputedstarts a rescan. - To add hosts or addresses the scan missed, send
POST /v1/vendors/{vendor_id}/external-security/estate-assetswithidentifiersand an optionalnote. The response listsadded,already_present, andrejected. - To see the companies the rating is compared against, send
GET /v1/vendors/{vendor_id}/external-security/peers. To queue the work a stale comparison needs, sendPOST /v1/vendors/{vendor_id}/external-security/peers/refresh. Setforceto re-choose the peers.
not_found, forbidden, and invalid.
List continuous monitoring findings
To list findings about your vendors, sendGET /v1/vendor-scan-results with optional vendor_id, risk_category, severity_low, severity_high, limit, and offset. To get one, send GET /v1/vendor-scan-results/{scan_result_id}. Each item has title, summary, risk_category, severity, urls, and published_at.
Review an extracted insight value
To accept an extracted value as the answer, sendPOST /v1/document-insight-values/{data_id}/accept with the value you saw in value_string, value_number, value_date, or value_boolean. A value that changed since returns 409 with value_changed. Accepting does not claim the quote was verified.
To mark a value correct or incorrect, send POST /v1/document-insight-values/{data_id}/verdict with verdict (correct, incorrect, or null to clear).
Teach a document insight with examples
A worked example shows an insight an excerpt and the answer it should give. An enabled example is part of what extraction is asked, so each change starts a new revision of the insight.- To list examples, send
GET /v1/document-insights/{config_id}/examples. - To add one, send
POST /v1/document-insights/{config_id}/exampleswithdocument_excerpt,expected_value(the answer in the insight’s type, or null for “not in the document”), and optionallyexplanation,document_id, andenabled. An answer that does not fit the insight’s type returns422withinvalid_expected_value. - To change one, send
PATCH /v1/document-insight-examples/{example_id}. Only the fields you send change. - To delete one, send
DELETE /v1/document-insight-examples/{example_id}. - To build an example from an extracted value, send
POST /v1/document-insight-values/{data_id}/to-examplewith an optionalexplanation. A value that cites no document text returns422withno_cited_text.
Re-run insights over existing documents
A backfill re-extracts insights in the background and costs model calls. Manual values are never overwritten. To see what a backfill would do, sendPOST /v1/document-insight-backfills/preview. It runs nothing.
string
default:"never_attempted"
never_attempted, missing_only, outdated_revision, or all.string[]
Insights to re-run. Empty means every enabled insight.
string[]
Only these document types.
string[]
Only these vendors’ documents.
string[]
Only these documents.
boolean
default:"false"
Re-fill values a person emptied on purpose.
document_count, insight_count, estimated_model_calls, manually_cleared_count, and blocked_reason when it could not start now.
To start one, send the same body to POST /v1/document-insight-backfills. It returns 202 with the backfill. Poll GET /v1/document-insight-backfills/{backfill_id} until status is completed, failed, or cancelled. A run over the per-run or per-day ceilings, or with nothing to do, returns 422, 409, or 429 with backfill_refused. To stop dispatching more documents, send POST /v1/document-insight-backfills/{backfill_id}/cancel. Work already started finishes.
Escalate an exposure, sync the watchlist, and set retention
- To open a finding from an exposure, send
POST /v1/dark-web/exposures/{exposure_id}/escalatewith optionaltitleandassigned_to_id. A second call returns the samefinding_id. - To re-derive the watchlist from your organization and vendor records now, send
POST /v1/dark-web/watchlist/sync. The response counts identifierscreated,kept, andarchived. - To read how long each class of dark web data is kept, send
GET /v1/dark-web/retention. To change it, sendPUT /v1/dark-web/retentionwithexposures_years,evidence_years,audit_years, andsweep_history_years. A shorter period purges older data at the next nightly run.
Work with your organization’s own documents
Org documents are files your organization owns, such as policies, questionnaire and report templates, and exports.- To list them, send
GET /v1/org-documentswith optionaldocument_type,search,limit, andoffset. - To download one, send
GET /v1/org-documents/{document_id}/download. The response gives a presignedurlthat is valid forexpires_inseconds. Follow it with a plainGETand no auth header. - To rename, retype, archive, or restore one, send
PATCH /v1/org-documents/{document_id}with any ofname,document_type, andis_archived. - To upload one, send
POST /v1/org-documentsasmultipart/form-datawithfileand optionaldocument_typeandname. It returns201with the document. Anassessment_report_templatemust be a valid.docx: another extension returns400withtemplate_must_be_docx, and a file that does not open as Word returns400withinvalid_template.
Correct or remove extracted values
- To replace an extracted value with the right one, send
POST /v1/document-insight-values/{data_id}/correctwith one ofvalue_string,value_number,value_date, orvalue_boolean. The correction becomes a manual value that no re-extraction overwrites, and Coverbase writes it to linked fields. A value that does not fit the insight’s type returns422withinvalid_value. - To delete a value, send
DELETE /v1/document-insight-values/{data_id}. - To judge many values at once, send
POST /v1/document-insight-values/bulk-verdictwithidsandverdict(correct,incorrect, or null). The response givesupdated_countandfound_count; a value that already holds the verdict is skipped.
Fill a custom field from a document insight
Promoting an insight links it to a custom field on vendors, services, assessments, or contracts, so each extracted value also fills that field.- To see which custom fields an insight could fill, send
GET /v1/document-insights/{config_id}/promotion-options.compatible_field_typenames the custom field type the insight can fill, or is null when its type cannot fill one yet. Each item givescustom_field_id,field_name,field_type,applied_to, andis_linked. - To link it, send
POST /v1/document-insights/{config_id}/promotewith eithercustom_field_id(an existing field) ornew_field_nameandapplied_to(vendor,service,assessment, orcontract) to create one. Optional fields arerequire_grounded(defaulttrue),min_confidence(high,medium, orlow; defaultmedium),conflict_policy(never_overwrite,fill_if_empty, orlatest_document_wins; defaultfill_if_empty), andbackfill(defaulttrue, which fills the field from existing documents in the background). The response givescustom_field_id,created_custom_field, andbackfill_queued. An archived insight returns409withdocument_insight_archived, a field that already has another autofill source returns409withcustom_field_has_autofill_source, and a type or target mismatch returns422withpromotion_invalid. - To stop filling a field, send
DELETE /v1/document-insights/{config_id}/custom-fields/{custom_field_id}. It returns204. Values already written stay. A field the insight does not fill returns409withcustom_field_not_linked.
Train a decision model
A decision model is the model document insight extraction uses for your organization. You can start one from a base model, train it on your verified values, and switch extraction to it once it scores at least as well as the standard model. Responses never include storage locations or job identifiers.- To list models, send
GET /v1/document-insight-models. The response also givesbase_model_idsyou can start from,active_model_id, andtraining_configured. - To start one, send
POST /v1/document-insight-modelswithnameandbase_model_id. An unlisted base model returns422withbase_model_not_allowed. - To collect verified values into its training set, send
POST /v1/document-insight-models/{model_id}/dataset.dataset_statsgives the counts. - To compare it with the standard model, send
POST /v1/document-insight-models/{model_id}/evaluatewith an optionalmax_documents(1 to 100, default 25). It returns202and costs model calls. Poll the list untileval_result.statusis no longerrunning. - To start fine-tuning, send
POST /v1/document-insight-models/{model_id}/training. Training runs for hours. To record its progress, sendPOST /v1/document-insight-models/{model_id}/training/sync. - To switch extraction to it, send
POST /v1/document-insight-models/{model_id}/activate. A trained model is held back until its accuracy check passes;activation_blocked_reasonsays why. - To retire it, send
POST /v1/document-insight-models/{model_id}/retire. Retiring the active model returns extraction to the standard model. API keys cannot retire.
409 with decision_model_conflict.
Add an Inspect application
POST
POST /v1/inspect-applications201. When the application’s login domain matches exactly one of your vendors, Coverbase links that vendor.
string
required
The name you see for the application.
string
required
How Inspect signs in:
password_url, okta_app, entra_app, or oauth_google.string
The sign-in page, as an absolute
http or https URL. Required for password_url and oauth_google. For okta_app and entra_app, Coverbase uses the URL the identity provider reports when you leave it out.string
The Okta application ID. Required for
okta_app, and Okta must be connected.string
The Entra application ID. Required for
entra_app, and Entra must be connected.string
The SaaS platform the application runs on, from
GET /v1/inspect-platforms.string
The HTTPS origin of the application’s API, for example
https://api.example.com.POST /v1/inspect-applications/bulk with applications, a list of the same objects. Coverbase validates every entry before it creates any, so one invalid entry refuses the whole batch. The response has items in request order.
Response
string
Application ID.
string
The application’s name.
string
How Inspect signs in.
string | null
The sign-in page.
string | null
The API origin.
string | null
The linked Okta application.
string | null
The linked Entra application.
string | null
The SaaS platform.
boolean
Whether the application is archived.
boolean
Whether a one-time code or passkey factor is enrolled.
string
linked, suggested, ambiguous, or unresolved.string | null
The linked vendor.
string | null
The one vendor that matches the login domain, when the application has no vendor yet.
string[]
Vendors that match when the match is ambiguous.
Errors
Get or change an Inspect application
To read one application, sendGET /v1/inspect-applications/{application_id}. It returns the same shape as the create response. An unknown ID returns 404 with application_not_found.
To rename an application or change its login URL, send PATCH /v1/inspect-applications/{application_id} with display_name, login_url, or both. Omitted fields keep their value. To make an Okta or Entra application use the URL its identity provider reports, send login_url: null. A password_url or oauth_google application keeps its URL and returns 422 with login_url_required. A blank name returns 422 with display_name_blank.
To link an application to one of your vendors, send PUT /v1/inspect-applications/{application_id}/vendor with vendor_id. An unknown or archived vendor returns 404 with vendor_not_found.
To set the platform, send PUT /v1/inspect-applications/{application_id}/platform with platform_key (or null to clear it) and an optional api_authority. When you leave out api_authority, the current one stays.
To link several applications to their suggested vendors, send POST /v1/inspect-applications/link-suggested-vendors with up to 200 application_ids. An application that already has a vendor, or whose match is ambiguous, stays as it is. When an ID is unknown, nothing changes and the endpoint returns 404 with application_not_found.
All of these need the integration:update:org permission, except the read, which needs integration:read:org.
Archive or delete an Inspect application
To stop Inspect checking an application and keep its history, sendPOST /v1/inspect-applications/{application_id}/archive. To restore it, send POST /v1/inspect-applications/{application_id}/unarchive. To archive or restore up to 200 at once, send POST /v1/inspect-applications/bulk-archive with application_ids and is_archived.
To delete an application for good, send DELETE /v1/inspect-applications/{application_id}. Coverbase removes its saved sign-in sessions and stored credentials, then returns 204. You cannot undo a delete.
API keys cannot archive, restore, or delete applications. A signed-in user must do it.
Errors
Read setup options and platforms
To list what you can pick when you start an inspection, sendGET /v1/inspect-setup-options. The response has applications (each with id and display_name) and control_sets (each with id, name, and control_count). Only internal control sets with at least one active control appear.
To list the platform keys you can assign to an application, send GET /v1/inspect-platforms. The response has platform_keys.
Both need the integration:read:org permission.
Read and change an application’s config
GET
GET /v1/inspect-applications/{application_id}/configResponse
string
Application ID.
string
The application’s name.
string | null
How Inspect signs in.
boolean
Whether every required credential is stored, or a ready single sign-on session covers it.
object[]
Each with
key, label, input_kind, usage (sign_in, sso_identity, or api), required, and configured.object[]
Each with
key, label, description, and the stored value.object[]
API request parameters the application’s plans need. Each with
key, name, location (path or query), value_type, description, allowed_values, and the stored value.string | null
The API origin.
PATCH
PATCH /v1/inspect-applications/{application_id}/configapi_authentication_parameters and request_parameters (objects keyed by the key the read returns) and api_authority. Coverbase validates every value before it saves any, and returns the updated config. You set sign-in and API credentials in Coverbase, not through the API, so a credentials field returns 422.
The read needs integration:read:org and the update needs integration:update:org.
Errors
Prepare Inspect plans
A plan says which evidence Inspect collects for one control on one platform, and how. Inspect can start an inspection only when every control in the chosen set has a ready plan.GET
GET /v1/inspect-plans/readinessintegration:read:org.
string
required
The internal control set.
string
required
The Inspect application. It must have a platform.
boolean
default:"true"
Set to
false to count only API evidence.POST
POST /v1/inspect-plans/ensurecontrol_set_id, application_id, and an optional browser_evidence_allowed. Preparation runs in the background, and the response is the readiness after Coverbase queued it. Poll GET /v1/inspect-plans/readiness until the set is ready. Needs integration:run:org.
Errors
Read and edit an Inspect plan
To read a plan, sendGET /v1/inspect-plans/{plan_id}. The response has id, source_control_id, platform_key, version, scope (public or organization), is_latest_version, superseded_reason, outdated, plan_content_hash, the full plan, and created_at. outdated is true when newer documentation or a newer planner would build a different plan.
To list a plan’s published versions without their bodies, send GET /v1/inspect-plans/{plan_id}/versions. Each item has id, version, plan_content_hash, is_latest_version, superseded_reason, published_by_user_id, derived_from_plan_id, and created_at.
To edit a plan, send the whole edited plan with the plan_content_hash you read:
- To check an edit without saving it, send
POST /v1/inspect-plans/{plan_id}/revisions/validate. The response gives theplan_content_hashthat publishing would store. - To publish it as the next version, send
POST /v1/inspect-plans/{plan_id}/revisions. It returns201with the new version.
control_id, one of your own controls the plan covers. You can change wording and route hints. You cannot change what evidence the plan collects.
Reads need integration:read:org. Edits need integration:update:org.
Errors
Regenerate an Inspect plan
When a plan isoutdated, you choose when to replace it. To retire your organization’s plan and prepare a fresh one, send POST /v1/inspect-plans/{plan_id}/regenerate. The retired version stays readable, and inspections that used it keep it. The response has superseded_plan_id and the preparation, which is null when a current public plan already covers the control.
To redesign how Inspect checks one requirement after a run failed it, send POST /v1/inspect-plans/{plan_id}/requirements/{requirement_key}/regenerate with the run_id. The plan stays live until the new version publishes. The response has the preparation.
Both need integration:update:org.
Errors
Start an inspection
POST
POST /v1/inspections201. The inspection runs in the background. To follow it, poll GET /v1/inspections/{inspection_id}. Every control needs a ready plan first, so check GET /v1/inspect-plans/readiness and prepare missing plans with POST /v1/inspect-plans/ensure.
string
required
The Inspect application.
string[]
required
The internal control sets to check.
string
default:"evaluative"
evaluative scores each control, exploratory collects evidence without a score, and drift compares against an earlier inspection.string
For
drift only: a finished inspection of the same application that ran every control set you send.string
The vendor to attribute results to. It defaults to the application’s vendor and must match it when the application has one.
string
Links the inspection to a schedule. The schedule must be active and match the application, vendor, control sets, purpose, and
browser_evidence_allowed.boolean
default:"true"
Set to
false to collect only API evidence.integration:run:org.
Response
string
Inspection ID.
string | null
The application.
string
The application’s name when the inspection started.
string | null
The vendor.
string[]
The control sets checked.
string
evaluative, exploratory, or drift.string
The inspection’s status.
boolean
Whether browser evidence is collected.
string | null
The inspection a drift run compares against.
string | null
The linked schedule.
boolean
Whether the inspection is archived.
integer
Unix timestamp.
integer | null
Unix timestamp.
integer | null
Unix timestamp.
object[]
One per control:
id, status, control_id, control_set_id, retry_of_run_id, started_at, and finished_at.Errors
Find inspections
To read one inspection, sendGET /v1/inspections/{inspection_id}. It returns the same shape as the create response. An unknown ID returns 404 with inspection_not_found.
To filter inspections, send POST /v1/inspections/query with an optional filter in the unified filter language, sort, exclude_probes, limit (1 to 500, default 50), and offset. The response has items in the shape above, total, limit, and offset.
Both need integration:read:org.
Archive, cancel, or retry inspections
- To archive or restore up to 500 inspections, send
POST /v1/inspections/bulk-archivewithinspection_idsandis_archived(defaulttrue). API keys cannot archive or restore inspections, and the call needsintegration:update:organdintegration:archive:org. - To cancel every unfinished control of up to 500 inspections, send
POST /v1/inspections/bulk-cancelwithinspection_ids.affected_idslists the inspections that had a control to cancel. - To cancel some controls of one inspection, send
POST /v1/inspections/{inspection_id}/runs/bulk-cancelwithrun_ids. - To run finished controls again, send
POST /v1/inspections/{inspection_id}/runs/bulk-retrywithrun_ids. Setuse_current_controltotrueto run each control’s current version. When that version has no ready plan, nothing restarts, Coverbase starts preparing the plan, and the call returns409withplans_not_ready.
integration:run:org. Each returns affected_ids.
Errors
Read the Inspect overview
To read your posture score across each application’s latest scored inspection, sendGET /v1/inspect-posture. The response has percent, which is null until an application has a scored inspection, and app_count.
To read the overview, send GET /v1/inspect-summary with an optional days (1 to 365, default 30). The response counts issues (issues_open, issues_resolved, issues_dismissed, issues_total, and issues_by_severity), findings (findings_new, findings_overdue, findings_total), applications (applications_connected, applications_inspected, applications_never_inspected, applications_with_connection_issues), and runs (runs_completed, runs_partial, runs_failed, runs_total). top_vendors and top_applications rank by issue count, each with id, name, and issue_count.
Both need integration:read:org.
Work with the identity directory
The identity directory lists the people and services Inspect found in Okta, Entra, and inspected applications, with the accounts each holds.- To count identities by the views the dashboard offers, send
GET /v1/inspect-identities/summary. The response hasidentities,with_accounts,guests,admin_observed,observed,needs_attribution,observations_total, andobservations_attributed. - To filter identities, send
POST /v1/inspect-identities/querywith an optionalfilter,sort,search,limit(1 to 500, default 50), andoffset. Each item hasid,display_name,primary_email,association,account_count,admin_account_count,needs_review_count, andlatest_observed_at. - To assign accounts Inspect observed to an identity, send
PUT /v1/inspect-accounts/ownerwithaccount_idsandidentity_id. To hand the accounts back to automatic matching, sendidentity_id: null. Only accounts known from inspections can be assigned. - To move every observed account of some identities to another identity, send
POST /v1/inspect-identities/mergewithidentity_idsandinto_identity_id. You cannot merge away an identity from Okta or Entra. - To set which SaaS platform an Okta or Entra application is, send
PUT /v1/inspect-idp-applications/{application_id}/platformwithplatform_key, or null to clear it. - To read one identity, send
GET /v1/inspect-identities/{identity_id}. It takeslimit(1 to 100, default 25) andoffsetfor its accounts. The response has the identity’s emails, directory records (principals), a page ofaccountswith the properties read from each, itsdetections, andaccount_count. - To read what an identity did in Okta or Entra, send
GET /v1/inspect-identities/{identity_id}/eventswithlimitandoffset. The response hassources, the newesteventsfirst, andtotal_count. - To see why an account belongs to an identity, send
GET /v1/inspect-identities/{identity_id}/accounts/{account_id}/evidencewithlimit(1 to 100, default 5),offset, andkind(all,events, orobservations). The response hasitems, each an observation with the application, run and time it came from. - To list the applications that hold accounts, send
GET /v1/inspect-account-applicationswith an optionalsearch,ids, andlimit(up to 100). - To list application credentials, such as API keys and service tokens Inspect found, send
GET /v1/inspect-credentials. Filter withapplication_id(repeatable) andclassification(ownerless_credential,unused_credential, orexpired_credential). The response is metadata only: type, owner, expiry, last use, and detections. It never holds a secret value. - To rebuild the whole inventory, send
POST /v1/inspect-identities/reconcile. It returns202withrequest_idandqueued. Only an organization admin can start a rebuild, so API keys cannot. PollGET /v1/inspect-identities/reconcile/{request_id}, which returnsstatus:queued,running,succeeded, orfailed.
request_id and queued. Coverbase then rebuilds the identity inventory in the background, so counts follow the decision within a few minutes. Reads need integration:read:org and changes need integration:update:org. A full rebuild needs integration:run:org.
Errors
Manage saved sign-in sessions
Inspect saves a sign-in session (an auth context) per single sign-on provider or application, and reuses it across runs. The API returns each session’sid, label, principal_login, status, allowed_domains, last_validated_at, last_stale_at, last_stale_reason, and last_error. It never returns browser identifiers.
- To list them, send
GET /v1/inspect-auth-contexts. - To create the session for a provider, send
POST /v1/inspect-auth-contextswith optionallabel,provider_config, andallowed_domains. Leave outprovider_configfor Okta. When a session for the provider exists, Coverbase returns it. The session starts empty, and Inspect signs in on the next run. - To make Inspect sign in again, for example after a password change, send
POST /v1/inspect-auth-contexts/{auth_context_id}/stalewith an optionalreason. - To sign a single sign-on session in now, send
POST /v1/inspect-auth-contexts/{auth_context_id}/bootstrap. It returns202with the session, and the sign-in runs in the background. A sign-in already under way comes back as it is. An application’s session signs in only when an inspection reaches its sign-in page, so the call returns422.
integration:read:org. Creating and flagging need integration:update:org. Signing in now needs integration:run:org.
Errors
Find documentation for a control
Inspect builds plans from vendor documentation for each platform.- To list the documents for an application’s platform, send
GET /v1/inspect-applications/{application_id}/documentation. The response hasplatform_key,bundle_id,activated_at, anddocuments, each withkey,title,usage, andcanonical_url. An application without a platform has no documents. - To search for the documentation a control needs, send
POST /v1/inspect-documentation-discovery-runswithcontrol_idandapplication_id. It returns202with the run. A run already queued for the same pair is returned instead of a new one. - To follow a run, send
GET /v1/inspect-documentation-discovery-runs/{run_id}. The run hasid,control_id,application_id,platform_key,status,phase,outcome,failure_code,resource_bundle_id,created_at,started_at, andfinished_at. - To read one document’s text, send
GET /v1/inspect-applications/{application_id}/documentation/{document_key}with akeyfrom the list. The response haskey,title,media_type,text, andtruncated, which is true when the text stopped at one million characters.
integration:read:org. Starting a run needs integration:run:org.
Errors
Read Okta and Entra connections
- To list the applications synced from Okta, send
GET /v1/okta-integration/applications. For Microsoft Entra, sendGET /v1/entra-integration/applications. Both takelimit(1 to 500, default 100) andoffset. Each item hasid,provider_app_id,display_name,status,sign_on_mode,login_url,platform_key,vendor_id, andlast_synced_at. - To read how often Coverbase syncs Okta, send
GET /v1/okta-integration/schedule. The response hasconnected,sync_interval_hours,last_synced_at, andnext_sync_at. - To change it, send
PUT /v1/okta-integration/schedulewithsync_interval_hoursset to6,12,24, or168, or null to sync only when someone asks. - To read the latest sync, send
GET /v1/okta-integration/sync. The response hasjob, which is null when Okta never synced. A job hasid,kind,status,stage,incremental,inventory_ready,applications_ready,applications_total,access_synced_count,groups_synced_count,can_resume, record counts,last_error,started_at, andcompleted_at. A sync that stopped reporting progress reads asfailed. - To disconnect Okta, send
DELETE /v1/okta-integration. Inspect stops syncing it and keeps the synced history. It returns204. - To sync Okta now, send
POST /v1/okta-integration/syncwith optionalresume(continue the last failed sync) andfull(reread everything). It returns202withsync_job_idandstatus. A sync already running comes back instead of a new one. PollGET /v1/okta-integration/sync. - To check the connection against Okta, send
POST /v1/okta-integration/verify. The response hasstatus(connectedorerror),error_category,remediation_hint, andrequirements, each withid,label,status, anddetail. - To compare the scopes Inspect needs with the ones your Okta app granted, send
GET /v1/okta-integration/scopes. The response hasrequested_scopes,granted_scopes, andmissing_scopes. - To read one Okta application, send
GET /v1/okta-integration/applications/{application_id}. The response has its sign-on mode, whether Inspect can sign in to it, its assignment count, and its vendor link. It leaves out the raw Okta record, which can hold credentials. To list who is assigned to it, sendGET /v1/okta-integration/applications/{application_id}/users. - To list the people in your Okta directory with their application accounts and findings, send
GET /v1/okta-integration/identitieswithlimit(1 to 500, default 100) andoffset. For counts only, sendGET /v1/okta-integration/identities/summary. - To read the Okta user Inspect signs in as, send
GET /v1/okta-integration/inspection-identity. The response haslogin,status,credentials_configured,grants,recent_actions,manual_steps, andwrite_allowed. It says whether a password is stored and never returns it. - To provision that user and assign it to applications, send
POST /v1/okta-integration/provisionwithapplication_ids, an optionallogin, andapproved: true. To remove its access, sendPOST /v1/okta-integration/deprovisionwithapproved: true, anddelete_user: trueto delete the Okta user too. Both return202and run in the background. - To check every Okta application Inspect can sign in to, send
POST /v1/okta-integration/inspect-runs. It returns202with the run. PollGET /v1/okta-integration/inspect-runs/{run_id}, which adds each application’s result. - For Microsoft Entra, send
POST /v1/entra-integration/verifyto check the Microsoft Graph permissions, andPOST /v1/entra-integration/syncto sync applications, people, and assignments. The sync finishes before the call returns. To read the Entra user Inspect signs in as, sendGET /v1/entra-integration/inspection-identity. To provision it, sendPOST /v1/entra-integration/provisionwithapplication_ids, an optionaluser_principal_name, andapproved: true.
Errors
Watch or download a control run’s browser
When Inspect checks a control in a browser, it records each browser tab.- To list a run’s recorded tabs, send
GET /v1/inspections/{inspection_id}/runs/{run_id}/replay. The response hasstatus(ready,preparing, orunavailable) andpages, each withpage_id. A recording reads aspreparingfor about a minute after the run finishes. - To download one tab, send
GET /v1/inspections/{inspection_id}/runs/{run_id}/replay/pages/{page_id}. The response is an HLS playlist (application/vnd.apple.mpegurl) whose segment links are short-lived, so play or save it right away. - To watch a running control, send
GET /v1/inspections/{inspection_id}/runs/{run_id}/live-view. The response haslive_view_urlandpages, each withpage_id,title, andlive_view_url. The fields are null when the control is not running. Anyone with a live view link can watch until it expires, so do not store or share it.
integration:read:org.
Errors
Run probes
A probe is a custom check Inspect runs on one application, once as a preview or on a schedule. Each run is a sample.- To draft a probe, send
POST /v1/inspect-probes/preparewithtarget_id(the application),objective, and an optionalname. Inspect plans checkpoints from the platform’s documentation. Nothing is saved. - To save the draft, send
POST /v1/inspect-probeswith the draft’sdraft_id,target_id,name,resource_bundle_id, andspec, and an optionalinterval_seconds(900 to 604800, default 3600). It returns201with the probe, paused. - To run a sample now, send
POST /v1/inspect-probes/{probe_id}/previewwith anidempotency_key. It returns202with the sample’sinspection_idandrun_id. Sending the same key again returns the first sample. - To turn on its schedule, send
PATCH /v1/inspect-probes/{probe_id}/automationwithenabled: trueand an optionalinterval_seconds. Inspect needs a reviewed preview of the current procedure and every requirement ready, or the call returns409.
POST /v1/inspect-probes/{probe_id}/versions with expected_version (the version you read), resource_bundle_id, and spec. When someone published since, it returns 409.
- To list probes, send
GET /v1/inspect-probeswith an optionalapplication_id,limit(1 to 100, default 25), andoffset. To filter them, sendPOST /v1/inspect-probes/querywithfilter,sort,search,application_id,limit, andoffset. The response hasprobesandtotal. - To read one probe with its procedure, readiness, automation, and latest sample, send
GET /v1/inspect-probes/{probe_id}. - To list samples, send
GET /v1/inspect-probes/{probe_id}/runs. To read one sample with each checkpoint’s result and its evidence, sendGET /v1/inspect-probes/{probe_id}/runs/{run_id}. - To keep a sample for an auditor, send
GET /v1/inspect-probes/{probe_id}/runs/{run_id}/package. It returns a zip with a manifest, a printable summary, and the screenshots.X-Missing-Screenshotscounts screenshots Coverbase could not read. The response is never cached. - To see each scheduled launch and whether a sample started, send
GET /v1/inspect-probes/{probe_id}/deliverieswith optionalbefore,after,exclude_accepted, andlimit.
definitions routes are deprecated. New probes do not need a definition.
Errors
Raise an evaluation as a Finding
When an Inspect evaluation fails, you can raise it as a Finding.- Send
POST /v1/inspect-evaluations/{evaluation_id}/finding. A new Finding returns201withfindingandcreated: true, and Coverbase drafts its recommended remediation in the background. When the evaluation already raised one, the call returns200with that Finding andcreated: false. It needsfinding:create:org. - To draft the recommended remediation for a Finding Inspect raised whose guidance is empty, send
POST /v1/findings/{finding_id}/recommended-remediation/draft. It returns202. Guidance someone wrote or cleared is never replaced, so the call returns409. It needsfinding:update:org. - To read the guidance, send
GET /v1/findings/{finding_id}/recommended-remediation. The response hasstatus(available,drafting,cleared, orabsent) andrecommended_remediation. It needsfinding:read:org.
Errors
Poll an operation’s events
Inspect logs each step of a run, a sign-in, a plan preparation, or a documentation search. To read the log, sendGET /v1/inspect-events with exactly one of run_id, auth_context_id, application_id, plan_preparation_id, or documentation_discovery_run_id. Events come oldest first, up to limit (1 to 500, default 500). To read only newer events, pass the last sequence you read as after_sequence. This replaces the dashboard’s live stream. It needs integration:read:org.
Decide an access removal request
A workflow can propose removing identity provider assignments from a vendor’s users. Approving one stays in Coverbase.- To reject a request, send
POST /v1/access-removal-requests/{request_id}/rejectwith an optionalreason. - To close a request after a person removed the rows in the identity provider, send
POST /v1/access-removal-requests/{request_id}/complete-manuallywith theitem_idsthey removed.
integration:update:org.
Export, import, and test insight definitions
- To export your insight library, send
GET /v1/document-insight-definitionswith an optionalinclude_archived. Each item is a portable definition keyed byfield_key, with no ids and no extracted values. - To import definitions, send
POST /v1/document-insight-definitionswithdefinitions(up to 500) and an optionaloverwrite_existing(defaultfalse). An insight whosefield_keyalready exists is skipped unless you overwrite. The response listscreated_field_keys,updated_field_keys, andskipped_field_keys. - To try a definition before saving it, send
POST /v1/document-insight-definitions/testwithfield_nameand any offield_description,field_type,field_mode,document_types,sample_size(1 to 5),config_id, anddocument_ids. It runs one model call per document and saves nothing. Each item gives the answer, its quote, and, withconfig_id, whether it matches the value the insight holds now. A scope with no readable documents returns422withno_documents_to_test.
Delete a document insight
Deleting removes the insight and every value it ever extracted. It cannot be undone, so it takes two steps.- Archive the insight with
POST /v1/document-insights/{config_id}/archive. - Send
GET /v1/document-insights/{config_id}/delete-preview. The response givesextracted_value_countandlinked_custom_field_names. - Send
DELETE /v1/document-insights/{config_id}?acknowledged_value_count=N, whereNis the count the preview gave. It returns204.
409 with insight_not_archived, a count that changed returns 409 with value_count_changed, and an insight that still fills a custom field returns 409 with linked_custom_fields. Unlink those fields first.
Read value history and coverage
- To read every value change for one insight, newest first, send
GET /v1/document-insights/{config_id}/eventswithlimit(1 to 200) andoffset. For one value’s timeline, sendGET /v1/document-insight-values/{data_id}/events. Each item givesevent_type,trigger,actor_name,document_name,before, andafter. - To read every recorded revision of a definition, send
GET /v1/document-insights/{config_id}/revisions. - To read the coverage matrix, send
GET /v1/document-insight-coveragewith optionaldocument_typeandconfig_id, each repeatable.rowsgives each document type’s totals, andcellsgives each insight’seligible,filled,grounded,needs_review,never_attempted, andfill_rateper type. - To see what waits for a person, send
GET /v1/document-insight-inbox. It countsfield_changes,disagreements,unverified_evidence, andaccuracy_misses. - To list the built-in contract and document fields an insight can fill, send
GET /v1/document-insight-target-fields.
Browse and compare extracted values
- To filter every value in your organization, send
POST /v1/document-insight-values/querywith any ofconfig_ids,document_types,vendor_ids,source_type,confidence,grounded,needs_review,has_value,search,verdict,outdated,config_revision,limit(1 to 200), andoffset. - To compare values side by side, send
POST /v1/document-insight-values/pivotwithdocument_types(1 to 20) and optionalconfig_ids,vendor_ids,search,limit, andoffset. Each row is a document, andcellsmaps each insight ID to its value. A missing key means nothing was extracted.
Evidence images
- To list a value’s verified citations, send
GET /v1/document-insight-values/{data_id}/snippets. Each item givesevidence_fingerprint, the quote and page, andstatus. Arenderedcitation carries a presignedurlto its page image, valid forexpires_inseconds. Follow it with a plainGETand no auth header. - To render a citation’s image, send
POST /v1/document-insight-values/{data_id}/snippetswithevidence_fingerprint. It returnsqueuedand renders in the background. List the snippets again for the link. A fingerprint that matches no current citation returns404withcitation_not_found.
Export an insight’s values
- To list the columns an export can hold, send
GET /v1/document-insight-export-columns. - To export, send
POST /v1/document-insights/{config_id}/exportwith any ofcolumns,data_ids, the value filters,include_empty, andmulti_value_mode. The response gives a presignedurlto the workbook,filename,expires_in,exported_rows, andavailable_rows. Every export is recorded on the insight’s activity.
Check a decision model’s accuracy
- To read a check’s scorecard, send
GET /v1/document-insight-models/{model_id}/scorecard. It givesbase,candidate, andshadowscores, overall and per insight, with reviews applied. - To work through the misses, send
GET /v1/document-insight-models/{model_id}/exampleswith optionalrole,config_id,outcome,reviewed,limit, andoffset. - To settle one miss, send
POST /v1/document-insight-eval-examples/{example_id}/reviewwithdecision(team_right,ai_right,both_fine, or null to clear).ai_rightalso corrects the checked value to the AI’s answer, which needsvendor:updateon that vendor. - To see one insight’s training set, send
GET /v1/document-insight-models/{model_id}/dataset-preview?config_id=...with an optionalstatus(train,holdout,used_as_example, orno_evidence). - To answer live documents with a trained model beside production, send
PUT /v1/document-insight-models/{model_id}/shadowwithenabled. Only one model shadows at a time, and nothing it answers is saved. A model that is not trained and ready returns409withshadow_unavailable.
Run an insight on a document
- To run a saved insight on one document, send
POST /v1/documents/{document_id}/insight-extractionswithconfig_id. It costs one model call, returns the answer with its quote and confidence, and saves nothing. - To try an unsaved definition, send
POST /v1/documents/{document_id}/insight-previewswithfield_nameand optionalfield_description,field_type, andfield_mode. It returns202with a job. PollGET /v1/document-insight-previews/{job_id}untilstatusiscompletedorfailed. Only the key or person that started a preview reads it.
Retrain the document type model
Your organization’s document type model is a fork of a shared base model. To read where both stand, sendGET /v1/document-type-decision-model. To retrain your fork, send POST /v1/document-type-decision-model/train-fork. It returns 202. A run already in progress returns 409 with training_running, and a missing base model returns 409 with base_model_missing. Without the feature, both return 404 with document_type_model_not_enabled.
Reject a pending change
To reject a proposed field change, sendPOST /v1/document-insight-pending-changes/{change_id}/reject. Nothing is written to the target record. An already resolved change returns 409 with change_already_resolved. API keys cannot approve or reject changes, so a signed-in person does it.
Work an exposure
- To read one exposure, send
GET /v1/dark-web/exposures/{exposure_id}. It adds the playbook,baseline_item_id, andfollow_up_finding_idto the list fields. The matched value stays masked, and opening an exposure is audited. For its status history, sendGET /v1/dark-web/exposures/{exposure_id}/history. - To read its playbook, send
GET /v1/dark-web/exposures/{exposure_id}/playbook. To tick or untick a step, sendPATCHto the same path withstep_idanddone. A step that is not on the playbook returns422withstep_not_on_playbook. - To move many held exposures at once, send
POST /v1/dark-web/exposures/bulk-reviewwithexposure_ids(up to 200),action(promoteordismiss), and, to dismiss,false_positive_reason. Only exposures still in Needs review move. The rest come back inskippedwithnot_foundornot_in_needs_review. - To read evidence, send
GET /v1/dark-web/exposures/{exposure_id}/evidence. Each capture gives its metadata and a presigneddownload_urlfor the redacted capture, valid forexpires_inseconds. The content is never inline, every read is audited, and the response is never cached. - To start a follow-up with a partner, send
POST /v1/dark-web/exposures/{exposure_id}/partner-follow-upwith optionaltitle,assigned_to_id, andnote. It opens a finding on the exposure’s vendor, or on the partner a program BIN runs for. It does not contact the partner: whether and how the partner hears stays your decision. A second call returns the open finding withcreatedset tofalse. - To read one vendor’s dark web picture, send
GET /v1/dark-web/vendors/{vendor_id}.
Run the dark web program
- To run a sweep now, send
POST /v1/dark-web/sweeps. It returns202. One sweep runs at a time, so a second call returnsactive_run_id. To list sweeps, sendGET /v1/dark-web/sweeps. - To read the setup checklist, send
GET /v1/dark-web/setup. To record that a person reviewed the alert rules or the business hours, sendPOST /v1/dark-web/setup/confirm/{confirmation}withalert_rules_reviewedorbusiness_hours. API keys cannot confirm a step. - To preview a retention change, send
GET /v1/dark-web/retention/previewwith any ofexposures_years,evidence_years,audit_years, andsweep_history_years. It counts what the next purge removes and givesnext_purge_at. - To read the program report, send
GET /v1/dark-web/reportwithfrom_ts,to_ts, and optionaltime_zone. It returns aggregates only. Each read is audited. - To export the queue, send
POST /v1/dark-web/exposures/exportwith the queue filters. The response gives a presignedurlto a CSV with no summary, matched value, or evidence. More than the export limit returns413withexport_too_large. - To read the sources, send
GET /v1/dark-web/sources. To read the managed AI fraud terms, sendGET /v1/dark-web/ai-fraud-terms.
Baseline
The baseline is the list of exposures your organization already knew about.- To read a file’s columns, send
POST /v1/dark-web/baseline/previewasmultipart/form-datawithfile(.csvor.xlsx). It suggests a mapping and stores nothing. - To import, send
POST /v1/dark-web/baseline/importasmultipart/form-datawithfile,mapping(a JSON object from each baseline field to a column), anddry_run.dry_rundefaults totrue, so sendfalseto keep the import. A re-import replaces every item. - To read the baseline, send
GET /v1/dark-web/baseline. Identifiers are masked.
Alert rules
- To list the rules in evaluation order, send
GET /v1/dark-web/alert-rules. - To add one, send
POST /v1/dark-web/alert-ruleswith the whole rule:name,is_enabled,applies_in_addition,match,recipients,channels,clock, andescalation. To replace one, sendPATCH /v1/dark-web/alert-rules/{rule_id}with the whole rule. To set the order, sendPUT /v1/dark-web/alert-rules/orderwithrule_ids. These need an organization admin. - To see how often a rule would have fired, send
POST /v1/dark-web/alert-rules/previewwithmatch. It counts exposures first seen in the last 30 days. - To check your SIEM’s parser, send
POST /v1/dark-web/alert-rules/test. It sends a fictional, signedDarkWebExposure.Createdto every webhook subscribed to dark web events, so it contacts your webhook endpoints.
Access
To read the roles that open dark web monitoring and what each can do, sendGET /v1/dark-web/access. To create the designated roles your organization is missing, send POST /v1/dark-web/access/roles. It never changes a role that exists. API keys never change roles.