POST /v1/actions/list-templates

List all templates in your tenant, optionally filtered by Meta approval status.

Returns every template in your tenant. Filter by Meta approval status to find sendable ones.

POST /api/v1/actions/list-templates

Request body

Field Type Required Notes
status string no One of APPROVED, PENDING, REJECTED
curl -X POST https://www.qyvo.io/api/v1/actions/list-templates \
  -H "Authorization: Bearer YOUR_TOKEN_HERE" \
  -H "Content-Type: application/json" \
  -d '{"status": "APPROVED"}'
const templates = await fetch('https://www.qyvo.io/api/v1/actions/list-templates', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.QYVO_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ status: 'APPROVED' }),
}).then((r) => r.json());
$templates = Http::withToken(env('QYVO_TOKEN'))
    ->post('https://www.qyvo.io/api/v1/actions/list-templates', [
        'status' => 'APPROVED',
    ])
    ->json();
import os, httpx
templates = httpx.post(
    'https://www.qyvo.io/api/v1/actions/list-templates',
    headers={'Authorization': f"Bearer {os.environ['QYVO_TOKEN']}"},
    json={'status': 'APPROVED'},
).json()

Response — 200 OK

[
  {
    "id": "01J0AB...",
    "name": "order_confirmation",
    "category": "UTILITY",
    "status": "APPROVED",
    "languages": ["en", "fr", "es"],
    "created_at": "2026-04-15T10:32:00+00:00"
  }
]
Field Notes
name Meta template name (snake_case, unique per tenant)
category UTILITY, MARKETING, AUTHENTICATION — drives Meta pricing tier
status Tenant-level state. A template might be APPROVED overall but only some translations approved — see get-template.
languages All translation language codes attached to the template

Pricing note

Templates are billed per category by Meta — UTILITY is cheap, MARKETING is the expensive bucket. Free-form text inside the 24h window is free. See the Qyvo pricing page for the full breakdown.