Edit an option of a draft question
PATCH /supplier-assessment-templates/{templateId}/questions/{questionId}/options/{optionId}
Scope supplier_template:write Plan Growth+
Change fields of one answer option of a draft: label, riskValue (0 to 4), findingSeverity, finding and notApplicable. At least one field is required. A field edit is lock-free: it does not check or change the draft revision, and an edit that changes nothing returns 200 and is not recorded. Clearing or lowering a critical finding severity lowers the score of every future assessment and needs an acknowledgement a person gives with acknowledgeRiskReduction, riskReductionReason and riskReductionJustification. Without it the answer is 422 RISK_REDUCTION_NOT_ACKNOWLEDGED, and a token that sends acknowledgeRiskReduction: true is refused with 403 HUMAN_APPROVAL_REQUIRED, so a token cannot lower a critical severity; a person does it in the console. Only a draft can be edited: published, archived and submitted versions answer 409 (TEMPLATE_PUBLISHED, TEMPLATE_ARCHIVED, TEMPLATE_SUBMITTED). Field edit: 120 per token and hour. Requires the supplier_template:write scope (or a signed-in Owner, Manager or Contributor session).
Example
curl -X PATCH "https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/questions/<questionId>/options/<optionId>" \
-H "Authorization: Bearer <your-api-token>" \
-H "Content-Type: application/json" \
-d '{"riskValue":3,"findingSeverity":"high"}'import requests
response = requests.patch(
"https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/questions/<questionId>/options/<optionId>",
headers={"Authorization": "Bearer <your-api-token>", "Content-Type": "application/json"},
json={
"riskValue": 3,
"findingSeverity": "high",
},
)
print(response.json())const response = await fetch("https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/questions/<questionId>/options/<optionId>", {
method: "PATCH",
headers: { "Authorization": "Bearer <your-api-token>", "Content-Type": "application/json" },
body: JSON.stringify({
"riskValue": 3,
"findingSeverity": "high"
}),
});
console.log(await response.json());Response 200
{
"data": {
"templateId": "satpl_1hgyun41rx48",
"templateKey": "tpl_1hgyun41rx49",
"version": 0,
"titleKey": "",
"title": {
"en": "Example vendor security review"
},
"modes": [],
"source": "authored",
"status": "draft",
"active": false,
"questionCount": 1,
"revision": 4,
"createdAt": "2026-10-09T08:15:00Z",
"updatedAt": "2026-10-09T08:20:00Z",
"sections": [
{
"sectionId": "sect_1hgyun41rx4a",
"titleKey": "",
"title": {
"en": "Governance"
},
"order": 1,
"questions": [
{
"questionId": "saq_1hgyun41rx4d",
"textKey": "",
"text": {
"en": "Is data encrypted at rest?"
},
"answerType": "single_select",
"required": true,
"modes": [],
"domain": "operations",
"weight": 8,
"authored": true,
"options": [
{
"optionId": "saqo_1hgyun41rx4e",
"labelKey": "",
"label": {
"en": "Yes, all stores"
},
"riskValue": 0
},
{
"optionId": "saqo_1hgyun41rx4f",
"labelKey": "",
"label": {
"en": "No"
},
"riskValue": 4,
"findingSeverity": "high"
}
]
}
]
}
],
"limits": {
"maxSections": 20,
"maxQuestionsPerSection": 50,
"maxQuestionsPerTemplate": 300,
"maxOptionsPerQuestion": 12
},
"permissions": {
"canEdit": true,
"canSubmit": true,
"canWithdraw": false,
"canReject": false,
"canPublish": false,
"canSetDefault": false,
"canArchive": false,
"canDelete": true,
"publishBlockedReason": null
}
}
}Path parameters
templateIdstring requiredQuestionnaire document id (satpl_...), orsatpl_builtin_supplier_security_privacy_v1for the built-in one.questionIdstring requiredQuestion id, as returned insections[].questions[].questionId.optionIdstring requiredOption id, as returned inquestions[].options[].optionId.
Header parameters
If-MatchstringThe draft revision asW/"<revision>", from the ETag header. Wins over arevisionin the body. A write on an older revision fails with 409 STALE_REVISION.
Request body
labelobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.enstring requiredrustringhestring
riskValueintegerScoring: 0 (no risk) to 4.findingSeveritystring"" | "info" | "low" | "medium" | "high" | "critical"findingobjectText per locale, at most 2000 characters per locale; HTML is rejected. All locales are optional.enstringrustringhestring
notApplicablebooleanrevisionintegerAccepted and ignored: a field edit does not check the revision.acknowledgeRiskReductionbooleanA person acknowledges lowering a critical finding severity. A token that sends true is refused with 403 HUMAN_APPROVAL_REQUIRED.riskReductionReasonstringRequired when acknowledgeRiskReduction is true."control_not_applicable" | "duplicate_question" | "severity_set_wrongly" | "replaced_by_another_question" | "other"riskReductionJustificationstringRequired when acknowledgeRiskReduction is true.
Returns
The data field of the standard { data, error, meta } envelope:
templateIdstring requiredtemplateKeystring requiredShared by all versions of the questionnaire.versioninteger required0 for an open draft.titleKeystring requireddescriptionKeystringtitleobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.enstring requiredrustringhestring
descriptionobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.enstring requiredrustringhestring
modesarray of string requiredsourcestring"builtin" | "authored"statusstringdraft and submitted are open (editable or awaiting approval); published is the live version; archived is retired."draft" | "submitted" | "published" | "archived"activeboolean requiredisDefaultbooleanquestionCountintegerrevisionintegerSend with an edit; changes on every structural edit.contentHashstringclonedFromKeystringclonedFromVersionintegerparentVersionintegerpublishedAtstring (date-time)publishedBystringcreatedAtstring (date-time) requiredupdatedAtstring (date-time) requiredcreatedBystringupdatedBystringlastEditedBystringlastEditedAtstring (date-time)submittedBystringsubmittedAtstring (date-time)submitterNotestringrejectedBystringrejectedAtstring (date-time)rejectionReasonstringsectionsarray of object requiredsectionIdstring requiredtitleKeystring requiredtitleobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
orderinteger requiredquestionsarray of object requiredShow 19 propertiesHide 19 properties { questionId, textKey, helpKey, answerType, … }
questionIdstring requiredtextKeystring requiredBuilt-in text key; authored questions carrytextinstead.helpKeystringanswerTypestring required"text" | "email" | "phone" | "textarea" | "single_select" | "multi_select"requiredboolean requiredmodesarray of string requireddomainstring required"" | "governance" | "privacy" | "access" | "operations" | "resilience" | "supply_chain" | "contractual"syncTargetstringevidenceHintKeystringoptionsarray of objectShow 8 propertiesHide 8 properties { optionId, labelKey, notApplicable, label, … }
optionIdstring requiredlabelKeystring requiredBuilt-in text key; authored options carrylabelinstead.notApplicablebooleanlabelobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
riskValueintegerScoring: 0 (no risk) to 4.findingSeveritystring"info" | "low" | "medium" | "high" | "critical"findingKeystringfindingobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
requiresVendorTypesarray of stringallowNotApplicablebooleanrequiresResponsesarray of objectShow 2 propertiesHide 2 properties { questionId, anyOption }
questionIdstring requiredanyOptionarray of string required
textobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
helpobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
evidenceHintobjectText per locale.enis required;ruandhefall back toenwhen blank. At most 500 characters per locale (2000 for a description); HTML is rejected.Show 3 propertiesHide 3 properties { en, ru, he }
enstring requiredrustringhestring
authoredbooleanweightintegerScoring weight.controlIdsarray of string
limitsobject requiredThe structural caps the server enforces.maxSectionsinteger requiredmaxQuestionsPerSectioninteger requiredmaxQuestionsPerTemplateinteger requiredmaxOptionsPerQuestioninteger required
permissionsobjectWhat the caller may do with this version right now.canEditboolean requiredcanSubmitboolean requiredcanWithdrawboolean requiredcanRejectboolean requiredcanPublishboolean or null requiredcanSetDefaultboolean requiredcanArchiveboolean requiredcanDeleteboolean requiredpublishBlockedReasonstring or null required
Errors
| Status | Code | Retry | Meaning |
|---|---|---|---|
| 400 | VALIDATION_FAILED |
no | The JSON body does not match the request schema, or the revision is missing where required. code VALIDATION_FAILED. |
| 401 | INVALID_TOKEN |
no | Missing (UNAUTHORIZED) or invalid, expired or revoked (INVALID_TOKEN) token. |
| 402 | FEATURE_GATED |
no | The tenant plan does not include supply chain security. code FEATURE_GATED; args.feature, args.minTier, args.minTierName. |
| 403 | HUMAN_APPROVAL_REQUIRED |
no | The token lacks supplier_template:write (INSUFFICIENT_SCOPE), has no accountable person (FORBIDDEN), the target is the built-in questionnaire (BUILTIN_IMMUTABLE), or the body sets acknowledgeRiskReduction to true, which only a person may do (HUMAN_APPROVAL_REQUIRED). |
| 404 | NOT_FOUND |
no | Unknown questionnaire, question or option in the path. code NOT_FOUND. |
| 409 | TEMPLATE_SUBMITTED |
no | The version cannot take this edit. code TEMPLATE_PUBLISHED, TEMPLATE_SUBMITTED or TEMPLATE_ARCHIVED (not a draft; args.current holds the document). |
| 413 | PAYLOAD_TOO_LARGE |
no | The JSON body exceeds the size limit. code PAYLOAD_TOO_LARGE. |
| 422 | RISK_REDUCTION_NOT_ACKNOWLEDGED |
no | The edit clears or lowers a critical finding severity without the acknowledgement only a person can give. code RISK_REDUCTION_NOT_ACKNOWLEDGED. |
| 429 | RATE_LIMITED |
yes | Too many failed authentication attempts from this address, or the token used its hourly write budget (30 structural, 120 field edits). code RATE_LIMITED; wait Retry-After seconds, also in error.args.retryAfterSeconds. |
| 500 | DB_ERROR |
no | Unexpected server error. code DB_ERROR; quote error.id to support. |
| 503 | BILLING_UNAVAILABLE |
yes | Billing is temporarily unavailable, so the plan could not be checked. code BILLING_UNAVAILABLE. Retry later. |
Was this page helpful?