Message retrieval via Graph API: The WhatsApp Cloud API primarily delivers message status updates via webhooks (delivered, read, failed events). The message/get operation queries the Graph API directly for message metadata when you need a synchronous lookup rather than relying on webhook delivery. This is useful for status verification workflows and audit checks.
When to Use
- Delivery status verification: An SLA monitoring workflow periodically checks the delivery status of critical notification messages to ensure they have reached the recipient device within the expected time.
- Audit trail reconstruction: A compliance workflow queries message metadata for a specific wamid to populate an audit record with the exact send timestamp and delivery status.
- Failed message investigation: A support workflow queries a specific message ID reported by a customer as missing to determine whether it was sent, delivered, or failed at the Meta level.
- Pre-deletion timestamp validation: Before calling
message/delete, a Function node uses this operation to retrieve the message's send timestamp and confirm it is within the 60-minute window.
- Message type identification: A workflow that stored a wamid from a complex multi-step process uses this operation to retrieve the message type to determine appropriate downstream handling.
Configuration
Connection
| Field | Required | Description |
accessToken | Required | Permanent System User access token. Store in BizFirst Credentials Manager. |
phoneNumberId | Required | Numeric string ID of the sending WhatsApp Business phone number. |
apiVersion | Optional | Meta Graph API version. Defaults to v18.0. |
Operation
| Field | Required | Description |
messageId | Required | The WhatsApp message ID (wamid) to retrieve (e.g. wamid.HBgLMTQx...). |
Sample Configuration
{
"resource": "message",
"operation": "get",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"messageId": "{{ $input.messageId }}"
}
Validation Errors
| Error | Cause |
accessToken is required | The accessToken field is empty. |
phoneNumberId is required | The phoneNumberId field is empty. |
messageId is required | The messageId field is empty. |
100 (Meta) | Invalid message ID format — the wamid is malformed. |
803 (Meta) | Message not found — the wamid does not exist or does not belong to this phone number. |
Output
Success Port
| Field | Type | Description |
messageId | string | The queried message ID. |
status | string | Message delivery status: sent, delivered, read, or failed. |
type | string | Message type: text, image, video, audio, document, location, contacts, interactive, template, reaction, sticker. |
timestamp | string | Unix timestamp (seconds) when the message was sent. |
to | string | Recipient phone number. |
conversationId | string | WhatsApp conversation ID for this message. |
rawResponse | string | Full raw JSON from the Meta API including all available metadata fields. |
Error Port
| Field | Type | Description |
messageId | string | The queried message ID (echoed from input). |
status | string | "failed" or "error". |
errorCode | string | Meta error code or BizFirst validation code. |
errorMessage | string | Human-readable error description. |
Sample Output
{
"messageId": "wamid.HBgLMTQxNTU1NTI2NzEVAgARGBI2QzM4NjhGQTExMjQ3RDMAA",
"status": "delivered",
"type": "text",
"timestamp": "1716700412",
"to": "14155552671",
"conversationId": "conv_abc123def456",
"rawResponse": "{\"id\":\"wamid.HBgLMTQxNTU1NTI2NzEVAgARGBI2QzM4NjhGQTExMjQ3RDMAA\",\"type\":\"text\",\"timestamp\":\"1716700412\",\"to\":\"14155552671\",\"status\":\"delivered\"}"
}
Expression Reference
| Value | Expression | Notes |
| Delivery status | {{ $output.getMsg.status }} | Compare to "delivered" or "read" in an IfCondition node for SLA checks. |
| Message type | {{ $output.getMsg.type }} | Use to determine how to process the message content in downstream nodes. |
| Send timestamp | {{ $output.getMsg.timestamp }} | Unix seconds. Convert to human-readable with a Function node for display or deletion window check. |
| Conversation ID | {{ $output.getMsg.conversationId }} | Use for conversation-level tracking and correlation across messages. |
| Full response | {{ $output.getMsg.rawResponse }} | Parse for additional fields like error details on failed messages. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Credential storage | Store the access token in BizFirst Credentials Manager. Never inline in configuration. |
| Prefer webhooks for status | For real-time status updates, use the WhatsApp webhook (status events: sent, delivered, read, failed). Only use this polling operation when a synchronous lookup is specifically needed — avoid polling loops that call this operation repeatedly. |
| Rate limiting | Do not call this operation in a tight loop. Meta imposes read rate limits on the Graph API. For bulk status checks, use message/getMany or process status webhooks instead. |
| Data retention | Meta does not guarantee that message metadata is retained indefinitely. For compliance purposes, store message status updates from webhooks into your own database rather than relying on on-demand lookups. |
| Error port | Connect the error port. A 803 "message not found" error is common for wamids that have been purged from Meta's records or belong to a different phone number. |
Examples
SLA Delivery Check — 5 Minutes After Send
{
"resource": "message",
"operation": "get",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"messageId": "{{ $input.criticalMessageId }}"
}
A Delay node waits 5 minutes after a critical notification is sent. This node then queries the message status. An IfCondition node checks {{ $output.getMsg.status }} — if it is not "delivered" or "read", a fallback SMS is sent via the Twilio node and an alert is raised in the monitoring system.
Pre-Deletion Window Validation
{
"resource": "message",
"operation": "get",
"accessToken": "{{ $credentials.whatsAppToken }}",
"phoneNumberId": "123456789012345",
"messageId": "{{ $input.messageToRetract }}"
}
Before calling message/delete, this node fetches the message timestamp. A Function node computes whether the send timestamp is within 60 minutes of the current time. If inside the window, message/delete is called; if outside, the workflow logs a "deletion window expired" event and notifies the compliance team instead.