curl --request GET \
--url https://app.vumasign.com/api/v1/templates/{templateId}/field-map \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.vumasign.com/api/v1/templates/{templateId}/field-map"
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}/field-map', 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}/field-map"
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))
}<string>{
"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>"
}
}A template’s field map, as a spreadsheet: one numbered row per field.
EVERY FIELD OF THE TEMPLATE, ONE ROW EACH, AS CSV: what to keep open while you match your own data to the template’s names. The same facts as GET /api/v1/templates/{templateId}, laid out for a person: each row’s box is the number drawn beside that field on its document’s annotated pages (GET /api/v1/templates/{templateId}/documents/{documentId}/field-map), numbered through the whole template in reading order — document by document, page by page, then down and across each page.
One row per field. A field split across several sets of printed boxes is one row, with cells saying how many characters each set holds; a box of a question is one row, with the question’s key as its data_key and its own option as value=printed text.
⚠️ EVERY CELL IS SAFE TO OPEN IN A SPREADSHEET. Labels and options are text somebody else wrote; a cell that a spreadsheet could read as a formula — one beginning with =, +, -, @, a tab or a carriage return — is prefixed with ', and so is any of those four after a comma, semicolon, pipe, tab or line break inside a cell, where a spreadsheet that splits lines at a different character would start a cell. Every cell is quoted. A UTF-8 byte-order mark comes first, so a key in Sesotho opens as written.
⚠️ FOUR SITUATIONS ANSWER WITH THE SAME 404, as on the template itself: no such template anywhere; another organisation’s; one of yours that has been archived; and an id that is not a uuid. Never cached, by anything: Cache-Control: private, no-store.
curl --request GET \
--url https://app.vumasign.com/api/v1/templates/{templateId}/field-map \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.vumasign.com/api/v1/templates/{templateId}/field-map"
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}/field-map', 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}/field-map"
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))
}<string>{
"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"
Response
The spreadsheet, UTF-8, a header row and then a row per field, each line ended CRLF. Content-Disposition: attachment; filename="field-map-1a2b3c4d.csv", where the characters after field-map- are the start of the template’s ETag, as on the annotated pages’ filename.
CSV. ⚠️ NOT JSON. Its refusals still are: every non-2xx is the same Error envelope in application/json.