curl --request GET \
--url https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "01960000-0000-4000-8000-0000000000a1",
"template_id": "01960000-0000-4000-8000-0000000007e1",
"status": "succeeded",
"error": null,
"template_etag": "\"5c1f0e3a…\"",
"use_ai": false,
"created_at": "2026-09-01T08:31:00.000Z",
"finished_at": "2026-09-01T08:31:40.000Z",
"proposals": {
"fields": [
{
"id": "01960000-0000-4000-8000-00000000f1e1",
"data_key": "contract.employee_name",
"subject": "employee",
"tier": "organisation",
"confidence": "medium",
"source": "matched",
"reason": "printed label “Full name”; your organisation uses this key on 2 other templates"
}
],
"questions": [],
"people": [
{
"id": "3f2a9c51d07e48b6a1c4e95b0d2f7a68",
"heading": "Employee",
"decision": "both",
"reason": "A “Employee” section with 1 field on page 1"
}
]
},
"preview": {
"coverage_after": {
"prefillable": 1,
"core": 0,
"organisation": 1,
"legacy": 0,
"unnamed": 0,
"questions": 0,
"unnamed_groups": 0,
"unnamed_options": 0,
"collisions": 0
},
"low_confidence": [],
"dropped": []
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}Read a naming run: its status, its proposals with reasons, and the preview.
A run’s status, and once it has succeeded, every proposal with its confidence, source and reason, and the preview: the template’s coverage if you accepted everything, every low proposal, and what the naming rules removed. ⚠️ reason and heading quote the form’s printed words. Runs are kept for 30 days. Test and live keys alike.
curl --request GET \
--url https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.vumasign.com/api/v1/templates/{templateId}/naming-runs/{runId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"id": "01960000-0000-4000-8000-0000000000a1",
"template_id": "01960000-0000-4000-8000-0000000007e1",
"status": "succeeded",
"error": null,
"template_etag": "\"5c1f0e3a…\"",
"use_ai": false,
"created_at": "2026-09-01T08:31:00.000Z",
"finished_at": "2026-09-01T08:31:40.000Z",
"proposals": {
"fields": [
{
"id": "01960000-0000-4000-8000-00000000f1e1",
"data_key": "contract.employee_name",
"subject": "employee",
"tier": "organisation",
"confidence": "medium",
"source": "matched",
"reason": "printed label “Full name”; your organisation uses this key on 2 other templates"
}
],
"questions": [],
"people": [
{
"id": "3f2a9c51d07e48b6a1c4e95b0d2f7a68",
"heading": "Employee",
"decision": "both",
"reason": "A “Employee” section with 1 field on page 1"
}
]
},
"preview": {
"coverage_after": {
"prefillable": 1,
"core": 0,
"organisation": 1,
"legacy": 0,
"unnamed": 0,
"questions": 0,
"unnamed_groups": 0,
"unnamed_options": 0,
"collisions": 0
},
"low_confidence": [],
"dropped": []
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}{
"error": {
"code": "unauthenticated",
"message": "<string>"
}
}Authorizations
Authorization: Bearer vsk_live_…. Chosen over a bespoke X-API-KEY header because every client, proxy and log-redaction rule already knows this one. What a key may DO is its scopes — see x-scopes at the root of this document and x-required-scope on each operation. The scope list is not written here because OpenAPI reserves a requirement’s scope array for oauth2 and openIdConnect and requires it to be empty for an http scheme.
Path Parameters
The template’s id, as returned by the list endpoint.
A template id.
"01960000-0000-4000-8000-0000000007e1"
The naming run’s id, from POST …/naming-runs, from name_fields on create, or from template.named.
A naming run id.
Response
The run: its status and, once it has succeeded, its proposals and preview.
The run.
The run’s id.
The template it names.
queued and running have no proposals yet; failed has an error and none.
queued, running, succeeded, failed Why a failed run failed. Null otherwise. Request a new run.
template_unavailable, internal_error, null The ETag of the template the proposals describe. Accepting is refused once the template’s ETag is another; send this as If-Match to …/accept.
Whether Stage 2 was asked for.
When it was requested.
When it succeeded or failed.
What the run proposes, by field, question and person. Null until the run has succeeded. Every proposal has passed the same naming rules as a rename, so a run holds no collision.
Show child attributes
Show child attributes
What accepting every proposal would produce. Null until the run has succeeded.
Show child attributes
Show child attributes