Raw schema
{
"type": "object",
"properties": {
"requests": {
"description": "1-20 items, each {topic, count?, archetypes?, style?}. Per-item `mode` is rejected: mode, tags, verbosity and idempotency_key are set ONCE for the whole batch. Unknown item keys are invalid_request.",
"items": {
"$ref": "#/$defs/BatchGenerateItem"
},
"maxItems": 20,
"minItems": 1,
"title": "Requests",
"type": "array"
},
"platform": {
"default": "tiktok",
"description": "Target platform, which selects the length/format conventions the hooks are written and scored against. Defaults to tiktok when omitted.",
"enum": [
"tiktok",
"instagram",
"youtube",
"x",
"linkedin"
],
"title": "Platform",
"type": "string"
},
"mode": {
"anyOf": [
{
"enum": [
"instant",
"template",
"off",
"quick",
"smart",
"llm",
"on",
"fast",
"research",
"search",
"deep",
"deep_research",
"auto"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Generation engine and therefore the price: instant (0 base + 1/hook, deterministic templates, sub-second), smart (0 + 2/hook, one LLM call, seconds), research (10 + 4/hook, brief->draft->judge, tens of seconds). Aliases: template|off|quick->instant, llm|on|fast->smart, search|deep|deep_research->research. Omit (or auto) -> smart when an LLM key is configured, else instant.",
"title": "Mode",
"enum": [
"instant",
"template",
"off",
"quick",
"smart",
"llm",
"on",
"fast",
"research",
"search",
"deep",
"deep_research",
"auto",
null
]
},
"tags": {
"anyOf": [
{
"items": {
"maxLength": 40,
"minLength": 1,
"pattern": "^[a-z0-9_-]+$",
"type": "string"
},
"maxItems": 5,
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "1-5 lowercase slug tags ([a-z0-9_-], <=40 chars) stamped on this call's usage event so a fleet can attribute spend per campaign. Omit for no tagging. Filter later with get_usage(tag=...) / list_hooks(tag=...).",
"title": "Tags",
"maxItems": 5,
"items": {
"maxLength": 40,
"minLength": 1,
"pattern": "^[a-z0-9_-]+$",
"type": "string"
}
},
"verbosity": {
"default": "standard",
"description": "How much of the response envelope to return: minimal (ids/text/totals only), standard (the default), full (adds per-dimension score attribution and timings). Shapes the RESPONSE only, never what is generated, persisted, hashed for idempotency, or charged.",
"enum": [
"minimal",
"standard",
"full"
],
"title": "Verbosity",
"type": "string"
},
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "API key for this call. Omit to fall back to the Authorization: Bearer / X-API-Key request header (streamable-HTTP only), then the VHGENGINE_API_KEY env var (the stdio default). No key resolvable -> unauthorized.",
"title": "Api Key"
},
"idempotency_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Caller-chosen replay key (any string, unique per intended effect). A repeat call with the SAME key returns the stored result and is NEVER charged twice; the same key with different arguments is an idempotency_conflict. Omit and every call is a fresh, separately charged operation.",
"title": "Idempotency Key"
}
},
"required": [
"requests"
],
"$defs": {
"BatchGenerateItem": {
"additionalProperties": false,
"description": "One item in a generate_hooks_batch call; mirrors the REST batch item schema.\n\nA typed pydantic model (WP-C.4) so tools/list inputSchema shows the item shape\n(topic/count/archetypes/style) instead of a bare additionalProperties:true.\nextra=\"forbid\" so an unknown key (e.g. a per-item `mode`, which is set once at the\nbatch level) is a typed invalid_request at the argument-validation boundary rather\nthan being silently dropped and billed at the batch mode.",
"properties": {
"topic": {
"description": "What this item's hooks are about, 3-200 chars. Required: there is no batch-level topic.",
"maxLength": 200,
"minLength": 3,
"title": "Topic",
"type": "string"
},
"count": {
"default": 10,
"description": "Hooks for THIS item, 1-25 (default 10). Each item is priced separately at base + per_hook * hooks_returned.",
"maximum": 25,
"minimum": 1,
"title": "Count",
"type": "integer"
},
"archetypes": {
"anyOf": [
{
"items": {
"enum": [
"curiosity_gap",
"contrarian",
"data_shock",
"story",
"transformation",
"listicle",
"authority",
"urgency"
],
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Restrict THIS item to these archetype ids (see list_archetypes); omit to let the engine spread. Per item, not batch-wide.",
"title": "Archetypes",
"items": {
"enum": [
"curiosity_gap",
"contrarian",
"data_shock",
"story",
"transformation",
"listicle",
"authority",
"urgency"
],
"type": "string"
}
},
"style": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Voice/tone to match, <=200 chars. Honored as a real instruction by smart and research; on instant it only varies which deterministic template fillers are drawn, so it cannot change the voice there. Omit for the engine's default register.",
"title": "Style",
"maxLength": 200
}
},
"required": [
"topic"
],
"title": "BatchGenerateItem",
"type": "object"
}
},
"title": "generate_hooks_batchArguments",
"additionalProperties": false
}