Templates
A template decides which of the values SpecCapture reads a job keeps, what each is called, and in what order - one
that keeps only the columns an ERP import expects, under its own headings, or one for quoting. Templates are made in
the SpecCapture dashboard (Fields) by the workspace’s owner or an admin; the API reads them. Every template reads
a drawing the same way - all of it, exactly as SpecCapture’s measured reading does - so a template never changes a
value: it only chooses which values a job keeps, names them and orders them. A field’s path is its key everywhere
and never changes, whatever the template calls it.
GET /v1/templates lists them. The standard template, drawing - every field, table and note SpecCapture reads,
under its standard names - is always first; then the workspace’s own, by name. defaultTemplateId is what a
submission uses when it names no template:
{ "defaultTemplateId": "6b0d5d2e-3c8a-4f6e-9a7b-2f1e0c9d8b7a", "templates": [ { "templateId": "drawing", "name": "Standard (every field)", "version": 1, "isDefault": false, "definedBy": "speccapture", "updatedAt": null, "url": "/v1/templates/drawing" }, { "templateId": "6b0d5d2e-3c8a-4f6e-9a7b-2f1e0c9d8b7a", "name": "ERP import", "version": 3, "isDefault": true, "definedBy": "workspace", "updatedAt": "2026-10-14T09:00:00+00:00", "url": "/v1/templates/6b0d5d2e-3c8a-4f6e-9a7b-2f1e0c9d8b7a" } ]}GET /v1/templates/{templateId} gives one template’s fields, tables and notes, in order, at its newest version, or
at an earlier one with ?version=:
{ "templateId": "6b0d5d2e-3c8a-4f6e-9a7b-2f1e0c9d8b7a", "name": "ERP import", "version": 3, "currentVersion": 3, "isDefault": true, "archived": false, "definedBy": "workspace", "publishedAt": "2026-10-14T09:00:00+00:00", "basedOn": "drawing", "basedOnVersion": 1, "fields": [ { "path": "titleBlock.partNumber", "name": "Item number", "standardName": "Part Number", "order": 1, "required": true, "alwaysCheck": false, "section": null, "definedBy": "speccapture", "measured": "measured" }, { "path": "titleBlock.title", "name": "Description", "standardName": "Title", "order": 2, "required": false, "alwaysCheck": false, "section": null, "definedBy": "speccapture", "measured": "standard" } ], "tables": [ { "path": "bom", "name": "Parts", "standardName": "Bill of Materials", "keyColumn": "item", "columns": [ { "path": "item", "name": "Line", "standardName": "Item" }, { "path": "qty", "name": "Quantity", "standardName": "Quantity" } ] } ], "notes": null, "exportLayout": "valuesOnly"}nameis the name the job’s values carry (each value’sname);standardNameis SpecCapture’s.required: a drawing that does not give the field waits for a person, the value with the review reasonRequiredButNotFound.alwaysCheck: the field’s value always waits for a person, whatever the workspace accepts automatically.measuredsays what SpecCapture says about the field’s accuracy:measuredfor the four fields whose accuracy SpecCapture publishes (part number, revision, material, finish),standardfor every other field it reads,notMeasuredfor sizes and counts worked out from the drawing, which always wait for a person.- A table keeps its
keyColumn(the column that numbers its rows) whatever else it leaves out.notesisnullwhen the template leaves the general notes out. exportLayoutis how the job’s CSV and Excel exports are laid out:full, orvaluesOnly- one column per field under its name, a value still waiting for review left blank and named in aWaiting for reviewcolumn, and no sheet ever left out.
Versions. Every change the workspace publishes is a new version; a version never changes afterwards. A job keeps
the version it was submitted with - its templateId and templateVersion - for good, so its values, names and
exports stay as they were; GET /v1/templates/{templateId}?version=N gives that version. A template the workspace
archived still answers here, with archived: true, for the jobs that name it; it cannot be used for new ones.
An id the workspace does not have, another workspace’s included, answers 404 not_found. Any key may read
templates.