For the complete documentation index, see llms.txt. This page is also available as Markdown.

Manage templates through the API

List, create, update and re-sync WhatsApp templates from your own code.

List, create, switch on and off, and re-sync your WhatsApp templates from your own code.

Most teams create templates in the Channel360 web app and only send them through the API. Use this page if you want to automate template work, or build your own screens.

Before you start

List your templates

GET /org/<ORG_ID>/templates/list

curl "https://channel360.co.za/v1.1/org/<ORG_ID>/templates/list?enabled=true" \
  -H "Authorization: Bearer <API_KEY>"
const response = await fetch(
  "https://channel360.co.za/v1.1/org/<ORG_ID>/templates/list?enabled=true",
  { headers: { Authorization: "Bearer <API_KEY>" } }
);

console.log(await response.json());
import requests

response = requests.get(
    "https://channel360.co.za/v1.1/org/<ORG_ID>/templates/list",
    params={"enabled": "true"},
    headers={"Authorization": "Bearer <API_KEY>"},
)

print(response.json())

The response is a JSON array of templates, not wrapped in an object.

Query parameter
What it does

enabled

true returns only enabled templates. Any other value returns the disabled ones.

filter

Only configured is accepted. Any other value returns 400.

Example response
[
  {
    "tags": { "head": [], "body": [], "buttons": [] },
    "organization": "org_example_123456",
    "language": "en",
    "name": "testing_market",
    "messageTemplateId": "meta_template_example_123",
    "category": "MARKETING",
    "components": [
      { "type": "BODY", "text": "Hi would we are marketing", "buttons": [] }
    ],
    "createdAt": "2025-04-07T09:00:27.933Z",
    "description": "auto-ingested",
    "enabled": true,
    "namespace": "",
    "status": "APPROVED",
    "updatedAt": "2025-07-17T09:14:58.444Z",
    "version": 0,
    "id": "template_example_1"
  }
]

To send a template you need its name, language, a status of APPROVED, and the placeholders in its components. To update it you need its id. From template to request shows how a listed template becomes a send request.

Get one template by name

GET /org/<ORG_ID>/templates/<TEMPLATE_NAME>

The path takes the template's name, not its ID. If you have the same name in two languages, the first match is returned. If there is no match, the response is 404.

Create a template

POST /org/<ORG_ID>/whatsapp/templates

Field
Required
What to put

name

Yes

Lowercase letters, digits and underscores only. Must be unique for its language.

description

Yes

What the template is for.

namespace

Yes

Use "default".

language

Yes

The language code, such as en_US. It must match the template's text, or Meta rejects it.

enabled

Yes

true or false.

category

Yes

MARKETING, UTILITY or AUTHENTICATION.

components

Yes

The message structure: header, body, footer and buttons. Rules are in the table below.

tags

No

Only used by web-app campaigns. See Tags vs. the API.

Component
Required
Rules

HEADER

No

Format TEXT, IMAGE, VIDEO or DOCUMENT. Up to 60 characters. At most one placeholder.

BODY

Yes

Up to 1,024 characters. Can have several placeholders. Needs an example when it has placeholders.

FOOTER

No

Up to 60 characters.

BUTTONS

No

Button text up to 25 characters. At most one placeholder. Needs an example when it has one.

Media headers need an example file link. Host the file on your own storage at a public https:// link — WhatsApp downloads it from there, so it must open without a login. Media limits: video video/mp4 (H.264 video, AAC audio), image image/jpeg or image/png, document application/pdf or text/csv; 15 MB each.

Authentication templates have their own rules:

Field
Rule

add_security_recommendation

Optional. true adds the fixed text "For your security, do not share this code."

code_expiration_minutes

Optional. Adds a footer saying when the code expires. Whole minutes, from 1 to 90.

Button type

Required. Must be OTP.

A successful request returns 201:

The template is PENDING until WhatsApp approves or rejects it. Subscribe to the template:status webhook event to be told when it changes (see Receive delivery updates), or list your templates again.

Meta's supported languages · Meta's template guidelines

Switch templates on or off, or edit their description

One template: PUT /org/<ORG_ID>/templates/<TEMPLATE_ID>. <TEMPLATE_ID> is the id from the list response.

Field
Type

description

string

namespace

string

enabled

boolean

tags

object

Send only the fields you want to change. Other fields are ignored.

Updates only affect new campaigns. A campaign that was already created keeps using the original template version.

Several templates: PUT /org/<ORG_ID>/templates

Returns 201 with { "message": "Successfully updated templates" }. IDs that are not in your organisation are skipped.

Re-sync templates from WhatsApp

POST /org/<ORG_ID>/whatsapp/templates/refresh — no body.

Use it after creating or editing a template directly in Meta's tools, so Channel360 sees the change.

data lists the IDs of templates that were updated and added.

What can go wrong

What you see
Why
What to do

400 on create, naming a field

A required field is missing, or name has invalid characters.

Fix the named field.

400 Organization is not connected to Whatsapp

WhatsApp is not connected for this organisation.

Contact Channel360 support. Create the template in the web app meanwhile.

The template stays PENDING

WhatsApp has not reviewed it yet.

Wait for the template:status event.

The template is REJECTED

It breaks Meta's rules.

Read Meta's template guidelines, then create a corrected copy with a new name.

Next

Send a template notificationTemplates, placeholders and components

Last updated

Was this helpful?