Documentation Index
Fetch the complete documentation index at: https://docs.moda.app/llms.txt
Use this file to discover all available pages before exploring further.
POST /v1/tasks (REST) and the start_design_task MCP tool are the single entry point for every Moda design workflow. The same call covers four different patterns depending on which source-canvas field you set.
Which recipe do I want?
| Goal | Field to set | What happens |
|---|---|---|
| Generate a brand-new design from a prompt | (neither) | A new canvas is created in your team and the agent designs into it. |
| Edit an existing canvas you own | canvas_id | The agent modifies that canvas in place. |
| Fill in a template with your content | template_canvas_id | A copy of the template is created; the agent edits the copy. The original is untouched. |
| Rebrand a template for a different brand | template_canvas_id + a different brand_kit_id + a prompt that explicitly asks for a visual rebrand (e.g. "Rebrand the colors, fonts, logo, and imagery to the selected brand kit.") | A copy is created, the new brand kit is applied, and the agent rebrands colors, fonts, logo, and imagery on the copy. |
canvas_id and template_canvas_id are mutually exclusive. conversation_id is mutually exclusive with template_canvas_id (a template remix always starts a fresh conversation on the new copy). Setting incompatible fields returns 422 Unprocessable Entity.
Every recipe returns a Task envelope for polling, with a prefixed task_ ID and HATEOAS links for the running task and the resulting canvas.
Pin the API version on every request so the response shape stays stable. All examples below use
Moda-Version: 2026-05-01. See Versioning for the supported list and sunset schedule.1. Create a new design
Pass aprompt, a format, and optionally a canvas_name. Moda creates a fresh canvas and the agent designs into it.
REST vs MCP format arguments. The REST API takes a nested
format object (e.g. format: { "category": "slides" }). The MCP tool flattens the same fields into top-level arguments — format_category, format_width, format_height, carousel_dimensions, carousel_page_count — and assembles them into the same format object before calling the REST handler. Use whichever shape matches the surface you’re calling.brand_kit_id (or rely on your team’s default) to ground the output in your brand.
format is required when creating a new canvas. It is ignored when canvas_id or template_canvas_id is set — the existing canvas’s dimensions win.
2. Edit an existing canvas
Passcanvas_id and the agent modifies that canvas in place. Use this when you want to iterate on a design you already have — fix typos, swap data, change a section — without forking it.
3. Fill in a template
Pass the source canvas astemplate_canvas_id. Moda copies the canvas into your team and the agent edits the copy — the original stays clean.
The source does not have to be flagged as a template (template_type='template'); any canvas you can read from your team works.
Pick a brand_kit_id that matches the source canvas’s brand kit. Skill selection is a direct comparison between the source’s brand kit and the request’s brand_kit_id — if they match, you get the content-only remix (preserve design, update content). If they differ, you get the full rebrand instead. Omitting brand_kit_id falls back to your team’s default, which only behaves the same as recipe 3 when the team default is the source’s brand kit; otherwise you’ll land in recipe 4 behavior. See Automatic mode selection for the full matrix.
4. Rebrand a template for a different brand
The same call shape as recipe 3, but pass a differentbrand_kit_id than the one the source canvas was built for. This is the agency / multi-client pattern: take one well-designed template and produce variants across different brand identities.
Automatic mode selection
You never tell the API which “skill” to use. For any task withtemplate_canvas_id, the backend resolves an effective brand kit for the request and compares it against the source canvas’s brand kit.
The effective brand kit is resolved in this order:
skip_brand_kit: true→ no brand kit, skip the default.- Explicit
brand_kit_idon the request. - Team’s default brand kit (if one is set).
- None.
| Source canvas’s brand kit | Effective request brand kit | Skill that runs |
|---|---|---|
bk_acme | bk_acme | Content-only remix |
bk_acme | bk_initech (any kit different from source) | Full rebrand |
bk_acme | none (e.g. skip_brand_kit: true or no team default and brand_kit_id omitted) | Full rebrand |
/v1/tasks call covers all of these. Switch brands by switching brand_kit_id.
The skill controls what the agent is allowed to change. Your prompt still controls what the agent actually changes. For the full-rebrand skill, that means you have to ask the agent to update colors, fonts, logo, and imagery — see the warning under recipe 4. For the content-only skill, the agent never touches those dimensions regardless of how the prompt is phrased.
Response shape
Every recipe returns aTask envelope. For template-based recipes (3 and 4), the envelope also carries the source canvas on both input and result so pollers can correlate the new canvas with its source without an extra fetch:
input block is a normalized echo of the request, not a verbatim copy: template_canvas_id is rewritten to source_canvas_id so the same field name carries the source on both the input and the result side. For recipes 1 and 2, source_canvas_id and source_canvas_url are absent from both blocks.
Common options
These apply to every recipe:| Field | Effect |
|---|---|
prompt | Required. Natural-language instruction for the agent. |
brand_kit_id | Apply a specific brand kit. Omit to use your team’s default. Must belong to your team. When template_canvas_id is set, the resolved kit is also what drives skill selection — see Automatic mode selection. |
skip_brand_kit | true to skip brand-kit application entirely (even the team default). Overrides brand_kit_id when both are set. |
idempotency_key | Replay-safe identifier. A retry with the same key returns the original task without creating a duplicate canvas. |
callback_url | HTTPS URL to receive a signed webhook when the task terminates. See Webhooks for signature verification. |
attachments | Reference images or files. Use either inline URLs or file_ids from POST /v1/uploads. |
reference_canvas_ids | Canvas IDs to show the agent as inspiration. Read-only — they are not modified. |
format | Output format. Required for recipe 1 (new canvas); ignored when canvas_id or template_canvas_id is set. |
model_tier | pro, standard, or lite. Omit for automatic selection. |
number_of_slides | Optional cap for slide-generation tasks. Omit to use the 8-slide default, clamped to your plan limit. |
conversation_id | Resume an existing conversation. Mutually exclusive with template_canvas_id — a template remix always starts a fresh conversation on the new copy. |
Polling and webhooks
Every recipe returns aTask envelope with a prefixed id (e.g. task_01HT9WK8N3M2J4A5Z6P7Q8R9TV). Poll GET /v1/tasks/{id} until status reaches a terminal value (succeeded, failed, canceled, or expired). The envelope’s retry_after_ms is a suggested poll interval.
If you’d rather not poll, set callback_url on the request and Moda fires a signed task.succeeded / task.failed / task.canceled webhook when the task terminates. See Webhooks for envelope shape, signature verification, and retry behavior.
See also
- Start Design Task — full schema for every request field.
- Get Task Status —
Taskenvelope reference and polling guidance. - Webhooks — signed-callback setup, payload shape, and signature verification.
- List Brand Kits — the brand kits you can pass to
brand_kit_id. - Authentication — API keys, scopes, and security.
- Versioning — pin a stable response shape with
Moda-Version.