API resource

WhatsApp templates and flows

Outside 24 hours of a customer's last message, WhatsApp only delivers templates Meta has approved. Create one, watch its review status, then send it. Flows are native forms, surveys and booking screens that open inside the chat.

List flow responses

GET/v1/whatsapp/flow-responses

Works on: WhatsApp

List the responses customers submitted when completing a flow (parsed from the nfm_reply messages received via webhook), newest first. Scope to a single flow with flowId, which matches responses whose flow_token carries the <flowId>: prefix that Creator OS stamps on auto-generated tokens at send time. Responses sent with a custom integrator-supplied flow_token are not attributed to a flow.

Query parameters

accountIdstringrequired

WhatsApp account ID

flowIdstring

Scope to responses for this flow

limitinteger

Max responses to return

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flow-responses?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "responses": [
    {
      "id": "string",
      "receivedAt": "2026-10-10T00:00:00.000Z",
      "from": "string",
      "senderName": "string",
      "conversationId": "string",
      "flowToken": "string",
      "data": {},
      "raw": "string"
    }
  ]
}

Get Flows encryption key status

GET/v1/whatsapp/flows/encryption-key

Works on: WhatsApp

Read the RSA business public key registered on the phone number for WhatsApp Flows endpoint encryption. Only one key is active per phone number at a time. Flows that use flow_action: data_exchange (an endpoint-backed flow) stop working at runtime until the endpoint serves the matching private key, and Meta rejects publish with error code 139002 ("Missing Flows Signed Public Key") when no key is registered. registered reflects whether a key is present, never signatureStatus alone: Meta reports an unregistered key as MISMATCH rather than a null/absent value.

Query parameters

accountIdstringrequired

WhatsApp account ID

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/encryption-key?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "publicKey": "string",
  "signatureStatus": "VALID",
  "registered": true
}

Register a Flows encryption key

POST/v1/whatsapp/flows/encryption-key

Works on: WhatsApp

Register (or replace) the RSA business public key for WhatsApp Flows endpoint encryption on the phone number. Uploading a new key replaces the previous one: only one key is active per phone number. The corresponding private key must be served by the flow's endpoint, or endpoint-backed flows (flow_action: data_exchange) will fail at runtime even though the key is registered.

Body

accountIdstringrequired

WhatsApp account ID

businessPublicKeystringrequired

RSA public key in PEM format. Rejected if it is a private key or not a valid RSA public key PEM.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/encryption-key" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W",
    "businessPublicKey": "string"
  }'
Response 200
{
  "success": true
}

Send flow message

POST/v1/whatsapp/flows/send

Works on: WhatsApp

Send a published flow as an interactive message with a CTA button. When the recipient taps the button, the flow opens natively in WhatsApp. Flow responses are received via webhooks.

Body

accountIdstringrequired

WhatsApp account ID

tostringrequired

Recipient phone number (E.164 format, e.g. +1234567890)

flow_idstringrequired

Published flow ID

flow_ctastringrequired

CTA button text (e.g. 'Book Now', 'Sign Up')

flow_actionstring

Action type: navigate opens a screen directly, data_exchange hits your endpoint first

flow_tokenstring

Unique token to correlate responses. If omitted, auto-generated as '<flowId>:<uuid>' so the response can be attributed to this flow in the Flow Responses view.

flow_action_payloadobject

bodystringrequired

Message body text

headerobject

footerstring

Optional footer text

draftboolean

Set true to test an unpublished (DRAFT) flow

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/send" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W",
    "to": "string",
    "flow_id": "string",
    "flow_cta": "string",
    "body": "string"
  }'
Response 200
{
  "success": true,
  "messageId": "4455667788990011223"
}

Deprecate flow

POST/v1/whatsapp/flows/{flowId}/deprecate

Works on: WhatsApp

Deprecate a PUBLISHED flow. This is irreversible. Deprecated flows cannot be sent or opened, but existing active sessions may continue until they complete.

Path parameters

flowIdstringrequired

Flow ID

Body

accountIdstringrequired

WhatsApp account ID

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/deprecate" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W"
  }'
Response 200
{
  "success": true
}

Get flow JSON asset

GET/v1/whatsapp/flows/{flowId}/json

Works on: WhatsApp

Get the flow JSON asset metadata, including a temporary download URL for the Flow JSON file.

Path parameters

flowIdstringrequired

Flow ID

Query parameters

accountIdstringrequired

WhatsApp account ID

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/json?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "assets": [
    {
      "name": "flow.json",
      "asset_type": "FLOW_JSON",
      "download_url": "string"
    }
  ]
}

Upload flow JSON

PUT/v1/whatsapp/flows/{flowId}/json

Works on: WhatsApp

Upload or update the Flow JSON for a DRAFT flow. The Flow JSON defines all screens, components (text inputs, dropdowns, date pickers, etc.), and navigation. Meta validates the JSON on upload and returns any validation errors. See: https://developers.facebook.com/docs/whatsapp/flows/reference/flowjson

Path parameters

flowIdstringrequired

Flow ID

Body

accountIdstringrequired

WhatsApp account ID

flow_jsonobjectrequired

The Flow JSON content. Pass as a JSON object or a JSON string.

curl -X PUT "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/json" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W",
    "flow_json": {}
  }'
Response 200
{
  "success": true,
  "validation_errors": [
    {
      "error": "string",
      "error_type": "string",
      "message": "string",
      "line_start": 0,
      "line_end": 0,
      "column_start": 0,
      "column_end": 0
    }
  ]
}

Get flow preview URL

GET/v1/whatsapp/flows/{flowId}/preview

Works on: WhatsApp

Get Meta's public web-preview URL for a flow (drafts included), embeddable as an interactive iframe. The link is reused across calls (valid ~30 days); pass invalidate=true to mint a fresh one (the previous link stops working).

Path parameters

flowIdstringrequired

Flow ID

Query parameters

accountIdstringrequired

WhatsApp account ID

invalidateboolean

Mint a fresh preview link (default false)

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/preview?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "preview_url": "string",
  "expires_at": "2026-10-10T00:00:00.000Z"
}

Publish flow

POST/v1/whatsapp/flows/{flowId}/publish

Works on: WhatsApp

Publish a DRAFT flow. This is irreversible. Once published, the flow and its JSON become immutable and the flow can be sent to users. To update a published flow, create a new flow (optionally cloning this one via cloneFlowId).

Path parameters

flowIdstringrequired

Flow ID

Body

accountIdstringrequired

WhatsApp account ID

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/publish" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W"
  }'
Response 200
{
  "success": true
}

List flow versions

GET/v1/whatsapp/flows/{flowId}/versions

Works on: WhatsApp

List the flow's version history (the clone lineage Creator OS tracks, since Meta has no native versioning), newest version first. Each entry is enriched with the version's live name and status from Meta. A flow with no lineage returns only itself as version 1.

Path parameters

flowIdstringrequired

Flow ID

Query parameters

accountIdstringrequired

WhatsApp account ID

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485/versions?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "versions": [
    {
      "flowId": "1203948572039485",
      "version": 0,
      "parentFlowId": "string",
      "name": "string",
      "status": "string",
      "missing": true
    }
  ]
}

Delete flow

DELETE/v1/whatsapp/flows/{flowId}

Works on: WhatsApp

Delete a DRAFT flow. This is irreversible. Only flows in DRAFT status can be deleted.

Path parameters

flowIdstringrequired

Flow ID

Query parameters

accountIdstringrequired

WhatsApp account ID

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true
}

Get flow

GET/v1/whatsapp/flows/{flowId}

Works on: WhatsApp

Get details for a specific flow, including status, categories, validation errors, and preview URL.

Path parameters

flowIdstringrequired

Flow ID

Query parameters

accountIdstringrequired

WhatsApp account ID

fieldsstring

Comma-separated fields to return (default: id,name,status,categories,validation_errors,json_version,preview,data_api_version,endpoint_uri)

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "flow": {
    "id": "string",
    "name": "string",
    "status": "string",
    "categories": [
      "string"
    ],
    "validation_errors": [
      {}
    ],
    "json_version": "string",
    "preview": {
      "preview_url": "string",
      "expires_at": "2026-10-10T00:00:00.000Z"
    }
  }
}

Update flow

PATCH/v1/whatsapp/flows/{flowId}

Works on: WhatsApp

Update metadata (name, categories, endpointUri) of a DRAFT flow. Published flows are immutable.

Path parameters

flowIdstringrequired

Flow ID

Body

accountIdstringrequired

WhatsApp account ID

namestring

New flow name

categoriesstring[]

endpointUristring

HTTPS-only data exchange endpoint for the flow. Settable only while the flow is in DRAFT, and the flow's uploaded Flow JSON must declare data_api_version "3.0" for the endpoint to be used.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows/1203948572039485" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W"
  }'
Response 200
{
  "success": true
}

List flows

GET/v1/whatsapp/flows

Works on: WhatsApp

List all WhatsApp Flows for the Business Account (WABA) associated with the given account.

Query parameters

accountIdstringrequired

WhatsApp account ID

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "flows": [
    {
      "id": "string",
      "name": "string",
      "status": "DRAFT",
      "categories": [
        "string"
      ],
      "validation_errors": [
        {}
      ],
      "version": 0,
      "lineageId": "string"
    }
  ]
}

Create flow

POST/v1/whatsapp/flows

Works on: WhatsApp

Create a new WhatsApp Flow in DRAFT status. Optionally clone an existing flow. After creating, upload a Flow JSON definition, then publish to make it sendable.

Body

accountIdstringrequired

WhatsApp account ID

namestringrequired

Flow display name

categoriesstring[]required

Flow categories

cloneFlowIdstring

Optional: ID of an existing flow to clone the Flow JSON from

asVersionboolean

When cloning, true keeps the clone in cloneFlowId's version lineage (auto-numbered next version); false/absent creates an independent flow. Ignored without cloneFlowId.

endpointUristring

HTTPS-only data exchange endpoint for the flow. Settable only while the flow is in DRAFT, and the flow's uploaded Flow JSON must declare data_api_version "3.0" for the endpoint to be used.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/flows" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W",
    "name": "string",
    "categories": [
      "SIGN_UP"
    ]
  }'
Response 200
{
  "success": true,
  "flow": {
    "id": "string",
    "name": "string",
    "status": "DRAFT",
    "categories": [
      "string"
    ],
    "version": 0,
    "lineageId": "string"
  }
}

Look up a library template

GET/v1/whatsapp/template-library

Works on: WhatsApp

Look up a single pre-approved Template Library template by its exact name, to introspect its structure before importing it. Most importantly it returns the template's buttons: a library template with URL / PHONE_NUMBER buttons must be created with a matching library_template_button_inputs array (see Create Template), or Meta rejects it. Use this to discover which inputs to collect.

Query parameters

accountIdstringrequired

WhatsApp account ID

namestringrequired

Exact library template name

languagestring

Desired language variant (e.g. es, en_US). If the template is not offered in it, the first available variant is returned and named in the response language field.

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/template-library?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W&name=%3Cname%3E" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "template": {
    "name": "string",
    "language": "string",
    "category": "string",
    "body": "string",
    "body_params": [
      "string"
    ],
    "availableLanguages": [
      "string"
    ],
    "buttons": [
      {
        "type": "string",
        "text": "string"
      }
    ]
  }
}

Delete template by id

DELETE/v1/whatsapp/templates/id/{templateId}

Works on: WhatsApp

Delete one language variant by its Meta id. Other languages of the same name are untouched. The name cannot be reused for 30 days once its last variant is deleted.

Path parameters

templateIdstringrequired

Meta template id (numeric).

Query parameters

accountIdstringrequired

WhatsApp account ID

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/id/1875844705851813?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "scope": "language",
  "language": "string",
  "message": "string"
}

Get template by id

GET/v1/whatsapp/templates/id/{templateId}

Works on: WhatsApp

Retrieve one template variant by its Meta id, the id every variant of a family has on its own and the one the whatsapp.template.status_updated webhook carries.

Path parameters

templateIdstringrequired

Meta template id (numeric).

Query parameters

accountIdstringrequired

WhatsApp account ID

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/id/1875844705851813?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "template": {
    "id": "string",
    "name": "string",
    "status": "string",
    "category": "string",
    "language": "string",
    "components": [
      {}
    ],
    "message_send_ttl_seconds": 0,
    "rejected_reason": "string",
    "quality_score": {}
  }
}

Update template by id

PATCH/v1/whatsapp/templates/id/{templateId}

Works on: WhatsApp

Update one variant's components and/or its message_send_ttl_seconds by its Meta id. Name, language and category cannot change. Meta only allows editing templates in APPROVED, REJECTED or PAUSED state; an approved template can be edited once per 24 hours and up to 10 times per 30 days. A component update sends the variant back to Meta for review, so the status returned here is normally PENDING; a TTL-only update keeps an APPROVED variant approved. The final outcome arrives on the whatsapp.template.status_updated webhook (which carries the variant's templateId and language).

Path parameters

templateIdstringrequired

Meta template id (numeric).

Body

accountIdstringrequired

WhatsApp account ID

componentsobject[]

Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required.

message_send_ttl_secondsinteger

Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/id/1875844705851813" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W"
  }'
Response 200
{
  "success": true,
  "template": {
    "id": "string",
    "name": "string",
    "language": "string",
    "status": "PENDING"
  }
}

Delete template

DELETE/v1/whatsapp/templates/{templateName}

Works on: WhatsApp

Permanently delete a message template. Without language this deletes every language variant of the name (Meta's own contract for deletion by name). Pass language to delete one variant only; the response scope says which happened. Meta keeps a deleted approved template in PENDING_DELETION for a while and the name cannot be reused for 30 days.

Path parameters

templateNamestringrequired

Template name (the family).

Query parameters

accountIdstringrequired

WhatsApp account ID

languagestring

Delete only this language variant (e.g. es). Omit to delete the whole family.

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/order_update?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "scope": "all_languages",
  "language": "string",
  "message": "string"
}

Get template

GET/v1/whatsapp/templates/{templateName}

Works on: WhatsApp

Retrieve one message template variant by name. Meta stores one template per name + language, so a name identifies a family of variants, each with its own Meta id. Pass language to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns 409 ambiguous_template with details.languages. A bare language (es) matches a single regional variant (es_ES); if the family has several regional variants for it, that is also a 409. A full code (es_ES) must match exactly. Variants in PENDING_DELETION are not part of the family.

Path parameters

templateNamestringrequired

Template name (the family).

Query parameters

accountIdstringrequired

WhatsApp account ID

languagestring

Language code of the variant (e.g. en_US, es, pt_BR). Required when the family has several languages.

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/order_update?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "template": {
    "id": "string",
    "name": "string",
    "status": "string",
    "category": "string",
    "language": "string",
    "components": [
      {}
    ],
    "message_send_ttl_seconds": 0,
    "rejected_reason": "string",
    "quality_score": {}
  }
}

Update template

PATCH/v1/whatsapp/templates/{templateName}

Works on: WhatsApp

Update one variant's components and/or its message_send_ttl_seconds. Name, language and category cannot change after creation. Meta stores one template per name + language, so a name identifies a family of variants, each with its own Meta id. Pass language to address one variant. Without it, a name with a single variant resolves to that variant; a name with several returns 409 ambiguous_template with details.languages. A bare language (es) matches a single regional variant (es_ES); if the family has several regional variants for it, that is also a 409. A full code (es_ES) must match exactly.

Path parameters

templateNamestringrequired

Template name (the family).

Body

accountIdstringrequired

WhatsApp account ID

languagestring

Language code of the variant to edit (e.g. en_US, es, pt_BR). Required when the family has several languages. Body only: a language query parameter on PATCH is a 400.

componentsobject[]

Updated template components. Optional when only message_send_ttl_seconds changes; at least one of the two is required.

message_send_ttl_secondsinteger

Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 is not accepted here (Meta treats it as an empty edit); send a value in range.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates/order_update" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W"
  }'
Response 200
{
  "success": true,
  "template": {
    "id": "string",
    "name": "string",
    "language": "string",
    "status": "PENDING"
  }
}

List templates

GET/v1/whatsapp/templates

Works on: WhatsApp

List message templates for the WhatsApp Business Account (WABA) associated with the given account. Templates are fetched directly from the WhatsApp Cloud API. One entry per name + language: a multi-language template appears once per language, each with its own Meta id.

Query parameters

accountIdstringrequired

WhatsApp account ID

namestring

Exact template name; returns every language variant of that family.

languagestring

Exact language code (e.g. en_US).

statusstring

One of: APPROVED, REJECTED, PENDING, PAUSED, DISABLED, IN_APPEAL, PENDING_DELETION.

curl "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates?accountId=acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "success": true,
  "templates": [
    {
      "id": "string",
      "name": "string",
      "status": "APPROVED",
      "category": "AUTHENTICATION",
      "language": "string",
      "message_send_ttl_seconds": 0,
      "components": [
        {}
      ]
    }
  ]
}

Create template

POST/v1/whatsapp/templates

Works on: WhatsApp

Create a new message template. Supports two modes: Custom template: Provide components with your own content. Submitted to Meta for review (can take up to 24h). Library template: Provide library_template_name instead of components to use a pre-built template from Meta's template library. Library templates are pre-approved (no review wait). You can optionally customize parameters and buttons via library_template_body_inputs and library_template_button_inputs. Browse available library templates at: https://business.facebook.com/wa/manage/message-templates/

Body

accountIdstringrequired

WhatsApp account ID

namestringrequired

Template name (lowercase, letters/numbers/underscores, must start with a letter)

categorystringrequired

Template category

languagestringrequired

Template language code (e.g., en_US)

parameter_formatstring

Variable style: POSITIONAL ({{1}}, the default) or NAMED ({{customer_name}}). Named templates provide examples via body_text_named_params / header_text_named_params. Inferred as NAMED when omitted but a named-params example is present.

componentsobject[]

Template components (header, body, footer, buttons, carousel, limited_time_offer). Required for custom templates, omit when using library_template_name.

library_template_namestring

Name of a pre-built template from Meta's template library (e.g., "appointment_reminder", "auto_pay_reminder_1", "address_update"). When provided, the template is pre-approved by Meta with no review wait. Omit components when using this field.

library_template_body_inputsobject

Optional body customizations for library templates. Available options depend on the template (e.g., add_contact_number, add_learn_more_link, add_security_recommendation, add_track_package_link, code_expiration_minutes).

library_template_button_inputsobject[]

Optional button customizations for library templates. Each item specifies button type and configuration (e.g., URL, phone number, quick reply).

message_send_ttl_secondsinteger

Delivery validity window in seconds: a message not delivered within it is dropped. Range depends on category: AUTHENTICATION 30 to 900, UTILITY 30 to 43200 (12h), MARKETING 43200 to 2592000 (30 days); -1 (create only) keeps the 30-day default on AUTHENTICATION and UTILITY.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/whatsapp/templates" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "accountId": "acc_Wa2Qp7Vz4Ny9Tx1Lm6Rc3Wb8Js5Df0Ga7Ue2Ki4Oq9W",
    "name": "string",
    "category": "AUTHENTICATION",
    "language": "string"
  }'
Response 200
{
  "success": true,
  "template": {
    "id": "string",
    "name": "string",
    "status": "string",
    "category": "string",
    "language": "string",
    "message_send_ttl_seconds": 0
  }
}