Automette docs

Where to start

GET
/api/v1

Authorization

ApiKeyAuth
AuthorizationBearer <token>

API key from Settings → API Keys.

In: header

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1"
{  "name": "Automette API",  "description": "Turn a template plus data into a document — PDF, PNG, JPG, WebP or Word.",  "start_here": "https://automette.com/api/v1/skills/recipes",  "skills": [    {      "id": "recipes",      "title": "What you can do, and how",      "engine": "both",      "kind": "skill",      "summary": "Every task this API supports and the route to it.",      "self": "https://automette.com/api/v1/skills/recipes"    }  ],  "engines": {    "canvas": "JSON layouts of positioned components. Authorable over the API.",    "typst": "Markup compiled to PDF. Authorable over the API.",    "docx": "Uploaded Word files. Renderable over the API, authored in the dashboard."  },  "resources": {    "templates": "https://automette.com/api/v1/templates",    "renders": "https://automette.com/api/v1/renders"  },  "openapi": "https://automette.com/openapi.yaml",  "docs": "https://automette.com/docs"}

Read a reference page GET

One page in full, as Markdown in the `content` field. Send `Accept: text/markdown` to get the body on its own with no JSON envelope, which is usually what you want to drop into a model's context. Only fonts we ship can be used, and only assets uploaded to the template resolve — both are covered here, and both are the most common way a first render fails.

Get the team's brand kit GET

Your team's colours, logos and uploaded fonts. Read this before authoring a template that should be on-brand: the hex values here are the ones to put in a component's `fill`, `fonts[].family` is the exact string to put in `fontFamily`, and `images[].key` is what goes in an image component's `src` — or in a Typst `#image("...")`, since the file is staged at that path. A font carries `problem` only when it cannot be used — no readable family name, or a family the product already ships, where the built-in face wins the name and the uploaded file is never drawn. Fonts uploaded before that was refused are still stored; this is where they say so. Use `images[].key`, not `images[].url`. The key is resolved against storage at render time, so a template that names it keeps working and picks up a replaced logo. A URL written into a document is a copy of a decision made once. A team can keep more than one kit. `fonts` and `images` cover all of them, because that is the scope a render resolves them in — a family or a key from any kit works in any template — and each entry carries `kit_id`/`kit_name`. `kits[]` lists the kits with their own palettes; the top-level `id`, `name` and `colors` are the default kit's, and an upload with no kit named goes there.