POST /v1/risk-scenarios and PATCH /v1/risk-scenarios/{riskScenarioId} on the Manage Vanta API. It covers the three things most integrations trip on: targeting a specific risk register, setting custom fields with the right label and value shape, and modeling attributes (like “source of risk”) that aren’t in the built-in schema.
Before you begin
This guide is for Vanta admins managing risk data inside their own Vanta account. You’ll need:- A Manage Vanta API token.
- Scopes
vanta-api.all:readandvanta-api.all:writeon the token. There is no risk-specific scope — risk scenarios are covered by the broadvanta-api.all:*scopes. See API authentication. - Any custom fields you plan to set must already be defined in Risk Management → Settings → Custom Fields in the Vanta UI. The API fills custom field values; it can’t create the field definitions.
CreateRiskScenarioInput schema has a fixed set of fields. There is no built-in source field, no built-in jiraTicket field, and no per-scenario “risk owner group”. Anything not in the table below has to be modeled as a custom field (see Step 2 below):
isSensitive boolean still accepted by the API; new integrations shouldn’t rely on it.
Create a risk scenario in a specific register
POST /v1/risk-scenarios. Only description is strictly required, but if your tenant has more than one risk register you must pass riskRegister by name (case-sensitive) or the API returns 400.200 response returns the full risk scenario, including the riskId you’ll use for later updates.Which register name should I send?
Which register name should I send?
riskRegister takes the register’s name, not its id. Open Risk Management → Registers in Vanta and copy the exact name (spaces, capitalization, and punctuation all matter). Tenants with a single register can omit the field.Got `400` saying `owner` is not a valid user?
Got `400` saying `owner` is not a valid user?
owner must be the email address of an existing Vanta user, not a display name or a person id. Look up the address with GET /v1/people filtered to employmentStatus=CURRENT.Creating an Enterprise Risk instead?
Creating an Enterprise Risk instead?
type: "Enterprise Risk" and omit riskRegister — enterprise risks aren’t attached to a register. Requires the Enterprise Risk Management SKU.Set custom fields
customFields array. Each entry has a label (matches the field name in settings exactly, case-sensitive) and a value matching the field’s type:- Text / date / number / currency — JSON string:
{ "label": "Source of risk", "value": "Internal audit finding" } - Picklist — JSON array of strings:
{ "label": "Business unit", "value": ["Engineering", "Security"] }
Got `400 RiskCustomAttribute with id: <label> not found`?
Got `400 RiskCustomAttribute with id: <label> not found`?
label you sent doesn’t match any custom field defined in Risk Management → Settings → Custom Fields. This includes system-style identifiers like managed_by_email — the API does not resolve those. Open the settings page, copy the field name exactly, and retry. Custom field definitions cannot be created through the API.Got a 400 saying the value type is wrong?
Got a 400 saying the value type is wrong?
Where does the built-in Source, Jira, or Ticket field live?
Where does the built-in Source, Jira, or Ticket field live?
riskId, description, detailedDescription, note, categories, ciaCategories, treatment, owner, riskRegister, likelihood, impact, residualLikelihood, residualImpact, type, and identificationDate (plus the deprecated isSensitive flag) are the only non-custom fields on a risk scenario — everything else has to be a custom field.Update an existing scenario
PATCH /v1/risk-scenarios/{riskScenarioId}. Send only the fields you want to change; omitted fields keep their current values. customFields follows the same shape as create.Need to clear a custom field?
Need to clear a custom field?
value: "" (text/date/number/currency) or value: [] (picklist). The label still has to match a defined field.Can I change `type` on update?
Can I change `type` on update?
type (Risk Scenario ↔ Enterprise Risk) is not supported via PATCH. Requests that include type are rejected. Create a new scenario with the desired type and archive the old one.Congratulations
You can now create risk scenarios in the right register, populate every organization-specific attribute via custom fields, and update scores or metadata idempotently.Next steps
Assign a control owner
Set custom fields on vendors
customFields pattern applied to the Vendors API.Try it in Postman
POST /v1/risk-scenarios against a sandbox.