Intake Templates
Overview
Templates let you save item sets and reuse them across projects. Instead of defining items from scratch each time, point define_intake at a template and the items are filled in automatically. You can still override or extend template items for a specific project.
Templates are especially useful in agency settings where you run the same type of project repeatedly — restaurant websites, advisor pages, e-commerce stores — and want a consistent, tested item set.
Built-in templates
Three public templates are available on all plans, including Free. They are always present and cannot be deleted. All three are Czech-language templates (language: "cs") — their item labels and help text are in Czech, since they were built for Radim's own agency work.
restaurant-web-cs
For restaurant and cafe website projects.
| Item key | Type | Notes |
|---|---|---|
logo |
image | SVG/PNG/JPEG, min. 512px wide, required |
hero_copy |
longtext | Short intro text (max 400 chars), required |
about |
longtext | Restaurant story, atmosphere, specialties (100–2000 chars), required |
opening_hours |
structured | Object with mon_fri, saturday, sunday fields, required |
gallery |
file_list | Interior/food/exterior photos, 5–15 files, min. 1200px wide, required |
menu_pdf |
file | PDF menu — optional |
brand_colors |
color_list | Up to 5 brand colors — optional |
ga4_id |
text | Google Analytics measurement ID, pattern ^G-[A-Z0-9]+$ — optional |
advisor-web-cs
For financial advisors, coaches, consultants, and similar professional profile pages.
| Item key | Type | Notes |
|---|---|---|
logo |
image | SVG/PNG, min. 512px wide — optional |
portrait |
image | Professional headshot, min. 800×800px, required |
hero_copy |
longtext | One-line headline (max 200 chars), required |
bio |
longtext | About the advisor (150–3000 chars), required |
services |
structured | Up to 6 services, each with name + description, required |
brand_colors |
color_list | Up to 3 brand colors — optional |
contact |
structured | Object with phone, email (required), address (optional) |
ga4_id |
text | Google Analytics measurement ID — optional |
club-web-cs
For sports clubs and other associations — not an e-commerce template; there is currently no built-in e-commerce template.
| Item key | Type | Notes |
|---|---|---|
logo |
image | SVG/PNG/JPEG, min. 512px wide, required |
hero_copy |
longtext | Motto or one-line intro (max 200 chars), required |
about |
longtext | Club history and focus (100–2500 chars), required |
founding_year |
text | 4-digit year, pattern ^\d{4}$ — optional |
activities |
longtext | What the club does, meetup schedule (80–2000 chars), required |
gallery |
file_list | Event photos, 3–12 files, min. 1024px wide — optional |
contact |
structured | Object with email (required), phone, address (optional) |
social_urls |
structured | Object with facebook, instagram, youtube URLs — optional |
Using a template in define_intake
Pass the template slug in the template field:
{
"project_name": "Bella Cucina Restaurant Website",
"client": {
"email": "owner@bellacucina.cz",
"name": "Marco"
},
"template": "restaurant-web-cs",
"branding": {
"sender_name": "Radim"
}
}This creates an intake with all restaurant-web-cs items pre-populated. items is optional here — with template set, POST /v1/intakes no longer requires it; omitting it (or sending "items": []) means "every item comes from the template." Without template, items is still required and non-empty, with the same 422 as before.
Overriding and extending
Provide an items array alongside template to override specific items or add new ones. Items in your items array are merged with the template:
- If
keymatches a template item, your definition overrides the template's - If
keyis new, it is appended after the template items
Every entry in items — including one that only means to tweak a template item — must still be a complete item definition (key, type, and label are all required by the API; there is no partial-patch shorthand that lets you send just the field you want to change):
{
"template": "restaurant-web-cs",
"items": [
{
"key": "menu_pdf",
"type": "file",
"label": "Jídelní lístek (PDF)",
"required": false,
"help": "Only needed if you want a downloadable menu link. Skip if menu is managed online."
},
{
"key": "allergen_info",
"type": "file",
"label": "Allergen information document",
"required": false
}
]
}Creating custom templates
Custom templates require the Solo plan or above ($29/mo) — on Free, POST /v1/templates fails with a plan_required error, and Free accounts can only use the three built-in public templates above. POST /v1/templates also requires a logged-in dashboard session; an agent authenticated with only an API key cannot create a custom template through this endpoint — create it from the dashboard instead (or ask a teammate with dashboard access to).
From the dashboard, the quickest way is Save as template next to the Send button when you finish building an intake. It stores the item definitions and the language only — never the client's name, e-mail or project name — so the same template is safe to reuse for the next client. Through the API there is no way to copy an existing intake: POST /v1/templates only accepts a template built from scratch, described below.
POST /v1/templates{
"name": "SaaS Landing Page",
"description": "Standard intake for SaaS product landing page projects",
"language": "en",
"items": [
{"key": "logo", "type": "image", "label": "Product logo"},
{"key": "hero_headline", "type": "text", "label": "Hero headline", "constraints": {"max_chars": 80}},
{"key": "hero_subline", "type": "text", "label": "Hero subline", "constraints": {"max_chars": 160}},
{"key": "stripe_keys", "type": "secret", "label": "Stripe API keys"}
]
}There is no slug field to set — the slug is derived automatically from name (lowercased, non-alphanumeric characters replaced with hyphens). language accepts cs, en, or de — not the full six-language portal list. Constraints such as max_chars must be nested under constraints, the same as in define_intake's items — a top-level max_chars on the item is rejected.
Template settings
A template can also store every other create-intake setting besides items — chase cadence, retention, branding, and which folder new intakes land in. POST /v1/templates accepts an optional settings object with these fields, all optional:
| Field | Same as on define_intake |
Notes |
|---|---|---|
due_in_days |
— | Integer, 0–365. There is no due_date field here: a template cannot hold an absolute date, only an offset from the day the intake is created. |
chase_schedule |
chase_schedule |
|
chase_interval / chase_interval_unit |
same | Only with chase_schedule: "custom" — same rule as define_intake. |
respect_quiet_hours |
same | |
max_reminders |
same | |
chase_at_time |
same | |
email_copy |
same | |
auto_approve_hours |
same | |
retention |
same | |
branding |
same | |
folder_id |
same | Still checked against the caller's own account when the intake is created — a template built under one account cannot silently file an intake into another account's folder. |
client_brief |
client_brief |
Text only — a template has no intake to attach files to. See Client brief. |
{
"name": "SaaS Landing Page",
"language": "en",
"items": [
{"key": "logo", "type": "image", "label": "Product logo"}
],
"settings": {
"due_in_days": 14,
"chase_schedule": "custom",
"chase_interval": 5,
"chase_interval_unit": "days",
"retention": {"mode": "on_delivery", "anonymize": false}
}
}Settings are defaults, not overrides. When an intake is created with template set, each setting field applies only if the create-intake request itself leaves that field unset. Anything the request sets explicitly — even a value that happens to match what a template also sets — always wins, field by field; nothing is merged inside a single field (an email_copy sent on the request replaces the template's email_copy object whole, it does not merge subject/intro lines individually). due_in_days is resolved to a real due_date at the moment the intake is created (creation day + N), unless the request already supplies its own due_date.
A template that omits settings entirely — including the three built-in public templates — changes nothing beyond items; GET/POST /v1/templates then reports settings as null.
settings is API-only for now: the dashboard's Save as template button (above) still stores items and language only.
Listing templates
GET /v1/templatesReturns public templates and your own custom templates together, as { "templates": [...] }. There is currently no ?public=true (or any other) filter on this endpoint — a query string has no effect; filter the result client-side if you only want the public ones (accountId is null on those).
The response is the template row as stored, not a summarized view — in particular items is the full array of item definitions (not a count), settings is either the full settings object described above or null, and there is no field tracking which user created a template, only which account owns it. Note that this endpoint's field names are the raw camelCase database columns (accountId, isPublic, createdAt, …), unlike the rest of the API, which returns snake_case.
Agency: team-shared templates
On Agency plans, templates created by any seat member are visible to all seats in the account. There is no separate sharing step — templates are team-scoped by default.
This lets you build a library of standard intake checklists once and use them across all projects, regardless of which team member creates the intake.
To keep templates organized, use consistent slug naming:
restaurant-web-v2
advisor-web-minimal
webapp-onboardingCustom templates require Solo, Studio, or Agency (Free cannot create any). On Solo and Studio, custom templates are scoped to the account's single seat; on Agency they are shared across all seats, as above.