Boltly Boltly / Docs
Docs / API Reference / Templates

Templates

Create, manage, and submit WhatsApp message templates for Meta approval. Approved templates are required for business-initiated messages and broadcasts.

POST /v1/templates

Create template

Create a draft WhatsApp message template. Drafts can be edited freely until submitted to Meta for approval.

Parameters

name string required

Template name. Alphanumeric characters and underscores only.

category string required

One of: authentication, utility, marketing.

language string

Language code, ISO 639-1 (e.g. "en") or WhatsApp locale (e.g. "en_US"). Defaults to "en".

inbox_id string

Inbox (WhatsApp number) this template belongs to.

template_data object required

Template content.

template_data.body string required

Body text. Max 1024 characters. Variables as {{1}}, {{2}}, numbered sequentially from 1.

template_data.header object

Header with type (text, image, video, document) and text or media_url.

template_data.footer string

Footer text.

template_data.buttons array

Up to 3 buttons of type quick_reply, url, or phone_number.

variables array

Variable definitions with name, component ("HEADER", "BODY", "BUTTONS"), and optional button_index.

Request

cURL
curl -X POST https://api.boltly.online/v1/templates \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "order_update",
    "category": "utility",
    "language": "en",
    "template_data": {
      "body": "Hi {{1}}, your order {{2}} has shipped!"
    },
    "variables": [
      { "name": "1", "component": "BODY" },
      { "name": "2", "component": "BODY" }
    ]
  }'

Response

JSON
{
  "data": {
    "id": "9f2c1a3e-...",
    "name": "order_update",
    "channel": "whatsapp",
    "category": "utility",
    "language": "en",
    "status": "draft",
    "template_data": {
      "body": "Hi {{1}}, your order {{2}} has shipped!"
    },
    "variables": [
      { "name": "1", "component": "BODY" },
      { "name": "2", "component": "BODY" }
    ],
    "created_at": "2026-04-03T12:00:00Z",
    "updated_at": "2026-04-03T12:00:00Z"
  }
}

GET /v1/templates

List templates

Retrieve a paginated list of templates, filterable by status, category, language, and search term.

Parameters

status string

Filter by status. One of: draft, pending, approved, rejected, paused, disabled.

category string

Filter by category: authentication, utility, or marketing.

language string

Filter by language code.

search string

Search templates by name.

sort string

Sort order. One of: latest, oldest, name-asc, name-desc.

page integer

Page number. Defaults to 1.

per_page integer

Results per page. Defaults to 25, max 100.

Request

cURL
curl "https://api.boltly.online/v1/templates?status=approved&category=utility" \
  -H "X-API-Key: $API_KEY"

Response

JSON
{
  "data": [
    {
      "id": "9f2c1a3e-...",
      "name": "order_update",
      "channel": "whatsapp",
      "category": "utility",
      "language": "en",
      "status": "approved",
      "quality_rating": "GREEN",
      "created_at": "2026-04-03T12:00:00Z",
      "updated_at": "2026-04-05T09:30:00Z"
    }
  ],
  "meta": { "page": 1, "per_page": 25, "total": 12 }
}

POST /v1/templates/{id}/submit

Submit for approval

Submit a draft template to Meta for review. Status moves to pending, then approved or rejected once Meta completes review.

Parameters

id string required

Template ID.

Request

cURL
curl -X POST https://api.boltly.online/v1/templates/9f2c1a3e-.../submit \
  -H "X-API-Key: $API_KEY"

Response

JSON
{
  "data": {
    "id": "9f2c1a3e-...",
    "name": "order_update",
    "status": "pending",
    "external_id": "1234567890",
    "updated_at": "2026-04-03T12:05:00Z"
  }
}

POST /v1/templates/sync

Sync from Meta

Pull the latest template statuses, quality ratings, and rejection reasons from Meta into Boltly.

Parameters

inbox_id string

Sync templates for a specific inbox. Defaults to all connected inboxes.

Request

cURL
curl -X POST https://api.boltly.online/v1/templates/sync \
  -H "X-API-Key: $API_KEY"

Response

JSON
{
  "data": {
    "synced": 12,
    "updated": 3,
    "statuses": {
      "approved": 9,
      "pending": 2,
      "rejected": 1
    }
  }
}