templates

Submit a draft template

Send an existing draft to Meta for review. The draft itself is submitted, so no second template is created.

Use it for a draft saved in the dashboard, or one POST /api/v1/templates left at draft when Meta refused it: correct the draft in the dashboard, then submit it here. POST /api/v1/templates always creates a new template, so retrying that call leaves the old draft behind.

The draft is checked the way the dashboard checks it before anything reaches Meta; a problem answers 400 validation_failed with what to change. A template that is not a draft (pending, approved, rejected, paused) answers 409 conflict with its status in details; to change a submitted template, create a new one. A draft that another submit is sending right now also answers 409 conflict (details.reason template_not_draft): only one submit of a draft reaches Meta. With the same Idempotency-Key, a retry of a success gets the first answer back.

It goes through the draft's own WhatsApp number, or the connected number of its business when it has none; a number that is not connected answers 503 channel_unavailable. Meta refusing the template answers 502 provider_error with Meta's words.

The response is the template with status: "pending"; poll GET /api/v1/templates/{id} for Meta's decision. A test key runs every check and stops before Meta: the draft is unchanged and the response carries test_mode: true and submitted_to_meta: false.

post/api/v1/templates/{id}/submit

Request

  • Base URL: https://app.blueticked.com
  • URL: https://app.blueticked.com/api/v1/templates/{id}/submit
  • Auth: HTTP bearer

Path parameters

idstring required

The resource's unique identifier.

Headers

Idempotency-Keystring

A unique key (e.g. a UUID) that makes a POST safe to retry: replaying the same key within 24h returns the original result instead of acting twice.

Response

Success

idstring uuid required
channel_idstring uuid nullable
namestring required
category'marketing' | 'utility' | 'authentication' required
languagestring required
bodystring required
footerstring nullable required
status'draft' | 'pending' | 'approved' | 'rejected' | 'paused' | 'disabled' required
external_idstring nullable
rejection_reasonstring nullable required
submitted_atstring date-time required
approved_atstring date-time nullable required
created_atstring date-time required
updated_atstring date-time required
request_idstring required
test_modeboolean

Present, and true, only on a test key's answer.

submitted_to_metaboolean

Present, and false, only on a test key's answer: the draft was checked and not sent to Meta.

Example response

{
  "id": "7af1270d-94ba-4661-9fc4-0d3852469977",
  "channel_id": "1891a644-c71d-4a79-b679-6db1db14e065",
  "name": "order_update_v1",
  "language": "en_US",
  "body": "Hi {{1}}, your order {{2}} is ready.",
  "external_id": "1234567890",
  "submitted_at": "2026-05-20T08:00:00.000Z",
  "created_at": "2026-05-19T16:00:00.000Z",
  "updated_at": "2026-05-20T08:00:00.000Z",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}

Changes

No recorded changes to this operation across all 1 revision of this API.