---
title: "AI planner templates"
method: GET
path: "/planner_templates"
tags: ["catalog"]
---

# AI planner templates

`GET /planner_templates`

## Request

- Base URL: `https://api.planvortex.com/v1.0.0`
- URL: `https://api.planvortex.com/v1.0.0/planner_templates`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (client credentials, token URL `https://api.planvortex.com/v1.0.0/oauth/token`)

What an AI plan can be generated FROM, and what each source allows.

A template is the **source** of the content, not the wizard's flow: sharing, publish days, language, tone and images stay cross-cutting options, and every template declares which of them it accepts. Send the chosen one as `template` when creating a plan (`POST /ai_plans`), together with its `source`.

• **`generates_images: false` means the pictures come from the source** — your own photos, your catalogue — so the plan spends **no image credits at all**. A week of 7 publications with a picture on each goes from 519 credits to 48, and it is worth saying out loud before the plan is created.
• **`regenerate` is per template.** A template that did not generate the image cannot regenerate it: offer that button anyway and the user pays 70 credits to replace their own photo with an invented one.
• **`orchestration_cost` is an ESTIMATE, not the bill.** The real charge is per use (what the provider reports). `orchestration_cost_per_source_item` is what each unit of the source adds on top — one vision pass per image.
• **A plan is WEEKLY, and the source does not extend it.** With `max_source_items` photos but fewer slots left in the week, the extra ones are dropped and the plan carries warning 2117 in `ai_plan.warnings`. Say it in your UI *before* creating the plan, not after charging for it.
• **`source_fields` is what the source step is made of.** The simple types are ordinary controls; `uploads_with_description` and `catalog_products` are the signal that the step needs a component of its own.
• **Not every network fits every template.** `unsupported_networks` lists the ones whose accounts a plan of that template cannot carry (2120): offer only the rest, instead of letting the user pick a YouTube account for a week of product photos.
• **The fields carry their own limits.** `max` and `min` are in the field's own units — characters of a text, items of a list, **days** for a date — and `source_requires_any` names the fields of which at least one is needed (`from_text`: the URL or the pasted text; `from_catalog`: a Meta catalogue account or a connected store). Read them from here; hardcoding them is how a wizard ends up rejecting at a number the server does not use.

## Response `200`

Available planner templates

- object
  - `templates` CatalogPlannerTemplate[]
    - `template` 'standard' | 'from_images' | 'from_text' | 'from_catalog' | 'campaign': What the plan is generated FROM, and what you send as `template` when creating it: • **`standard`** — a theme prompt, images generated by the model. What every plan was before templates existed. • **`from_images`** — the user's own photos, each with its own description. One vision pass over ALL of them at once, so the model can sequence a narrative (photo 3 the "before", photo 7 the "after") instead of writing seven independent posts. It generates no images. • **`from_text`** — an article: a URL that is downloaded at creation, or the text pasted by hand. • **`from_catalog`** — products read LIVE from a connected catalogue (a Meta catalogue through a connected account, or a connected store such as WooCommerce), with their name, their description, their price, their picture and the link to their page. The one template that cannot be copied by a generic AI tool, because it needs the catalogue connection. • **`campaign`** — a countdown towards a date, with a narrative arc: teaser, announcement, reminder, today, thank you. The only plan that is a story instead of seven loose posts.
    - `allows_shared` boolean: Does it accept `options.shared` (one content replicated across every account)?
    - `allows_gallery` boolean: Does it accept `options.gallery_uploads` (visual references for the generated images)?
    - `generates_images` boolean: false = the pictures come from the source, and the plan spends no image credits.
    - `regenerate` object: What can be regenerated on a publication of this plan.
      - `text` boolean
      - `image` boolean
    - `orchestration_cost` integer: Estimated credits for this template's orchestration pass. The real charge is per use.
    - `orchestration_cost_per_source_item` integer: Extra estimated credits per unit of source (per image, in `from_images`). 0 when the source does not scale the prompt.
    - `max_source_items` integer: Hard cap of source units accepted. 0 = this template has no unit-based source.
    - `source_fields` CatalogPlannerTemplateField[]
      - `name` string
      - `type` 'text' | 'textarea' | 'url' | 'boolean' | 'select' | 'date' | 'uploads_with_description' | 'catalog_products'
      - `required` boolean
      - `default` unknown
      - `options` string[]
      - `max` integer: Cap in the field's **own units**: characters of a text, items of a list, and **days** of a `date` — the `event_date` of `campaign` carries 60, which is how far ahead of the plan week the countdown may point.
      - `min` integer: Floor in the field's own units. Today only `from_text`: under 200 characters it is not an article, it is the theme, which is `prompt` and another field. Published for the same reason as `max` — without it your UI hardcodes the 200 and the user gets a 2116 AFTER pasting the text instead of while pasting it.
    - `source_requires_any` string[]: Fields of which AT LEAST ONE is needed, even though none of them is required on its own: `from_text` takes the URL or the pasted text, never both empty (2116); `from_catalog` takes `id_account_catalog` or `id_integration_catalog`, and exactly one (2112 with both). It exists because a field's `required` cannot say "one or the other", and without it your UI would have to hardcode that rule — exactly the copy this catalogue exists to avoid. Absent = there is nothing of the sort to resolve.
    - `unsupported_networks` SocialNetwork[]: Networks whose accounts cannot be in a plan of this template: creating one is refused with 2120, before anything is read or charged. The ones that do not publish (`whatsapp`, `google_business`) on every template; and on the templates where every publication is the photo of its source (`from_images`, `from_catalog`), also the ones that do not publish images: `youtube`, which only uploads video. It is computed from the same data that validates publishing, not from a list: a new network that does not publish photos drops out on its own. Filter the accounts you offer with it.

## Other responses

- `400`: Error

---

[API](https://skmtc.dev/planvortex/apis/planvortex-api.md) · [All operations](https://skmtc.dev/planvortex/apis/planvortex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/planvortex/apis/planvortex-api/revisions/abedbbc1cd52?raw)
