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:

json
{
  "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:

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):

json
{
  "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
json
{
  "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.
json
{
  "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/templates

Returns 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-onboarding

Custom 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.