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 manage what surrounds an assessment: the plans new assessments start from, the triggers that open reassessments, assessment SLAs and missing documents, risk results, evals in bulk, reviews, follow-ups to vendors, vendor SLAs, scales, and monitoring records. Each response uses the same shape the Coverbase dashboard reads.
All endpoints are org-scoped to the API key. See API conventions for shared behavior. List endpoints take limit (1 to 200, default 50) and offset (default 0) and return items, total, limit and offset. None of these endpoints honor Idempotency-Key.
Errors
Every error body has adetail object with a code and a message.
Assessment plans
An assessment plan is the template a new assessment starts from: its control sets, questionnaires, document collection mode, reviewer and naming.List plans
GET
GET /v1/assessment-plansboolean
Set to
true to include archived plans. Default false.Create a plan
POST
POST /v1/assessment-plans201 Created with the plan.
string
required
The plan name.
string[]
Control sets every assessment from this plan includes.
string[]
Questionnaires every assessment from this plan sends.
string
manual (default), auto or none.string
The default reviewer. Use
assignee_group_id for a user group instead.description, risk_type, questionnaire_fill_mode, portal_due_days, assessment_name_format, control_set_rules, portal_template_id, doc_collection_settings, follow_up_settings, irq_review_questionnaire_id, irq_review_due_days and recheck_unresolved_controls, with the same meaning as in the dashboard. An API key cannot set summary_instructions.
Get, update and set the default
GET /v1/assessment-plans/{assessment_plan_id} returns one plan. PATCH takes the same fields as create. An omitted field keeps its value, and an explicit null clears a clearable field. A list replaces the plan’s control sets or questionnaires.
To make a plan the org default, send PUT /v1/assessment-plans/{assessment_plan_id}/default with {"is_default": true}. Send false to stop it being the default.
Approval options
GET /v1/approval-options lists the outcomes a reviewer picks from when completing an assessment. Set include_archived=true to include archived options.
To add an option, send POST /v1/approval-options with label, color and icon. PATCH /v1/approval-options/{approval_option_id} changes any of the three. Archiving an option is not available to API keys.
Reassessment triggers
A reassessment trigger opens a draft reassessment when a radar event matches its rules and vendor scope.Create a trigger
POST
POST /v1/reassessment-triggersstring
required
The trigger name.
string
required
The plan the reassessment runs.
boolean
Whether the trigger fires. Default
true.description, assignee_id, applies_to_all_vendors, scope_vendor_ids, scope_tag_ids, scope_tiers, notify_user_ids, ai_instruction and rules.
List, get and update
GET /v1/reassessment-triggers lists triggers (include_archived includes archived ones). GET /v1/reassessment-triggers/{trigger_id} returns one. PATCH updates it: an omitted field keeps its value, and null clears description, assignee_id, scope_tag_ids, scope_tiers, ai_instruction or rules.
Assessment actions and reads
Clone an assessment
POST /v1/assessments/{assessment_id}/clone copies an assessment with its scope and documents and starts the copy’s AI run. Returns 201 Created with the new id, name, vendor_id and run_started.
Resume an assessment
POST /v1/assessments/{assessment_id}/resume restarts the assessment’s AI run from its latest step and closes an open vendor portal first. Returns 202 Accepted. It returns 409 with assessment_run_active while a run is already going, and 400 with assessment_no_control_source when the assessment has nothing to evaluate.
Regenerate the summary
POST /v1/assessments/{assessment_id}/rerun-summary regenerates the AI summary from the current evals. Add risk_domain_id as a query parameter to regenerate only that risk domain’s summary. Send {"expected_summary_revision": <n>} with the revision you last read: when the summary changed before or during generation, the call returns 409 with summary_conflict and nothing is saved. The response has the assessment id and its current summary_revision.
Rerun failed evals
POST /v1/assessments/{assessment_id}/rerun-failed-evals reruns every eval that failed and clears the run errors. Returns 202 Accepted.
SLA
GET /v1/assessments/{assessment_id}/sla returns each SLA stage’s target, elapsed time and status, overall and per risk domain.
To override targets or measured response times, send PATCH /v1/assessments/{assessment_id}/sla. Values are in days. An omitted field keeps its value, and null clears the override.
integer
Target for document submission.
review_days, follow_up_days and commitment_days set the other targets.integer
Measured review time to record instead of the computed one.
doc_submission_response_days, follow_up_response_days and commitment_response_days work the same way.boolean
true counts weekdays only. false counts calendar days.Missing documents
To record why a requested document is not provided, sendPUT /v1/assessments/{assessment_id}/missing-documents/{document_type} with a reason. document_type is a document type slug, for example soc2_type2. DELETE on the same path removes the reason and returns 204 No Content. The PUT returns 403 with missing_document_reasons_disabled when your organization turned the feature off, and 404 with document_type_not_requested when the assessment does not ask for that document.
Risk reads
Evals in bulk
Each endpoint takesids, a non-empty list of eval IDs, and returns the IDs it changed and the IDs it skipped. An eval a person already reviewed is skipped unless include_reviewed is true.
Correct an eval’s answer
To fix the vendor answer an eval scored, sendPOST /v1/evals/{eval_id}/correct-response with the correct option. Coverbase records the answer on the assessment and re-evaluates the eval and the evals that depend on its answer. The response has the eval id and its corrected response.
string
The correct option for a single-choice control. An explicit
null clears the answer.string[]
The correct options for a multiple-choice control.
string
Why the answer is corrected.
object
Preserved dependent reviews to reopen, as a map of eval ID to review revision.
404 with eval_not_found for an unknown eval, and 409 with eval_correction_rejected when the eval cannot take the correction, for example because it is archived.
Rerun an eval
To preview a fresh AI evaluation of one eval, sendPOST /v1/evals/{eval_id}/rerun. You can pass guidance, expectation or question to try instead of the control’s. The call returns 202 with a job_id and job_status set to pending, or 404 with eval_not_found when the eval cannot be rerun.
Poll GET /v1/evals/{eval_id}/rerun/{job_id} until job_status is completed or failed. A completed job has the proposed title, analysis, issue_category, is_issue, score and response. Citations to records you cannot read are left out. A failed job has job_error. An unknown job returns 404 with eval_rerun_job_not_found.
The rerun changes nothing on the eval. Applying its result rewrites the verdict, so a person does that in Coverbase.
Reviews
GET /v1/reviews lists reviews (sign-offs). Filter with assessment_id, risk_domain_id, assignee_id or contract_id, and set include_archived=true to include archived reviews. GET /v1/reviews/{review_id} returns one review.
Follow-ups
A follow-up is a question to the vendor about one eval. Follow-ups are sent in follow-up rounds.Create a follow-up
POST
POST /v1/follow-ups201 Created. The follow-up joins the assessment’s current round.
string
required
The eval the question is about.
string
required
The question to the vendor.
string[]
Document type slugs the vendor must upload.
additional_instructions and use_control_question.
List, get and update
GET /v1/follow-ups lists follow-ups (filter with assessment_id or eval_id). GET /v1/follow-ups/{follow_up_id} returns one with the vendor’s response. PATCH changes question, additional_instructions, required_document_types or use_control_question. An API key cannot change is_archived.
To create and edit many follow-ups in one all-or-nothing save, send POST /v1/follow-ups/bulk with items (1 to 500). An item with an id updates that follow-up, and an item without one creates a follow-up. The response lists the saved follow-ups.
GET /v1/follow-up-rounds lists rounds (filter with assessment_id), and GET /v1/follow-up-rounds/{round_id} returns one round with its follow-ups.
To get the assessment’s current unsent round, creating it when there is none, send POST /v1/follow-up-rounds/current with assessment_id. PATCH /v1/follow-up-rounds/{round_id} sets follow_up_ids (replacing the set), instructions or status. A sent round cannot go back to unsent or be emptied; the call returns 422 with invalid_follow_up_round.
Send a round
To send a round to the vendor, sendPOST /v1/follow-up-rounds/{round_id}/send. Coverbase puts the round’s follow-ups in a questionnaire on the assessment’s vendor portal and marks the round sent. The response has the questionnaire_id, assessment_id and portal_id.
string[]
The follow-ups to send. Leave it out to send the round’s follow-ups.
string
Instructions shown to the vendor.
integer
Unix timestamp the vendor should answer by.
string
The vendor contact who answers the round.
boolean
Email the recipient an invitation. Needs
recipient_email and either email_subject or email_template_id.string
Subject of the invitation email.
string
An email template to use instead of a subject.
string[]
Addresses copied on the invitation.
boolean
Let the vendor prefill answers with AI.
boolean
Show control identifiers next to the questions.
error_message says so. The call returns 404 with follow_up_round_not_found for an unknown round, and 422 with follow_up_round_not_sendable when the round cannot be sent, for example because it has no follow-ups or its responses are already in.
Vendor SLAs
To track an SLA on a vendor, sendPOST /v1/slas with vendor_id and name. The body also accepts status, service_id, risk_domain_id, description, metric, target, unit, frequency, current_value, last_measured_at, due_date, assignee_id, measurement_source, radar_origin_id and component_key. A status-page SLA takes its first measurement right away. Returns 201 Created.
PATCH /v1/slas/{sla_id} changes the same fields. An omitted field keeps its value, and an explicit null clears a clearable field. An API key cannot set is_archived.
GET /v1/slas lists service level agreements tracked on vendors. Filter with vendor_id, service_id or status (on_track, at_risk, breached, met), and set include_archived=true to include archived ones. GET /v1/slas/{sla_id} returns one SLA, and GET /v1/slas/{sla_id}/measurements returns the measurement periods of a status-page SLA, newest first.
Scales
GET /v1/scales lists control scales with their levels (include_archived includes archived ones). GET /v1/scales/{scale_id} returns one scale.
POST /v1/scales creates a control scale from name, description and levels (each with name, criteria, value, color and raise_issue) and returns 201 Created. PATCH /v1/scales/{scale_id} renames it, reorders its levels with level_ids, or sets is_default. To drop a level from a risk scale, send remap to move what used it to another level. An API key cannot send is_archived, so a person retires and restores scales.
POST /v1/scales/{scale_id}/levels adds a level and returns 201 Created. PATCH /v1/scales/{scale_id}/levels/{level_id} edits one; send residual_risk_remaining as null to go back to the derived share. The assessment rating scale changes only through its own endpoints and returns 422 assessment_scale here.
POST /v1/scales/{scale_id}/apply puts controls on the scale. Send controls_by_control_set, a map from control set ID to control IDs. The response returns the controls now on the scale.
Every scale write needs a key created by a person whose role holds org_settings:update:org. An unknown scale returns 404 scale_not_found, and an unknown level 404 scale_level_not_found.
Monitoring records
A monitoring record collects what monitoring observed about a vendor between two assessments. These endpoints return the record’sid, vendor_id, status, verdict and qualifying_count.
To add an event you observed, send POST /v1/monitoring-records/{record_id}/entries.
integer
required
When it happened, as a Unix timestamp inside the record’s window.
string
required
What happened.
boolean
false records the event as informational. Default true.severity and note.
To change how an entry counts, send POST /v1/monitoring-records/{record_id}/entries/{entry_id}/disposition with disposition set to counts, informational or null (back to the policy). An API key cannot send waived.
To re-sync a vendor’s record now, send POST /v1/vendors/{vendor_id}/monitoring-record/refresh. It returns null when the vendor has no completed assessment to monitor from.
To read records in full, send POST /v1/monitoring-records/query. It filters by status (default open), verdicts, vendor_ids, closes_before, closes_after and search, sorts with sort and descending, and pages with limit and offset. It returns items, total and verdict_counts. GET /v1/monitoring-records/{record_id} returns one record with its entries, and GET /v1/vendors/{vendor_id}/monitoring-records returns the vendor’s chain of records and the open one in current.
GET /v1/monitoring-policy returns the policy records are scored under. PUT /v1/monitoring-policy replaces it, and open records use it from their next sync. Replacing it needs a key created by a person whose role holds org_settings:update:org; a policy that breaks a rule returns 422 invalid_monitoring_policy. When monitoring records are not enabled for your organization, these routes return 404 not_enabled.
Background AI jobs
A model call from the API runs in the background. The route that starts one returns202 Accepted with a job: id, kind, status (pending, completed or failed), created_at, started_at, completed_at, error and result. Poll GET /v1/ai-jobs/{job_id} until status leaves pending. Only the key that started a job reads it back, and it needs the permission that started it.
POST /v1/assessments/{assessment_id}/follow-up-suggestionsasks for a follow-up question or the documents to request for each eval. Sendtarget(questionorrequired_document_types) and up to 200eval_ids. The result lists one item per eval. Nothing is saved.POST /v1/assessments/{assessment_id}/template-filler-jobsruns the report template agent on oneprompt, with dates intimezone. The result’sresultis the text. Nothing is saved.POST /v1/evals/{eval_id}/analysis-summarywrites a new short summary of the eval’s analysis and saves it when the job completes. The job fails if the analysis changed while the summary was written.
POST /v1/evals/bulk-correct-response keeps each eval’s current answer and evaluates it again. Send up to 500 eval_ids. It returns 202 Accepted with queued_eval_ids.
Assessment exports
Every export runs in the background and returns202 Accepted with an export: id, status, progress and file_name. Poll GET /v1/assessment-exports/{export_id}. Once status is complete, the response carries a presigned download_url valid for expires_in seconds. Follow it with a plain GET and no auth header. The response is sent with Cache-Control: no-store.
POST /v1/assessments/{assessment_id}/exports/pdfbuilds the PDF report. It takesexport_filename,export_mode(standardordetailed),timezoneand theinclude_*switches the dashboard offers. Snippet images citing a record your key cannot read are left out.POST /v1/assessments/{assessment_id}/exports/wordfills one of your Word report templates. Sendexport_filename,template_idandtimezone.POST /v1/assessment-exportsexports the assessments afilterselects to a workbook namedfile_name. Omitfilterfor every assessment.POST /v1/assessment-exports/evalsexports every result betweenstart_dateandend_date.POST /v1/assessment-exports/portfoliobuilds the portfolio PDF over the slicerequestselects. It needs the new PDF report, and returns404withnot_enabledwithout it.
Library documents
To copy documents from Coverbase’s library for the vendor onto the vendor and attach them to an assessment, sendPOST /v1/assessments/{assessment_id}/library-documents with up to 100 entity_document_ids. A file the assessment already has, or one that cannot be copied, is listed in skipped_entity_documents with the reason.
Trust center
POST /v1/assessments/{assessment_id}/trust-center-runs sends Coverbase’s agent to the vendor’s trust center to collect the assessment’s documents. This contacts the vendor: the agent visits the vendor’s trust center. From the API it never submits an access request form and never accepts an NDA or terms. A person does that from Coverbase. Omit requested_document_names to ask for the documents the assessment still needs, or set document_retrieval_scope to retrieve_everything. An assessment with a run under way returns that run.
Read the runs with GET /v1/assessments/{assessment_id}/trust-center-runs and what the agent did on one with GET .../trust-center-runs/{run_id}/events. GET /v1/assessments/{assessment_id}/trust-center-status says where collection stands, and GET .../trust-center-request-identity says who an access request would come from. GET /v1/trust-center-access-requests/{access_request_id} returns an access request and its decision.
Claim checks
A claim check tests each answer on a submission against the vendor’s evidence. These routes need claim checks to be enabled for your organization, and return404 with not_found otherwise.
GET /v1/questionnaire-responses/{response_id}/claim-checksreturns the latest run and every answer’s verdict with its citations.POST .../claim-checks/runchecks the submission in the background, or only thequestion_idsyou send. A run already queued or running is returned instead.POST .../claim-checks/cancelstops a run that has not started. It returns409withclaim_check_not_queuedwhen no run is waiting.POST .../claim-checks/raise-issuesraises one issue per answer inquestion_ids.POST .../claim-checks/ask-vendorasks the vendor about each answer inquestion_idswith yourmessage. This contacts the vendor: the message is posted on the supplier request thread the vendor reads.
Assessments
These routes run the same logic as the dashboard and return its shapes.POST /v1/assessments/queryfilters, sorts and pages assessments with the dashboard’s filter language.POST /v1/assessments/bulkstarts one assessment per vendor invendor_service_ids.PATCH /v1/assessments/{assessment_id}updates an assessment. An API key cannot setis_archived,status_id,recommendationor the approval option, or move the assessment to complete.POST /v1/assessments/{assessment_id}/completecompletes an assessment with its outcome. It needs a person’s key.POST /v1/assessments/{assessment_id}/portalopens a vendor portal with thequestionnaire_idsyou send. Nothing is sent to the vendor.GET .../run-status,GET .../evidence-sufficiency,GET .../control-set-complianceandGET .../residual-step-down-holdsread the assessment.GET /v1/assessment-collection-stage-statssays how long each collection stage takes in your org.PUT .../summary-instructionschooses the saved summary instructions the summary uses.GET .../irq-reviewreads the inherent risk check a reassessment opened with, andPOST .../irq-review/skipstarts the assessment without it.PUT .../vendor-rating/{control_set_id}sets or clears an analyst level on the vendor rating.
POST /v1/assessment-plans/document-requirements-preview and POST /v1/assessment-plans/{assessment_plan_id}/document-requirements show the documents a plan’s collection would pursue.
Properties fields, doc evals and evals
/v1/assessment-properties-fields lists, adds (POST), changes (PATCH) and removes (DELETE) the fields the assessment properties panel shows. Removing one needs a person’s key.
GET /v1/doc-evals and GET /v1/doc-evals/{doc_eval_id} read document evaluations, and PATCH corrects one. POST /v1/evals/query filters evals, GET /v1/evals/{eval_id} reads one, and GET /v1/evals/{eval_id}/response-dependencies lists the evals that depend on its answer. GET /v1/evals/override-report takes start_ts and end_ts and reports how often reviewers overturned each control.
Follow-up workbooks, reviews and summary instructions
GET /v1/follow-up-rounds/{round_id}/email-recipients returns who a round’s invitation would go to. POST /v1/follow-up-rounds/{round_id}/import takes a filled-in workbook as a multipart file and lands it as if the vendor had answered in the portal. Send dry_run=true to preview the rows. A preview writes nothing.
POST /v1/reviews requests a review of an assessment. PATCH /v1/reviews/{review_id} renames, rewords or reassigns it. Recording its decision needs a person’s key.
GET /v1/summary-instructions/default returns Coverbase’s built-in summary instructions. GET /v1/summary-instructions/{prompt_id}/revisions lists earlier revisions. POST /v1/summary-instructions/{prompt_id}/rename renames them, with the expected_name you read. Renaming needs a key created by a person whose role holds org_settings:update:org.
Assessment rating scale
GET /v1/assessment-rating-scale returns the scale, or null when assessments take their label from control scales. GET .../suggested-levels proposes levels from the default control scale. PUT .../levels creates the scale or replaces its levels, and DELETE turns it off. Both need a key created by a person whose role holds org_settings:update:org, and turning it off needs a person’s key.
Coverbase AI conversations
POST /v1/interrogate-sessions opens a conversation about an assessment, a vendor, a radar event or your org, with subject_type and subject_id. GET /v1/interrogate-sessions?subject_type=...&subject_id=... lists conversations about one subject, and GET /v1/interrogate-sessions/{session_id} returns one with every message.
To ask a question, send POST /v1/interrogate-sessions/{session_id}/messages with content. It returns 202 Accepted with a job. Poll GET /v1/ai-jobs/{job_id}: the result holds the answer and any tool_proposals. The answer is also saved on the conversation. The API never applies a proposed change; a person applies it in Coverbase.