# Submit template for approval

> 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.

`POST https://api.zavu.dev/v1/templates/{templateId}/submit`

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.

## Parameters

- `templateId` (path, string, required)

## Body

- `senderId` (string, required): The sender ID with the WhatsApp Business Account to submit the template to.
- `category` (string): Template category. If not provided, uses the category set on the template. One of: `UTILITY`, `MARKETING`, `AUTHENTICATION`.
- `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.
  - `{key}` (string)

## Responses

### 202

Template submitted for approval.

- `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` (string, required): The category the template is billed under. For a template linked to WhatsApp this is the category **Meta currently assigns**, not the one it was submitted with: Meta can recategorize a template at approval or at any point afterwards, and that changes what the message costs. A recategorization reaches this field through the `template.status_changed` webhook, which carries `data.category`, and through `POST /v1/templates/sync`, which reconciles it against Meta. Read one of those rather than assuming the category you sent is the one in force. For a template that was never submitted to WhatsApp, this is the category stored locally, defaulting to `UTILITY`. One of: `UTILITY`, `MARKETING`, `AUTHENTICATION`.
- `status` (string) One of: `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` (string) One of: `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` (string): OTP button type. Required when type is 'otp'. One of: `COPY_CODE`, `ONE_TAP`.
  - `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>)

### 400

Invalid request or template not in draft status.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

### 401

Unauthorized.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

### 404

Template or sender not found.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

## Example

```bash
curl -X POST "https://api.zavu.dev/v1/templates/template_abc123/submit" \
  -H "Authorization: Bearer $ZAVUDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "senderId": "sender_abc123",
  "category": "UTILITY",
  "variableExamples": {
    "var1": "Maria",
    "var2": "ORD-12345"
  }
}'
```

```typescript
import Zavudev from "@zavudev/sdk";

const zavu = new Zavudev({ apiKey: process.env.ZAVUDEV_API_KEY });

const result = await zavu.templates.submit("template_abc123", {
  senderId: "sender_abc123",
  category: "UTILITY",
  variableExamples: {
    var1: "Maria",
    var2: "ORD-12345",
  },
});

console.log(result);
```
