---
title: "Submit template for approval"
method: POST
path: "/v1/templates/{templateId}/submit"
---

# Submit template for approval

`POST /v1/templates/{templateId}/submit`

## Request

- Base URL: `https://api.zavu.dev`
- URL: `https://api.zavu.dev/v1/templates/{templateId}/submit`
- Auth: HTTP bearer

Submit a WhatsApp template to Meta for approval. The template must be in draft status and associated with a sender that has a WhatsApp Business Account configured.

## Path parameters

- `templateId` string, required

## Request body

- object
  - `senderId` string, required: The sender ID with the WhatsApp Business Account to submit the template to.
  - `category` 'UTILITY' | 'MARKETING' | 'AUTHENTICATION': WhatsApp template category.
  - `variableExamples` object: Sample value for each body variable, sent to Meta as the example it reviews the template with. Key a named variable (`{{customer_name}}`) by its name, and a positional one (`{{1}}`, `{{2}}`) as `var1`, `var2`. Any variable left out gets a generic placeholder: a stock value for a few common names (`name`, `order_id`, `code`, ...) and `Sample <variable>` for the rest. Meta reviews those less favourably, so send a realistic value for every variable.

## Response `202`

Template submitted for approval.

- 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 request or template not in draft status.
- `401`: Unauthorized.
- `404`: Template or sender not found.

## Changes

> 80 revisions in range; 1 not diffed.

- **2026-08-01** `23fe6e10876d`: 1 warning
  - added the new `request_contact_info` enum value to the `buttons/items/type` response property for the response status `202`
- **2026-05-15** `3e45958691da`: 1 info
  - added the optional property `buttons/items/example` to the response with the `202` status
- **2026-04-12** `d264cd6c8b05`: 3 info
  - added the optional property `instagramBody` to the response with the `202` status
  - added the optional property `smsBody` to the response with the `202` status
  - added the optional property `telegramBody` to the response with the `202` status

[Operation history](https://skmtc.dev/zavudev/apis/zavu-unified-messaging-layer-api/changes/v1/templates/:templateId/submit/post.md)

---

[API](https://skmtc.dev/zavudev/apis/zavu-unified-messaging-layer-api.md) - [All operations](https://skmtc.dev/zavudev/apis/zavu-unified-messaging-layer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zavudev/apis/zavu-unified-messaging-layer-api/revisions/75bc777b0ffb?raw)
