---
title: "Create template"
method: POST
path: "/v1/templates"
---

# Create template

`POST /v1/templates`

Create a WhatsApp message template. Note: Templates must be approved by Meta before use.

## Request body

- TemplateCreateRequest
  - `name` string, required
  - `language` string, required
  - `body` string, required — Default template body. Used when no channel-specific body is set.
  - `smsBody` string — Channel-specific body for SMS. Falls back to `body` if not set.
  - `telegramBody` string — Channel-specific body for Telegram. Falls back to `body` if not set.
  - `instagramBody` string — Channel-specific body for Instagram. Falls back to `body` if not set.
  - `whatsappCategory` 'UTILITY' | 'MARKETING' | 'AUTHENTICATION' — WhatsApp template category.
  - `headerType` 'text' | 'image' | 'video' | 'document' — Type of header for the template.
  - `headerContent` string — Header content (text string or media URL).
  - `footer` string — Footer text for the template.
  - `variables` string[]
  - `buttons` object[] — Template buttons (max 3).
    - `type` 'quick_reply' | 'url' | 'phone' | 'otp' | 'request_contact_info', required — `request_contact_info` renders a fixed **Share Contact Info** button that asks the recipient to share their phone number — useful when a contact adopted a WhatsApp username and you only know their BSUID. It takes no other fields.
    - `text` string — Button label. Required for every type except `request_contact_info`, whose label is fixed by WhatsApp.
    - `url` string, uri — Button destination. Use `{{1}}` exactly once for a dynamic URL (e.g. `https://example.com/orders/{{1}}`); WhatsApp only accepts the strict `{{1}}` form. Static URLs must not contain any `{{...}}` placeholder.
    - `example` string — Sample value Meta uses to review templates with a dynamic URL button. Substituted into `{{1}}` of the URL when the template is submitted to Meta. Only meaningful when `url` contains `{{1}}`; ignored for static URLs.
    - `phoneNumber` string
    - `otpType` 'COPY_CODE' | 'ONE_TAP' — Required when type is 'otp'. COPY_CODE shows copy button, ONE_TAP enables Android autofill.
    - `packageName` string — Android package name. Required for ONE_TAP buttons.
    - `signatureHash` string — Android app signature hash. Required for ONE_TAP buttons.
  - `addSecurityRecommendation` boolean — Add 'Do not share this code' disclaimer. Only for AUTHENTICATION templates.
  - `codeExpirationMinutes` integer — Code expiration time in minutes. Only for AUTHENTICATION templates.

## Response `201`

Template created.

- Template
  - `id` string, required
  - `name` string, required — Template name. For WhatsApp, must match the approved template name in Meta.
  - `language` string, required — Language code.
  - `body` string, required — Default template body with variables: positional ({{1}}, {{2}}) or named ({{customer_name}}, {{contact.first_name}}). Templates created in Zavu are submitted to Meta as positional; templates imported from a WhatsApp Business Account keep their original format (named or positional). Used when no channel-specific body is set.
  - `smsBody` string — Channel-specific body for SMS messages. Falls back to `body` if not set.
  - `telegramBody` string — Channel-specific body for Telegram messages. Falls back to `body` if not set.
  - `instagramBody` string — Channel-specific body for Instagram messages. Falls back to `body` if not set.
  - `category` 'UTILITY' | 'MARKETING' | 'AUTHENTICATION', required — WhatsApp template category.
  - `status` 'draft' | 'pending' | 'approved' | 'rejected'
  - `variables` string[] — List of variable names for documentation.
  - `headerType` string — Type of header (text, image, video, document).
  - `headerContent` string — Header content (text or media URL).
  - `footer` string — Footer text for the template.
  - `buttons` object[] — Template buttons.
    - `type` 'quick_reply' | 'url' | 'phone' | 'otp' | 'request_contact_info'
    - `text` string
    - `url` string
    - `example` string — Sample value used to substitute `{{1}}` in the URL when submitting the template to Meta for review. Only present for dynamic URL buttons.
    - `phoneNumber` string
    - `otpType` 'COPY_CODE' | 'ONE_TAP' — OTP button type. Required when type is 'otp'.
    - `packageName` string — Android package name. Required for ONE_TAP buttons.
    - `signatureHash` string — Android app signature hash. Required for ONE_TAP buttons.
  - `addSecurityRecommendation` boolean — Add 'Do not share this code' disclaimer. Only for AUTHENTICATION templates.
  - `codeExpirationMinutes` integer — Code expiration time in minutes. Only for AUTHENTICATION templates.
  - `whatsapp` object — WhatsApp-specific template information.
    - `templateName` string — WhatsApp template name.
    - `namespace` string — WhatsApp Business Account namespace.
    - `status` string — WhatsApp approval status.
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Other responses

- `400` — Invalid template.
- `401` — Unauthorized.

---

[API](https://skmtc.net/zavudev/apis/zavu-unified-messaging-layer-api.md) · [All operations](https://skmtc.net/zavudev/apis/zavu-unified-messaging-layer-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zavudev/zavu-unified-messaging-layer-api/versions/07b87b6ae707/schema)
