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>?
}