Docs
Templates

Submit a WhatsApp template for review

POSThttps://api.norreach.app/v1/whatsapp-templates

Writes a WhatsApp template (your own words — a body with {{1}}, {{2}} … variables and one example each) and sends it to WhatsApp for review under the workspace's own business account, exactly as Campaigns › Templates does: the same checks (name, category MARKETING or UTILITY, a language from the app's list, at most 1024 characters and 10 variables), and a name + language can exist once (409). It starts PENDING; the verdict arrives with a sync (template.status_changed). Owners, admins and managers. 409 no_sender while no business account is connected. Idempotency-Key required; dry_run=true checks everything and sends nothing.

templates:writeRole must allow: channels.templatesIdempotency-Key requiredSupports dry_runOperation id: create_whatsapp_template
POST/whatsapp-templates
curl -X POST "https://api.norreach.app/v1/whatsapp-templates" \
  -H "Authorization: Bearer $NORREACH_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "follow_up",
  "category": "MARKETING",
  "language": "sv",
  "body": "Hej {{1}}, har du tid för ett samtal?",
  "examples": [
    "Anna"
  ]
}'
Submit a WhatsApp template for review
{
  "object": "whatsapp_template_action",
  "action": "submit",
  "dry_run": false,
  "synced": null,
  "template": {
    "id": "6f7a8b9c-0d1e-4f2a-9b3c-4d5e6f7a8b9c",
    "object": "whatsapp_template",
    "name": "follow_up",
    "language": "sv",
    "category": "MARKETING",
    "status": "PENDING",
    "rejection_reason": null,
    "quality_score": null,
    "body": "Hej {{1}}, har du tid för ett samtal?",
    "variable_count": 1,
    "synced_at": "2026-11-05T08:00:00.000Z"
  },
  "note": "Template “follow_up” submitted — WhatsApp reviews it before it can be sent."
}

Authorizations

Authorizationstringheaderrequired

Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope templates:write. API keys and scopes

Query parameters

dry_runbooleanquery

Run every check and return what would happen, changing nothing.

Headers

Idempotency-Keystringheaderrequired

Any unique string (≤ 255). The same key with the same request returns the first answer for 24 hours.

Body

application/json

namestringrequired

Lowercase letters, digits and underscores.

categoryenumrequired
One of:MARKETINGUTILITY
languagestringrequired

A language code from the app's list, e.g. en_US, sv.

bodystringrequired

The message, with {{1}}, {{2}} … for variables (numbered from 1, no gaps; not at the very start or end).

examplesstring[]

One example value per variable, in order.

Response

201application/json— Submit a WhatsApp template for review

object"whatsapp_template_action"required
actionenumrequired
One of:submitsync
dry_runbooleanrequired
syncedinteger | nullrequired
templateobject | nullrequired
notestringrequired

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
400idempotency_key_requiredThis operation needs an Idempotency-Key header.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
403role_forbiddenThe key's creator's role can't do this.
409idempotency_in_progressA request with this Idempotency-Key is still running.
409conflictThat conflicts with the current state.
409no_senderA channel this needs has no connected sender.
413too_largeThe request body is too large.
422validation_failedThe request has invalid fields.
422idempotency_mismatchThis Idempotency-Key was used with a different request.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.