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/templates

List templates in the key's workspace, newest first. Paginated and optionally filtered — suitable for a template picker.

ParamTypeNotes
pagenumberDefaults to 1.
limitnumberDefaults to 25, max 100.
searchstringCase-insensitive match across the template's name, description, tags, and each page's own name/description/tags.
tagsstring[]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".
folderIdstringRestrict 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/:id

Template 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/parameters

Every 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
    }
  ]
}
ParamTypeNotes
pages{ id, name }[]Every page on the template, for looking up a parameter's pages by id.
parameters[].keystringThe key accepted by modifications.
parameters[].type"text" | "image" | "color"
parameters[].sampleValuestringThe layer's current value on the canvas.
parameters[].pagesstring[]Ids of the pages this key appears on.
parameters[].objectIdsstring[]Ids of the bound layers on the canvas.
parameters[].label / descriptionstring | nullAuthored in the editor’s Variables panel.
parameters[].defaultValuestringThe authored default, falling back to sampleValue.
parameters[].defaultOverridestring | nullThe authored default only, with no fallback — null when none was set.
parameters[].requiredboolean
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?