Functions

create-template

fn (request: CreateTemplateRequest): Map
fn (request: CreateTemplateRequest, opts: Map): Map

POST /{waba-id}/message_templates - Create a message template. Templates must be approved by Meta before they can be sent. category must be "UTILITY", "MARKETING", or "AUTHENTICATION". parameter_format is "POSITIONAL" ({{1}}, the default) or "NAMED" ({{order_id}}). allow_category_change: true lets Meta reassign the category instead of rejecting the template. Returns {id, status, category}.

Example

::templates ::whatsapp::templates

response ::templates/create-template(::templates/CreateTemplateRequest({
  waba_id: "102938475610",
  name: "order_update",
  language: "en_US",
  category: "UTILITY",
  components: [
    {type: "BODY", text: "Your order {{1}} has been shipped. Track: {{2}}"}
  ]
}))
response.id     // => "template-id-123"
response.status // => "PENDING"

delete-template

fn (request: DeleteTemplateRequest): Map
fn (request: DeleteTemplateRequest, opts: Map): Map

DELETE /{waba-id}/message_templates - Delete a message template by name. If hsm_id (the template id) is provided, only that template is deleted; otherwise every template with that name (all languages) is deleted. Returns {success: true}.

delete-templates-url

fn (request: DeleteTemplateRequest): Str
fn (request: DeleteTemplateRequest, opts: Map): Str

The delete URL: name always, hsm_id when set, both URL-encoded. Exposed for testing.

edit-template

fn (request: EditTemplateRequest): Map
fn (request: EditTemplateRequest, opts: Map): Map

POST /{template-id} - Edit an existing message template. Only approved or rejected templates can be edited. Editing resubmits for approval.

get-template

fn (request: GetTemplateRequest): Map
fn (request: GetTemplateRequest, opts: Map): Map

GET /{template-id} - Get one message template by id.

list-templates

fn (request: ListTemplatesRequest): Map
fn (request: ListTemplatesRequest, opts: Map): Map

GET /{waba-id}/message_templates - List message templates for a WhatsApp Business Account, one page at a time. Filters: status ("APPROVED", "PENDING", "REJECTED", ...), name, category ("UTILITY", "MARKETING", "AUTHENTICATION"), language (e.g. "en_US"). Page with limit and the cursor from next-cursor(response) as after (or paging.cursors.before as before). fields selects the returned fields, e.g. ["name", "status", "language", "components"].

Example

::templates ::whatsapp::templates

page ::templates/list-templates(::templates/ListTemplatesRequest({
  waba_id: "102938475610",
  status: "APPROVED",
  limit: 20
}))
page.data  // => [{name: "hello_world", status: "APPROVED", ...}, ...]

cursor ::templates/next-cursor(page)
next-page if(is-some(cursor),
  ::templates/list-templates(::templates/ListTemplatesRequest({waba_id: "102938475610", status: "APPROVED", limit: 20, after: cursor})),
  null)

list-templates-url

fn (request: ListTemplatesRequest): Str
fn (request: ListTemplatesRequest, opts: Map): Str

The list URL with only the set filters, each URL-encoded; fields is comma-joined. Exposed for testing.

next-cursor

fn (response: Map): Str?

The after cursor for the next page of a Graph API list response, or null on the last page (Graph omits paging.next there).

Types

CreateTemplateRequest

CreateTemplateRequest type {
    waba_id: Str,
    name: Str,
    language: Str,
    category: Str,
    components: Vec<Map>,
    allow_category_change: Bool?,
    parameter_format: Str?
}

DeleteTemplateRequest

DeleteTemplateRequest type {
    waba_id: Str,
    name: Str,
    hsm_id: Str?
}

EditTemplateRequest

EditTemplateRequest type {
    template_id: Str,
    components: Vec<Map>?,
    category: Str?
}

GetTemplateRequest

GetTemplateRequest type {
    template_id: Str
}

ListTemplatesRequest

ListTemplatesRequest type {
    waba_id: Str,
    limit: Int?,
    after: Str?,
    before: Str?,
    status: Str?,
    name: Str?,
    category: Str?,
    language: Str?,
    fields: Vec<Str>?
}