---
title: "Create a WhatsApp template"
method: POST
path: "/v1/design_studio/whatsapp"
tags: ["WhatsApp"]
---

# Create a WhatsApp template

`POST /v1/design_studio/whatsapp`

## Request

- Base URL: `https://api.customer.io`
- URL: `https://api.customer.io/v1/design_studio/whatsapp`
- Auth: none declared

This endpoint creates a WhatsApp template in Design Studio. Creating a template doesn't send anything to Meta. Before you can send the template to your audience, you need to submit it to Meta for approval, and Meta needs to approve it.

You write the template's `content` as WhatsApp markup, a set of elements that match the components you can add in Design Studio. See [WhatsApp building blocks](/messaging/design-studio/whatsapp-design-studio/#whatsapp-building-blocks) for every element and the rules the markup follows.

Make sure the template's content, category, and language are right before you submit it. After you submit a template, you can't change those fields unless Meta rejects it.

## Request body

- object
  - `name` string, required: A friendly name for the template. Your team sees this name in Design Studio, so pick one that helps them find the template. Customer.io also uses it as the basis for the template name it gives Meta when you submit the template.
  - `parent_folder_id` string, uuid, nullable: UUID of the folder to create the template in. Omit or pass `null` to create the template at the root level. You can [list folders](/integrations/api/app/tag/design-studio/listFolders/) to find the UUID of the folder you want.
  - `category` 'MARKETING' | 'UTILITY', required: The Meta template category. Use `MARKETING` for promotional content and `UTILITY` for non-promotional messages about a transaction, like an order update. You can't create Authentication templates in Design Studio. [Learn more about template categories in Meta's docs](https://developers.facebook.com/documentation/business-messaging/whatsapp/templates/template-categorization#template-category-guidelines).
  - `language` string, required: The Meta language code for the template, like `en_US`. You need to create a separate template for each language you want to support.
  - `recipient` string, required: Liquid that resolves to the WhatsApp phone number of the person you're messaging, like `{{customer.phone}}`. Customer.io evaluates it against that person's profile when it sends the message. Don't set a static phone number here; if you do, every send of this template goes to that one number instead of to each person.
  - `sender_id` integer, nullable: The ID of the WhatsApp sender identity to send the template from. You can [list sender identities](/integrations/api/app/tag/sender-identities/listSenders/) to find the ID you want. The sender must be a WhatsApp sender, not an SMS or email sender.
  - `content` string, required: The template, written as WhatsApp markup. Put your message text in an `<x-wa-body>` element inside an `<x-whatsapp>` element; the text can include liquid. You can also add a header or header media, a footer, and buttons. See [WhatsApp building blocks](/messaging/design-studio/whatsapp-design-studio/#whatsapp-building-blocks) for every element.

## Response `200`

WhatsApp template created

- object
  - `whatsapp` WhatsApp
    - `id` string, uuid, required: The UUID of the WhatsApp template.
    - `name` string, required: The friendly name your team sees for the template in Design Studio.
    - `is_template` boolean, required: Whether the item is a reusable Design Studio template rather than a message.
    - `is_linked` boolean, required: Whether you've linked the template to a workflow, like a transactional message, a one-time send, or an automation action.
    - `parent_folder_id` string, uuid, nullable, required: UUID of the folder that contains the template, or `null` if the template is at the root level.
    - `category` 'MARKETING' | 'UTILITY', required: The Meta template category.
    - `language` string, required: The Meta language code for the template.
    - `status` string, required: Meta's approval status for the template, like `PENDING`, `APPROVED`, or `REJECTED`. Meta reports status changes to Customer.io, which stores the latest one. The value is an empty string when you haven't submitted the template, and also when Customer.io couldn't look the status up. To tell those apart, [get the template's status](/integrations/api/design-studio/tag/whatsapp-approval/getWhatsAppStatus/).
    - `recipient` string, required: Liquid that resolves to the WhatsApp phone number of the person you're messaging.
    - `sender_id` integer, nullable, required: The ID of the WhatsApp sender identity the template sends from, or `null` if you haven't set a sender.
    - `content` string, required: The template, written as WhatsApp markup.
    - `created` integer, required: When you created the template, as a Unix timestamp in seconds.
    - `updated` integer, required: When the template last changed, as a Unix timestamp in seconds.

## Other responses

- `400`: The request is invalid due to malformed parameters, missing required fields, or constraint violations.
- `401`: Authentication failed due to a missing or invalid API key.
- `404`: The requested resource was not found.
- `422`: The liquid in `content` or `recipient` isn't valid. Each error's `source.pointer` names the field that failed, as `/data/attributes/content` or `/data/attributes/recipient`. Customer.io checks liquid syntax only, so a variable your profiles don't have yet renders as empty rather than failing.

## Changes

- **2026-10-28** `f33c07c62301`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/changes/v1/design_studio/whatsapp/post.md)

---

[API](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference.md) - [All operations](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/llms.txt) - [OpenAPI document](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/revisions/ac0b282053fe?raw)
