Skip to main content
This guide creates and updates risk scenarios via 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:read and vanta-api.all:write on the token. There is no risk-specific scope — risk scenarios are covered by the broad vanta-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.
The 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): There’s also a deprecated isSensitive boolean still accepted by the API; new integrations shouldn’t rely on it.
1

Create a risk scenario in a specific register

Your terminalPOST /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.
A 200 response returns the full risk scenario, including the riskId you’ll use for later updates.
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.
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.
Pass type: "Enterprise Risk" and omit riskRegister — enterprise risks aren’t attached to a register. Requires the Enterprise Risk Management SKU.
2

Set custom fields

Anything outside the built-in schema — “Source of risk”, a Jira ticket URL, an internal risk tier, a business unit — is a custom field. Custom fields must be defined ahead of time in Risk Management → Settings → Custom Fields; the API fills values but never creates field definitions.Pass them via the 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"] }
The 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.
Your JSON value doesn’t match the field’s declared type. Picklist fields need an array of strings even when you’re only setting one option. Text/date/number/currency fields need a plain string.
There isn’t one. 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.
3

Update an existing scenario

Your terminalPATCH /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.
Send the field with value: "" (text/date/number/currency) or value: [] (picklist). The label still has to match a defined field.
No — changing a scenario’s type (Risk ScenarioEnterprise 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

Make a specific user accountable for the controls that mitigate a risk.

Set custom fields on vendors

Same customFields pattern applied to the Vendors API.

Try it in Postman

Import the collection and hit POST /v1/risk-scenarios against a sandbox.

Manage Vanta API reference

Browse every Manage Vanta endpoint — risk scenarios, controls, tests, documents, people.