Get a questionnaire version
GET /supplier-assessment-templates/{templateId}/versions/{version}
Scope supplier_template:read Plan Growth+
Fetch one numbered version of a questionnaire. Unlike the other routes, the path segment {templateId} here is the questionnaire’s templateKey (the same in every version), not a templateId. meta.contentHashVerified tells whether the stored content still matches the hash recorded when the version was published; a mismatch is reported, never an error. A draft carries version 0. Requires the supplier_template:read scope.
Example
curl "https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/versions/<version>" \
-H "Authorization: Bearer <your-api-token>"import requests
response = requests.get(
"https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/versions/<version>",
headers={"Authorization": "Bearer <your-api-token>"},
)
print(response.json())const response = await fetch("https://api.autociso.io/api/v1/supplier-assessment-templates/<templateId>/versions/<version>", {
method: "GET",
headers: { "Authorization": "Bearer <your-api-token>" },
});
console.log(await response.json());Response 200
{
"data": {
"templateId": "satpl_1hgyun41rx50",
"templateKey": "tpl_1hgyun41rx49",
"version": 2,
"titleKey": "",
"title": {
"en": "Example vendor security review"
},
"modes": [],
"source": "authored",
"status": "published",
"active": true,
"isDefault": false,
"questionCount": 1,
"contentHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718293a4b5c6d7e8f901122334455667788",
"parentVersion": 1,
"publishedAt": "2026-10-10T12:00:00Z",
"publishedBy": "usr_1hgyq7m2k9xa",
"createdAt": "2026-10-09T08:15:00Z",
"updatedAt": "2026-10-10T12:00: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": 10,
"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"
},
{
"optionId": "saqo_1hgyun41rx4g",
"labelKey": "",
"label": {
"en": "Partly"
},
"riskValue": 2,
"findingSeverity": "medium"
}
]
}
]
}
],
"limits": {
"maxSections": 20,
"maxQuestionsPerSection": 50,
"maxQuestionsPerTemplate": 300,
"maxOptionsPerQuestion": 12
},
"permissions": {
"canEdit": false,
"canSubmit": false,
"canWithdraw": false,
"canReject": false,
"canPublish": null,
"canSetDefault": true,
"canArchive": true,
"canDelete": false,
"publishBlockedReason": null
}
},
"meta": {
"contentHashVerified": true
}
}Path parameters
templateIdstring requiredThe questionnaire'stemplateKey, which is shared by all its versions. Not a documenttemplateId.versioninteger requiredVersion number; 0 is an open draft.
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
The meta field:
contentHashVerifiedboolean requiredFalse when the stored content no longer matches the recorded hash, or there is none (a draft).
Errors
| Status | Code | Retry | Meaning |
|---|---|---|---|
| 400 | VALIDATION_FAILED |
no | A version in the path is not an integer. 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 | INSUFFICIENT_SCOPE |
no | The token lacks the required scope (INSUFFICIENT_SCOPE), or the request is refused (FORBIDDEN, INSUFFICIENT_ROLE for a draft the caller may not read). |
| 404 | NOT_FOUND |
no | Unknown or foreign-tenant questionnaire, version or clone source. code NOT_FOUND. |
| 429 | RATE_LIMITED |
yes | Too many failed authentication attempts from this address. code RATE_LIMITED; wait Retry-After seconds. |
| 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. |
Last reviewed: 2026-10-13
Was this page helpful?