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.
Brand kits (REST)
Full CRUD-ish lifecycle for brand kits. All endpoints under/v1/brand-kits.
Endpoints
| Verb | Path | Scope | Purpose |
|---|---|---|---|
| GET | /brand-kits | brand_kits:read | Cursor-paginated list for the key’s team |
| POST | /brand-kits | brand_kits:write | Extract from a URL (Firecrawl) |
| PATCH | /brand-kits/{id} | brand_kits:write | Partial update |
| DELETE | /brand-kits/{id} | brand_kits:write | Soft delete; returns 204 |
| POST | /brand-kits/{id}/images | brand_kits:write | Attach uploaded file as logo / reference / asset |
Default kit
The first brand kit created for a team becomes the default automatically.POST /v1/tasks with no brand_kit_id uses the default. At most one default per team. The default is server-managed — there is no is_default field you can PATCH; the user changes defaults in the Moda app UI.
List
?cursor=. See pagination.md.
Create from URL
Prefer: wait=30:
stripe.com) or full URL (https://stripe.com). Cached — re-calling with the same URL returns the cached result quickly.
If the URL can’t be scraped (blocked by robots, 404, login-required): 422 scraping_user_error.
Update (partial)
colors overwrites the entire array — not a merge. To add one color, fetch the existing array, append, and PATCH the full list:
fonts, brand_values, brand_aesthetic, brand_tone_of_voice.
Returns the updated record.
Add images (logos / references / assets)
file_id from POST /v1/uploads. Attaches the uploaded file to the kit in the named role. Role here is about the kit (what this image represents in the brand) — different from the role field on task attachments (source / reference / asset).
| Role (brand kit) | Meaning |
|---|---|
logo | Logo asset (Moda uses it automatically on title slides, footers, etc.) |
reference | Style reference for the design agent |
asset | Miscellaneous asset |
Delete
204 No Content. Soft delete — historical tasks that referenced this kit continue to show it in their audit record. New design tasks with brand_kit_id pointing at a deleted kit get 404 not_found.
If the deleted kit was the team’s default, there is no new default automatically. The team operates brand-kit-less until another kit is promoted (in the app UI) or a new kit is created.
In-task usage
Passbrand_kit_id explicitly on POST /v1/tasks to override the default:
skip_brand_kit: true to apply no kit:
skip_brand_kit overrides brand_kit_id when both are present.
Common wrong guesses
- Merging array updates client-side without reading first. You’ll overwrite the kit’s colors / fonts with just the new entries. Always read, append, PATCH.
- Treating
is_defaultas writable. It’s server-managed. Default changes happen in the app UI. - Using
POST /v1/brand-kitswithoutPrefer: waitand blocking on the response. The HTTP call returns the completed kit, but it took 10–30s — budget accordingly. - Passing
brand_kit_idfor a deleted kit.404. Check the kit exists before submitting the task. - Mixing up the task-attachment
roleand the brand-kit-imagerole. Taskroleissource/reference/asset. Brand-kit imageroleislogo/reference/asset. Similar words, different values.