whatsapp-templates

Get a message template

Returns one template by its ID or slug: its lifecycle, the languages a send can currently resolve, a summary of where every language stands at Meta, and a pointer to the version that is live. Content is not here: read a version for that.

get/v1/whatsapp/templates/{template_ref}

Request

  • Base URL: https://us1.platform.bird.com
  • URL: https://us1.platform.bird.com/v1/whatsapp/templates/{template_ref}
  • Auth: one of:
    • HTTP bearer
    • API key in cookie bird_session

Headers

X-Workspace-Idstring

Workspace context for the request. Required for dashboard authentication and master keys. Workspace keys and access tokens already identify their workspace; send that workspace or omit the header. A different one is rejected.

X-Organization-Idstring

Organization context for the request. Required for dashboard authentication. An API key or access token carries its own organization, so send either that organization or no header at all; a different one is rejected.

Response

The requested template.

idstring required
slugstring required

A template's slug: what you send it by, for example welcome-email. Email and SMS slugs stay fixed after creation. WhatsApp slugs can change only before the first submission. A slug can contain lowercase letters, numbers, hyphens, and underscores, has to start and end with a letter or a number, and can be up to 63 characters long.

slug_editableboolean required

Whether the slug can still be changed. False after the first submission and for built-in templates.

namestring required

A display name for the template. Nothing resolves through it, so it is safe to show wherever a human reads the template.

descriptionstring nullable required

What the template is for. Null when unset.

scope'system' | 'workspace' required

Whether the template is one of our built-in templates (system) or one your workspace created (workspace).

wabastring

The WhatsApp Business Account that holds this template's languages at Meta. Absent on a built-in template: those live on a WABA that Bird manages centrally rather than on your account, so it is not yours to reconcile against and is not disclosed.

categorystring required

Meta's content classification for a template.

  • authentication: delivers one-time passcodes.
  • utility: delivers transaction-triggered updates (receipts, order status).
  • marketing: carries promotional content.

The category determines the sender number and price. This is an open enum. Accept unrecognized values.

status'draft' | 'pending' | 'active' | 'rejected' | 'inactive' required

Where the template stands as a whole. The same five states on every channel.

  • draft: nothing has ever gone live.
  • pending: nothing is live and at least one language is in review.
  • active: at least one language is live, so something can be sent.
  • rejected: it was reviewed and every language was refused.
  • inactive: nothing is live and nothing is in review, so content was withdrawn or was blocked before anything went live.

A template with one language live is active even while another is still drafted or refused. Read languages for the state of each language and its reason.

Which values a channel reports follows its review model. A channel whose content a third party reviews uses all five. On email and SMS, where content goes live on publish, a template is draft, active or inactive, and pending and rejected are reserved for the review stage coming to both, so a template reaching either is not a breaking change.

default_languagestring required

A language tag in BCP-47 form, for example en or pt-BR.

on_missing_language'fallback' | 'fail' required

What a send or a preview does when it asks for a language the template cannot serve.

fallback serves the closest match instead. It tries a broader form of the same language first, so a request for pt-BR can be served by a stocked pt, and then the template's default language. A send never fails because a language is missing.

fail rejects the send rather than serving a different language, for content where sending the wrong language is worse than not sending at all. It matches the requested tag or a broader form of it and refuses a sibling variant, so pt-BR is never served by pt-PT. A send that names no language still uses the default language.

The default is per channel and stated on each channel's own field, because what a wrong-language send costs differs. Where every language is separately reviewed and separately priced, falling back silently would send content the recipient did not expect at a rate the sender did not choose.

language_source_requiredboolean required

When true, a send must name a language explicitly rather than letting the template resolve one.

available_languagesLanguageTag[] required

The languages a send can resolve right now: approved and not held back by Meta. It shrinks for reasons you did not cause: Meta pauses, disables, archives or limits a language and it leaves the set with nobody having edited anything. Read languages to see which languages exist and why one is missing.

languagesobject required

Where each of the template's languages stands, keyed by BCP-47 language tag. This is the summary of the version currently in service, so a template reading active can still hold a rejected or paused language: the aggregate says something is sendable, and this says which. Content is not here; it lives under a version.

draft_version_idstring required
live_version_idstring required
pending_version_idstring required
last_submitted_atstring date-time nullable required

When this template was last submitted. Null for a pre-approved built-in template.

created_atstring date-time nullable required

When the template was created. Null for a built-in template, which Bird ships rather than stores.

updated_atstring date-time nullable required

When the template was last modified. Null for a built-in template, which Bird ships rather than stores.

Example response

{
  "id": "wat_01krdgeqcxet5s7t44vh8rt9mg",
  "slug": "welcome-email",
  "name": "Order update",
  "description": "Sent when an order ships.",
  "waba": "102290129340398",
  "status": "active",
  "default_language": "pt-BR",
  "on_missing_language": "fallback",
  "available_languages": [
    "pt-BR"
  ],
  "languages": {
    "en": {
      "status": "approved"
    }
  },
  "draft_version_id": "wav_01krdgeqcxet5s7t44vh8rt9mg",
  "live_version_id": "wav_01krdgeqcxet5s7t44vh8rt9mg",
  "pending_version_id": "wav_01krdgeqcxet5s7t44vh8rt9mg",
  "last_submitted_at": "2026-07-26T16:40:00Z"
}

Changes

No recorded changes to this operation across all 2 revisions of this API.