Skip to content
MeridFlow AiFlow v8.x • self-hosted

Built-in templates

A template creates a ready-made multi-Orchestrator setup in one call: a top-level Orchestrator plus two sub-Orchestrators, already linked agent_tool-style and with their built-in tools already turned on. This page covers listing the catalog and instantiating one. The result is a normal Orchestrator object, see Orchestrators for every field it exposes and how to edit it afterward.

Gated behind a deployment setting, admin session token required

See the two notes at the top of Orchestrators: every endpoint here only exists when your deployment has Orchestrators turned on, and every endpoint here authenticates with an admin session token.

The catalog

GET /api/v1/orchestrator-templates

Requires: Viewer and above.

Returns every built-in template this AiFlow version ships.

Field Type Notes
key string The template's identifier, used as the {key} path segment when instantiating it.
name string A human-readable display name.
description string A short summary of what the resulting Orchestrator does.
sub_templates array The sub-Orchestrators this template creates, see below.
sub_templates[].key string The sub-Orchestrator's identifier within this template.
sub_templates[].name string A human-readable display name for the sub-Orchestrator.
sub_templates[].description string A short summary of the sub-Orchestrator's role.
sub_templates[].tool_names array of strings The built-in tools this sub-Orchestrator has turned on, matching the name values from Orchestrator tools.
curl https://api.your-domain.com/api/v1/orchestrator-templates \
  -H "Authorization: Bearer $ADMIN_TOKEN"
import httpx

response = httpx.get(
    "https://api.your-domain.com/api/v1/orchestrator-templates",
    headers={"Authorization": f"Bearer {admin_token}"},
)
response.raise_for_status()
catalog = response.json()
const response = await fetch("https://api.your-domain.com/api/v1/orchestrator-templates", {
  headers: { Authorization: `Bearer ${adminToken}` },
});
const catalog = await response.json();

The three built-in templates

Each is adapted from a real Google ADK sample agent, narrowed to what needs nothing beyond Gemini or Vertex AI and never pauses mid-run waiting on a human decision.

key What it does Sub-Orchestrators
content_claim_auditor Fact-checks a piece of text against current web sources and returns a corrected version with a changelog. critic (verifies each claim with google_search), reviser (rewrites the text using the critic's findings)
research_report_assistant Researches a topic and returns a structured, sourced report. researcher (gathers current information with google_search), synthesizer (turns raw findings into a report)
marketing_campaign_assistant Proposes a brand name and writes launch copy for a product or business. brand_namer (proposes and checks candidate names with google_search), copywriter (writes the tagline, website copy, and social posts)

Instantiating a template

POST /api/v1/orchestrator-templates/{key}/instantiate

Requires: Admin and above, the same tier creating an Orchestrator by hand requires.

Field Type Required Notes
slug string Yes 1 to 60 characters, same pattern as a plain Orchestrator's slug. Capped shorter to leave room for the longest sub-Orchestrator suffix a template derives from it.
name string Yes 1 to 120 characters. Used as-is for the top-level Orchestrator; each sub-Orchestrator's own name becomes "{name}: {sub-Orchestrator name}".

{key} must be one of the key values from the catalog above; anything else gets a 404 with {"detail": "Unknown template '<key>'"}. Each sub-Orchestrator's slug is derived automatically, {slug}-{sub_template_key}, hyphenated (for example, instantiating content_claim_auditor with slug: "my-auditor" creates my-auditor, my-auditor-critic, and my-auditor-reviser). If slug, or any slug it would derive, is already in use, nothing is created and the request returns a 409:

{ "detail": "Slug(s) already in use: my-auditor-critic" }
curl -X POST https://api.your-domain.com/api/v1/orchestrator-templates/content_claim_auditor/instantiate \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -d '{"slug": "site-copy-auditor", "name": "Site Copy Auditor"}'
import httpx

response = httpx.post(
    "https://api.your-domain.com/api/v1/orchestrator-templates/content_claim_auditor/instantiate",
    headers={"Authorization": f"Bearer {admin_token}"},
    json={"slug": "site-copy-auditor", "name": "Site Copy Auditor"},
)
response.raise_for_status()
orchestrator = response.json()
const response = await fetch(
  "https://api.your-domain.com/api/v1/orchestrator-templates/content_claim_auditor/instantiate",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${adminToken}`,
    },
    body: JSON.stringify({ slug: "site-copy-auditor", name: "Site Copy Auditor" }),
  },
);
const orchestrator = await response.json();

Returns 201 Created with the top-level Orchestrator object, the same shape Creating an Orchestrator returns. Its two sub-Orchestrators are created alongside it, already linked underneath it and, where the template calls for it, already tooled: fetch them from Listing Orchestrators or Sub-Orchestrator links if you need their own ids.

Nothing about a template-created row is special

A template only runs once, at instantiation time. Afterward, the resulting Orchestrator and its sub-Orchestrators are ordinary rows: edit an instruction, change a model, add or remove a sub-Orchestrator link, enable another tool, or disable one entirely through the same endpoints Orchestrators, Orchestrator links, and Orchestrator tools already document. There's no stored link back to the template that created them, and no re-sync or update-from-template mechanism: a template is a starting point, not an ongoing relationship.