Skip to content

Create template

View .md
POST

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

Authorization

  • Authorizationheaderrequired

    Bearer YOUR_API_KEY. Create a key in the dashboard.

Body

application/json

  • namestringrequired
  • languagestringrequired
    Defaulten
  • bodystringrequired

    Default template body. Used when no channel-specific body is set.

  • smsBodystring

    Channel-specific body for SMS. Falls back to body if not set.

  • telegramBodystring

    Channel-specific body for Telegram. Falls back to body if not set.

  • instagramBodystring

    Channel-specific body for Instagram. Falls back to body if not set.

  • whatsappCategorystring

    WhatsApp template category.

    One ofUTILITYMARKETINGAUTHENTICATION
  • headerTypestring

    Type of header for the template.

    One oftextimagevideodocument
  • headerContentstring

    Header content (text string or media URL).

  • footerstring

    Footer text for the template.

    Limitsmax length 60
  • variablesstring[]
  • buttonsobject[]

    Template buttons (max 3).

    Limitsmax items 3
    8 properties
    • typestringrequired

      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.

      One ofquick_replyurlphoneotprequest_contact_info
    • textstring

      Button label. Required for every type except request_contact_info, whose label is fixed by WhatsApp.

      Limitsmax length 25
    • urlstring<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.

    • examplestring

      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.

    • phoneNumberstring
    • otpTypestring

      Required when type is 'otp'. COPY_CODE shows copy button, ONE_TAP enables Android autofill.

      One ofCOPY_CODEONE_TAP
    • packageNamestring

      Android package name. Required for ONE_TAP buttons.

    • signatureHashstring

      Android app signature hash. Required for ONE_TAP buttons.

  • addSecurityRecommendationboolean

    Add 'Do not share this code' disclaimer. Only for AUTHENTICATION templates.

  • codeExpirationMinutesinteger

    Code expiration time in minutes. Only for AUTHENTICATION templates.

    Limitsmin 1 · max 90

Responses

201Template created.
  • idstringrequired
  • namestringrequired

    Template name. For WhatsApp, must match the approved template name in Meta.

  • languagestringrequired

    Language code.

  • bodystringrequired

    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.

  • smsBodystring

    Channel-specific body for SMS messages. Falls back to body if not set.

  • telegramBodystring

    Channel-specific body for Telegram messages. Falls back to body if not set.

  • instagramBodystring

    Channel-specific body for Instagram messages. Falls back to body if not set.

  • categorystringrequired

    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 ofUTILITYMARKETINGAUTHENTICATION
  • statusstring
    One ofdraftpendingapprovedrejected
    Defaultdraft
  • variablesstring[]

    List of variable names for documentation.

  • headerTypestring

    Type of header (text, image, video, document).

  • headerContentstring

    Header content (text or media URL).

  • footerstring

    Footer text for the template.

  • buttonsobject[]

    Template buttons.

    8 properties
    • typestring
      One ofquick_replyurlphoneotprequest_contact_info
    • textstring
    • urlstring
    • examplestring

      Sample value used to substitute {{1}} in the URL when submitting the template to Meta for review. Only present for dynamic URL buttons.

    • phoneNumberstring
    • otpTypestring

      OTP button type. Required when type is 'otp'.

      One ofCOPY_CODEONE_TAP
    • packageNamestring

      Android package name. Required for ONE_TAP buttons.

    • signatureHashstring

      Android app signature hash. Required for ONE_TAP buttons.

  • addSecurityRecommendationboolean

    Add 'Do not share this code' disclaimer. Only for AUTHENTICATION templates.

  • codeExpirationMinutesinteger

    Code expiration time in minutes. Only for AUTHENTICATION templates.

    Limitsmin 1 · max 90
  • whatsappobject

    WhatsApp-specific template information.

    3 properties
    • templateNamestring

      WhatsApp template name.

    • namespacestring

      WhatsApp Business Account namespace.

    • statusstring

      WhatsApp approval status.

  • createdAtstring<date-time>
  • updatedAtstring<date-time>
400Invalid template.
  • codestringrequired
  • messagestringrequired
  • detailsobject
401Unauthorized.
  • codestringrequired
  • messagestringrequired
  • detailsobject
409A template with this name already exists in the project (`conflict`). Names are unique per project.
  • codestringrequired
  • messagestringrequired
  • detailsobject