Get WhatsApp message details

Open in ChatGPT Open in ChatGPT to ask questions about this page
Open in Claude Open in Claude to ask questions about this page
Copy as MarkdownCopy this page as markdown to use with AI assistants
View as Markdown Open this page as markdown in a new tab

Returns the complete details of a single WhatsApp message, including the rendered message content and the delivery event timeline. Requires an API token with the WhatsApp scope.

Request URL

https://cpaas.zoho.com/v1.1/whatsapp/logs/{message_id} Copied!

Request Parameters

- Request Headers

ApiKeyAuthAPI Key

API key of an agent. Send the header as Authorization: Zoho-enczapikey {apiKey}. The agent and account are derived from the key.

- Path Parameters

message_iduuidMandatory

Unique identifier of the WhatsApp message, as returned by the send API (data.message_id) or the logs API.

Sample Request

Curl
Java
Python
Deluge
Copied!
curl --request GET \
  --url https://cpaas.zoho.com/v1.1/whatsapp/logs/1ba7d8d0-b680-11f1-91b5-d2a30e0412c2 \
  --header 'Authorization: REPLACE_KEY_VALUE'

Response Parameters

- HTTP code 200

Response Body - application/json
JSON Object

Response containing the details of a single WhatsApp message.

Show Sub-Attributes
dataobject

A WhatsApp message log entry.

message_iduuid

Unique identifier of the message.

request_idstring

Identifier of the send request.

client_referencestring

Client reference supplied at send time, if any.

template_keyuuid

Key of the WhatsApp template used.

agent_idstring

Identifier of the sending agent.

channel_idstring

Identifier of the WhatsApp channel the message was sent through.

channel_namestring

Name of the WhatsApp channel.

waba_idstring

WhatsApp Business Account id of the channel.

fromstring

Sender phone number, with country code.

tostring

Recipient phone number, with country code.

statusstring

Message status (e.g. delivered, read, sent, undelivered, failed, process_failed).

process_statestring

Processing state of the request.

remote_ipstring

IP address the send request was made from.

is_batch_requestboolean
request_timestring

When the send request was received (ISO 8601).

time_takeninteger

Processing time in milliseconds.

template_namestring

Name of the WhatsApp template used.

contentJSON Object

The message content that was sent, with template variables resolved.

Show Sub-Attributes
body_textstring

Rendered body text.

header_typestring

Type of the template's media header (e.g. IMAGE), when the template defines one.

attachmentsJSON Array

Media attachments of the message header, when the template defines a media header.

Show Sub-Attributes
file_keyuuid

Identifier of the stored file.

file_namestring

Original file name.

file_typestring

MIME type of the file.

file_sizeinteger

File size in bytes.

eventsJSON Array

Chronological delivery events (e.g. processed, sent to meta, delivered, read). Present once the message has entered delivery; absent for messages that failed processing (status process_failed).

Show Sub-Attributes
event_namestring
event_timestring
error_messageJSON Object

Error response wrapper. The top-level code identifies the error class: TM_3201 mandatory field missing (400), TM_3301 bad syntax (400), TM_4001 access denied (401), TM_3601 request denied (403).

Show Sub-Attributes
errorJSON Object
Show Sub-Attributes
codestring
messagestring
detailsJSON Array
Show Sub-Attributes
JSON Object

A single validation or denial detail inside the error envelope.

Show Sub-Attributes
codestring

Detail-level error code, e.g. SERR_110 (required parameter missing), GE_102 (mandatory field missing), WA_103 (invalid template), WSE_107 (sender number belongs to a different agent), SERR_157 (invalid API token).

messagestring
targetstring

The field the detail refers to, when applicable (e.g. from, to, template_key | template_alias).

target_value

The offending value, when applicable.

request_idstring

Identifier of the failed request, when available.

error_msgstring

The same failure information serialized as a JSON string.

statusstring

- HTTP code 401

Response Body - application/json
JSON Object

Error response wrapper. The top-level code identifies the error class: TM_3201 mandatory field missing (400), TM_3301 bad syntax (400), TM_4001 access denied (401), TM_3601 request denied (403).

Show Sub-Attributes
errorJSON Object
Show Sub-Attributes
codestring
messagestring
detailsJSON Array
Show Sub-Attributes
object

A single validation or denial detail inside the error envelope.

codestring

Detail-level error code, e.g. SERR_110 (required parameter missing), GE_102 (mandatory field missing), WA_103 (invalid template), WSE_107 (sender number belongs to a different agent), SERR_157 (invalid API token).

messagestring
targetstring

The field the detail refers to, when applicable (e.g. from, to, template_key | template_alias).

target_value

The offending value, when applicable.

request_idstring

Identifier of the failed request, when available.

- HTTP code 403

Response Body - application/json
JSON Object

Error response wrapper. The top-level code identifies the error class: TM_3201 mandatory field missing (400), TM_3301 bad syntax (400), TM_4001 access denied (401), TM_3601 request denied (403).

Show Sub-Attributes
errorJSON Object
Show Sub-Attributes
codestring
messagestring
detailsJSON Array
Show Sub-Attributes
object

A single validation or denial detail inside the error envelope.

codestring

Detail-level error code, e.g. SERR_110 (required parameter missing), GE_102 (mandatory field missing), WA_103 (invalid template), WSE_107 (sender number belongs to a different agent), SERR_157 (invalid API token).

messagestring
targetstring

The field the detail refers to, when applicable (e.g. from, to, template_key | template_alias).

target_value

The offending value, when applicable.

request_idstring

Identifier of the failed request, when available.

Sample Response: HTTP 200

Delivered message with event timeline
Copied!
  {
    "data": {
      "message_id": "1ba7d8d0-b680-11f1-91b5-d2a30e0412c2",
      "request_id": "1ba7d8d0-b680-11f1-91b5-d2a30e0412c2",
      "template_key": "d0109d00-b191-11f1-95b1-aaa8828ce996",
      "template_name": "OTP Verification",
      "agent_id": "28bc4428feb773",
      "channel_id": "21144000000003001",
      "channel_name": "Example WhatsApp Channel",
      "waba_id": "1102793358413684",
      "from": "+14155550142",
      "to": "+919876543210",
      "status": "delivered",
      "process_state": "processed",
      "is_batch_request": false,
      "content": {
        "body_text": "234234 is your verification code. For your security, do not share this code.",
        "footer_text": "This code expires in 1 minutes."
      },
      "events": [
        {
          "event_name": "processed",
          "event_time": "2026-09-22T17:51:16+05:30"
        },
        {
          "event_name": "sent to meta",
          "event_time": "2026-09-22T17:51:18+05:30"
        },
        {
          "event_name": "delivered",
          "event_time": "2026-09-22T17:51:31+05:30"
        }
      ],
      "request_time": "2026-09-22T17:51:16+05:30",
      "time_taken": 1112
    },
    "status": "success"
  }
                
▼ Show full
Message that failed processing (missing template variable) - error_message is the full error envelope, no events
Copied!
  {
    "data": {
      "message_id": "380d2251-b680-11f1-b0ad-b6d94062a427",
      "request_id": "380d2251-b680-11f1-b0ad-b6d94062a427",
      "template_key": "d0109d00-b191-11f1-95b1-aaa8828ce996",
      "template_name": "OTP Verification",
      "agent_id": "28bc4428feb773",
      "channel_id": "21144000000003001",
      "channel_name": "Example WhatsApp Channel",
      "waba_id": "1102793358413684",
      "from": "+14155550142",
      "to": "+919876543210",
      "status": "process_failed",
      "process_state": "processed",
      "is_batch_request": false,
      "remote_ip": "10.61.232.23",
      "content": {
        "body_text": " is your verification code. For your security, do not share this code.",
        "footer_text": "This code expires in 1 minutes."
      },
      "error_message": {
        "error": {
          "code": "TM_3201",
          "details": [
            {
              "code": "GE_102",
              "message": "Mandatory field found empty",
              "target": "code"
            }
          ],
          "message": "Mandatory Field missing",
          "request_id": "2d6f.14350939.wa1.380d2251-b680-11f1-b0ad-b6d94062a427.1a0c910e8f5"
        }
      },
      "error_msg": "{\"error\": {\"code\": \"TM_3201\", \"details\": [{\"code\": \"GE_102\", \"message\": \"Mandatory field found empty\", \"target\": \"code\"}], \"message\": \"Mandatory Field missing\", \"request_id\": \"2d6f.14350939.wa1.380d2251-b680-11f1-b0ad-b6d94062a427.1a0c910e8f5\"}}",
      "request_time": "2026-09-22T17:52:03+05:30",
      "time_taken": 456
    },
    "status": "success"
  }
                
▼ Show full

Sample Response: HTTP 401

Copied!
  {
    "error": {
      "code": "TM_4001",
      "details": [
        {
          "code": "SERR_157",
          "message": "Invalid API Token found"
        }
      ],
      "message": "Access Denied"
    }
  }
                
▼ Show full

Sample Response: HTTP 403

Copied!
  {
    "error": {
      "code": "TM_3601",
      "details": [
        {
          "code": "SERR_120",
          "message": "This URL does not exist"
        }
      ],
      "message": "Request Denied"
    }
  }
                
▼ Show full