Portal Community
Pagination: The API returns up to limit templates per call (default 10, max 100). If more templates exist, the response includes a cursor value. Pass it as after in the next call to fetch the next page. Repeat until cursor is null.

When to Use

Configuration

Connection

FieldRequiredDescription
accessTokenRequiredPermanent System User access token from Meta Business Manager. Store in BizFirst Credentials Manager.
phoneNumberIdRequiredWhatsApp Business phone number ID. Used to identify the associated Business Account for the template list.
apiVersionOptionalMeta Graph API version, e.g. v18.0. Defaults to v18.0.

Operation

FieldRequiredDescription
limitOptionalNumber of templates to return per page. Default is 10, maximum is 100. Higher values reduce the number of API calls needed to paginate through large template libraries.
afterOptionalPagination cursor from the previous call's cursor output. Omit on the first call. Pass on subsequent calls to fetch the next page.

Sample Configuration

{
  "resource": "template",
  "operation": "getMany",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "limit": 50
}

Validation Errors

ErrorCause
accessToken is requiredThe accessToken field is empty or missing.
phoneNumberId is requiredThe phoneNumberId field is empty or missing.
100 (Meta)The business account associated with the phone number ID does not exist or the token lacks access.
190 (Meta)Access token expired or invalid.
200 (Meta)Insufficient permissions. Token requires whatsapp_business_management scope.
timeoutThe request timed out. Reduce the limit value and retry.

Output

Success Port

Fires when the template list is successfully retrieved. The templates array contains summary objects for each template on the current page.

FieldTypeDescription
templatesarrayArray of template summary objects, each with id, name, language, status (approval status), and category.
cursorstringPagination cursor for the next page. null when there are no more pages.
statusstring"success" on success.
errorCodestringEmpty on success.
errorMessagestringEmpty on success.
rawResponsestringFull raw JSON response from Meta.

Error Port

FieldTypeDescription
statusstring"failed" or "error".
errorCodestringMeta error code or BizFirst internal code.
errorMessagestringHuman-readable description of the failure.
rawResponsestringRaw API error JSON for diagnostics.

Sample Output

{
  "templates": [
    { "id": "987654321098765", "name": "order_shipped_notification", "language": "en_US", "status": "APPROVED", "category": "UTILITY" },
    { "id": "876543210987654", "name": "summer_sale_2024", "language": "en_US", "status": "PENDING", "category": "MARKETING" },
    { "id": "765432109876543", "name": "otp_login_v1", "language": "en_US", "status": "APPROVED", "category": "AUTHENTICATION" }
  ],
  "cursor": "QVFIUmtLbVEzd2tEOHlJdE9RWVZX...",
  "status": "success",
  "errorCode": null,
  "errorMessage": null,
  "rawResponse": "{\"data\":[...],\"paging\":{\"cursors\":{\"after\":\"QVFIUmtLbVEzd2tEOH...\"}}}"
}

Expression Reference

ValueExpressionNotes
Templates array{{ $output.getManyTemplates.templates }}Iterate with a Loop node. Each item has id, name, language, status, category.
Next page cursor{{ $output.getManyTemplates.cursor }}Pass as after on the next call. Null when pagination is complete.
Template count{{ $output.getManyTemplates.templates.length }}Number of templates returned on this page.
Status{{ $output.getManyTemplates.status }}"success" on success.

Node Policies & GuardRails

Policy AreaRecommendation
Full paginationIf you need a complete inventory, use a Loop node with a while-cursor condition to paginate through all pages. Do not assume a single call returns all templates.
Rate limitingFor large template libraries, space paginated calls with a Delay node (100–200ms) to avoid hitting Meta's per-minute rate limit.
Summary vs. detailThis node returns summary data only — it does not include componentsJson. For full component details, follow up with individual template/get calls on specific IDs.
Credential storageStore the access token in BizFirst Credentials Manager. Never paste it into node configuration as plain text.
Error port handlingAlways connect the error port. A permissions error (200) on this node means the token scope needs to be updated in Meta Business Manager.

Examples

Paginated Full Inventory Sync

// First call (no cursor):
{
  "resource": "template",
  "operation": "getMany",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "limit": 100
}

// Subsequent calls (with cursor from previous output):
{
  "resource": "template",
  "operation": "getMany",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "limit": 100,
  "after": "{{ $session.nextPageCursor }}"
}

A nightly inventory workflow loops until cursor is null. Each batch of template summaries is upserted into a local database table, giving the platform a near-real-time view of all templates and their approval statuses.

Filter REJECTED Templates for Alert

{
  "resource": "template",
  "operation": "getMany",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "limit": 100
}

After fetching the list, a Function node filters templates for items where status == "REJECTED". If any are found, a Slack notification node sends the list to the #whatsapp-templates channel with the template IDs and names.

Duplicate Name Check Before Creation

{
  "resource": "template",
  "operation": "getMany",
  "accessToken": "{{ $credentials.whatsAppToken }}",
  "phoneNumberId": "123456789012345",
  "limit": 100
}

Before creating a new template, a Function node scans the returned templates array for a name match against the intended new template name. If a match is found for the target language, the workflow skips creation and reuses the existing template ID. Otherwise it proceeds to template/create.