Templates
Templates
Read-only template discovery: find a template's id, its metadata, and the variableName keys it accepts in modifications before calling POST /v1/templates/:id/render. None of these routes return the design document itself — just metadata and derived variables.
Templates
GET /v1/templates
GET
/v1/templatesList templates in the key's workspace, newest first. Paginated and optionally filtered — suitable for a template picker.
| Param | Type | Notes |
|---|---|---|
| page | number | Defaults to 1. |
| limit | number | Defaults to 25, max 100. |
| search | string | Case-insensitive match across the template's name, description, tags, and each page's own name/description/tags. |
| tags | string[] | Up to 10. Repeat the param (?tags=a&tags=b) — a single tag also works as a bare string. |
| sort | "updated_at" | "created_at" | "name" | "renders" | Defaults to "updated_at". |
| folderId | string | Restrict to one folder. Pass the literal string "root" for templates with no folder. |
curl "https://buildonce.app/v1/templates?search=launch&limit=10" \ -H "Authorization: Bearer fl_live_YOUR_API_KEY"
Response
{
"items": [ {
"id": "tpl_a1b2c3d4e5f6",
"name": "Launch announcement",
"description": null,
"tags": ["social", "launch"],
"pageCount": 3,
"width": 1080,
"height": 1080,
"thumbnailUrl": "https://.../tpl_a1b2c3d4e5f6/0.png",
"pageThumbnails": [
{ "id": "s1", "url": "https://.../tpl_a1b2c3d4e5f6/s1.png" },
{ "id": "s2", "url": "https://.../tpl_a1b2c3d4e5f6/s2.png" },
{ "id": "s3", "url": "https://.../tpl_a1b2c3d4e5f6/s3.png" }
],
"pageSummary": [
{ "id": "s1", "name": "Cover", "tags": [], "description": null },
{ "id": "s2", "name": "Details", "tags": [], "description": null },
{ "id": "s3", "name": "CTA", "tags": [], "description": null }
],
"folderId": null,
"createdAt": "2026-08-01T12:00:00.000Z",
"updatedAt": "2026-09-28T09:30:00.000Z",
"createdBy": "jordan@acme.com"
} /* … */ ],
"total": 42,
"page": 1,
"limit": 25
}Templates
GET /v1/templates/:id
GET
/v1/templates/:idTemplate metadata — no design document.
curl https://buildonce.app/v1/templates/tpl_a1b2c3d4e5f6 \ -H "Authorization: Bearer fl_live_YOUR_API_KEY"
Response
{
"id": "tpl_a1b2c3d4e5f6",
"name": "Launch announcement",
"description": null,
"tags": ["social", "launch"],
"pageCount": 3,
"width": 1080,
"height": 1080,
"thumbnailUrl": "https://.../tpl_a1b2c3d4e5f6/0.png",
"pageThumbnails": [
{ "id": "s1", "url": "https://.../tpl_a1b2c3d4e5f6/s1.png" },
{ "id": "s2", "url": "https://.../tpl_a1b2c3d4e5f6/s2.png" },
{ "id": "s3", "url": "https://.../tpl_a1b2c3d4e5f6/s3.png" }
],
"pageSummary": [
{ "id": "s1", "name": "Cover", "tags": [], "description": null },
{ "id": "s2", "name": "Details", "tags": [], "description": null },
{ "id": "s3", "name": "CTA", "tags": [], "description": null }
],
"folderId": null,
"createdAt": "2026-08-01T12:00:00.000Z",
"updatedAt": "2026-09-28T09:30:00.000Z",
"createdBy": "jordan@acme.com"
}Templates
GET /v1/templates/:id/parameters
GET
/v1/templates/:id/parametersEvery variableName-bound layer on the template's live draft, merged with its authored label/description/default. The keys inside parameters are the keys accepted by modifications on the render endpoint.
curl https://buildonce.app/v1/templates/tpl_a1b2c3d4e5f6/parameters \ -H "Authorization: Bearer fl_live_YOUR_API_KEY"
Response
{
"pages": [
{ "id": "s1", "name": "Cover" },
{ "id": "s2", "name": "Details" },
{ "id": "s3", "name": "CTA" }
],
"parameters": [
{
"key": "headline",
"type": "text",
"sampleValue": "50% off today",
"pages": ["s1"],
"objectIds": ["obj_1a2b3c"],
"label": "Headline",
"description": "Main title on the cover slide",
"defaultValue": "50% off today",
"defaultOverride": "50% off today",
"required": false
},
{
"key": "backgroundImage",
"type": "image",
"sampleValue": "",
"pages": ["s1"],
"objectIds": ["obj_4d5e6f"],
"label": "Background image",
"description": null,
"defaultValue": "",
"defaultOverride": null,
"required": false
},
{
"key": "accentColor",
"type": "color",
"sampleValue": "#ff5a1f",
"pages": ["s2", "s3"],
"objectIds": ["obj_7g8h9i"],
"label": "Accent color",
"description": null,
"defaultValue": "#ff5a1f",
"defaultOverride": null,
"required": false
}
]
}| Param | Type | Notes |
|---|---|---|
| pages | { id, name }[] | Every page on the template, for looking up a parameter's pages by id. |
| parameters[].key | string | The key accepted by modifications. |
| parameters[].type | "text" | "image" | "color" | |
| parameters[].sampleValue | string | The layer's current value on the canvas. |
| parameters[].pages | string[] | Ids of the pages this key appears on. |
| parameters[].objectIds | string[] | Ids of the bound layers on the canvas. |
| parameters[].label / description | string | null | Authored in the editor’s Variables panel. |
| parameters[].defaultValue | string | The authored default, falling back to sampleValue. |
| parameters[].defaultOverride | string | null | The authored default only, with no fallback — null when none was set. |
| parameters[].required | boolean |
A key missing from this list because it was removed from the canvas still has its saved label/description/default — the response only hides it, it never deletes that metadata.
Was this page helpful?