> ## Documentation Index
> Fetch the complete documentation index at: https://docs.periskope.app/llms.txt
> Use this file to discover all available pages before exploring further.

# The Message Object

> A WhatsApp message record. Responses may include additional raw fields of the underlying record (id, author, links, location, vcards, is_forwarded, has_media, message_ticket_id, ...).

<ResponseExample>
  ```json The Message Object theme={null}
  {
    "message_id": "true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "unique_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "org_id": "00000000-0000-0000-0000-000000000000",
    "org_phone": "911111111111@c.us",
    "chat_id": "120363000000000000@g.us",
    "body": "Hello World",
    "message_type": "chat",
    "timestamp": "2026-01-15T09:30:00+00:00",
    "from_me": true,
    "ack": "3",
    "performed_by": "api",
    "sender_phone": "911111111111@c.us",
    "quoted_message_id": null,
    "broadcast_id": null,
    "is_deleted": null,
    "media": {
      "path": "https://example.com/files/image.png",
      "mimetype": "image/png",
      "filename": "image.png",
      "size": 24576,
      "dimensions": {
        "width": null,
        "height": null,
        "ar": null
      },
      "thumbnail": null
    },
    "mentioned_ids": [],
    "prev_body": null,
    "sent_message_id": "00000000-0000-0000-0000-000000000000",
    "delivery_info": {
      "delivered": {
        "911111111111@c.us": 1737967705196
      },
      "read": {
        "911111111111@c.us": 1737967704763
      },
      "pending": [],
      "delivered_count": 1,
      "read_count": 1
    },
    "poll_info": {},
    "poll_results": {},
    "flag_status": null,
    "updated_at": "2026-01-15T09:35:38.221+00:00",
    "reactions": [
      {
        "reaction_id": "true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAA",
        "message_id": "true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "unique_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "chat_id": "911111111111@c.us",
        "org_id": "00000000-0000-0000-0000-000000000000",
        "org_phone": "911111111111@c.us",
        "sender_id": "911111111111@c.us",
        "reaction": "😄",
        "read": true,
        "timestamp": "2026-01-15T09:31:57.008+00:00"
      }
    ]
  }
  ```
</ResponseExample>

**Attributes**

<ParamField path="message_id" type="string">
  WhatsApp message id, in the form \<from\_me>*\<chat\_id>*\<hash>. Accepted wherever a message\_id path parameter is expected.
</ParamField>

<ParamField path="unique_id" type="string">
  Provisional id assigned when the message was queued via the API — the same value returned by POST /message/send. Also accepted wherever a message\_id path parameter is expected. null for messages that did not originate from the API.
</ParamField>

<ParamField path="org_id" type="string">
  Id of the organization the message belongs to
</ParamField>

<ParamField path="org_phone" type="string">
  Org phone (WhatsApp account) the message was sent or received on, suffixed with @c.us
</ParamField>

<ParamField path="chat_id" type="string">
  Chat the message belongs to — \<countrycode>\<number>@c.us for 1-1 chats, \<group-id>@g.us for group chats
</ParamField>

<ParamField path="body" type="string">
  Text content of the message, or the caption for media messages. null when the message has no text.
</ParamField>

<ParamField path="message_type" type="string">
  Content type of the message: 'chat' for text, or e.g. 'image', 'video', 'document', 'audio', 'ptt', 'poll\_creation', 'location', 'vcard'
</ParamField>

<ParamField path="timestamp" type="string">
  When the message was sent, as an ISO 8601 timestamp
</ParamField>

<ParamField path="from_me" type="boolean">
  Whether the message was sent by the org phone (true) or received from the contact (false)
</ParamField>

<ParamField path="ack" type="string">
  Delivery acknowledgement level as a string: '-1' failed, '0' pending, '1' sent, '2'/'3' delivered, '4' read, '5' played. null when unknown.
</ParamField>

<ParamField path="performed_by" type="string">
  Who triggered the message from Periskope: a member's email, or 'api' when sent via the API. null for messages sent from the phone itself.
</ParamField>

<ParamField path="sender_phone" type="string">
  chat\_id of the actual sender — in group chats this is the participant who sent the message
</ParamField>

<ParamField path="quoted_message_id" type="string">
  message\_id of the message this one replies to (set via reply\_to when sending). null when not a reply.
</ParamField>

<ParamField path="broadcast_id" type="string">
  Id of the broadcast that produced this message, when it was sent via POST /message/broadcast. null otherwise.
</ParamField>

<ParamField path="is_deleted" type="boolean">
  Whether the message has been deleted for everyone. null when never deleted.
</ParamField>

<ParamField path="media" type="object">
  Media attached to the message. null for text-only messages.

  <Expandable title="properties">
    <ParamField path="path" type="string">
      URL of the media content
    </ParamField>

    <ParamField path="mimetype" type="string">
      MIME type of the media file
    </ParamField>

    <ParamField path="filename" type="string">
      Filename of the media — the filename provided when sending, or one derived from the url
    </ParamField>

    <ParamField path="size" type="number">
      Size of the media file in bytes, when known
    </ParamField>

    <ParamField path="dimensions" type="object">
      Pixel dimensions of the media, for images and videos

      <Expandable title="properties">
        <ParamField path="width" type="number">
          Width in pixels
        </ParamField>

        <ParamField path="height" type="number">
          Height in pixels
        </ParamField>

        <ParamField path="ar" type="number">
          Aspect ratio (width / height)
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField path="thumbnail" type="string">
      Thumbnail of the media, when generated
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="mentioned_ids" type="string[]">
  chat\_ids of the participants mentioned in the message
</ParamField>

<ParamField path="prev_body" type="string">
  Previous text content, kept when the message was edited. null when never edited.
</ParamField>

<ParamField path="sent_message_id" type="string">
  Internal queue job id (queue\_id) that produced this message when it was sent through the message queue. null otherwise.
</ParamField>

<ParamField path="delivery_info" type="object">
  Per-recipient delivery and read receipts. null when no receipts have been recorded.

  <Expandable title="properties">
    <ParamField path="delivered" type="object">
      Map of recipient chat\_id to the epoch-millisecond timestamp the message was delivered to them
    </ParamField>

    <ParamField path="read" type="object">
      Map of recipient chat\_id to the epoch-millisecond timestamp they read the message
    </ParamField>

    <ParamField path="pending" type="string[]">
      chat\_ids of recipients the message has not reached yet
    </ParamField>

    <ParamField path="delivered_count" type="number">
      Number of recipients the message was delivered to
    </ParamField>

    <ParamField path="read_count" type="number">
      Number of recipients who read the message
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="poll_info" type="object">
  The poll definition (\{pollName, pollOptions, options}) for poll\_creation messages. null otherwise.
</ParamField>

<ParamField path="poll_results" type="object">
  Votes cast on the poll, as a map of option name to voters. null for non-poll messages.
</ParamField>

<ParamField path="flag_status" type="boolean">
  Whether the message is currently flagged for follow-up in Periskope. null when never flagged.
</ParamField>

<ParamField path="updated_at" type="string">
  When the message record was last updated, as an ISO 8601 timestamp
</ParamField>

<ParamField path="reactions" type="object[]">
  Reactions placed on the message. Present on GET /message/\{message\_id}; an empty array when there are none.

  <Expandable title="each item">
    <ParamField path="reaction_id" type="string">
      Unique id of the reaction (a WhatsApp message\_id)
    </ParamField>

    <ParamField path="message_id" type="string">
      message\_id of the message the reaction belongs to
    </ParamField>

    <ParamField path="unique_id" type="string">
      unique\_id of the message the reaction belongs to. null when not known.
    </ParamField>

    <ParamField path="chat_id" type="string">
      Chat the reaction happened in
    </ParamField>

    <ParamField path="org_id" type="string">
      Id of the organization the reaction belongs to
    </ParamField>

    <ParamField path="org_phone" type="string">
      Org phone (WhatsApp account) that observed the reaction, suffixed with @c.us
    </ParamField>

    <ParamField path="sender_id" type="string">
      chat\_id of the person who reacted
    </ParamField>

    <ParamField path="reaction" type="string">
      The reaction emoji. An empty string or null means the reaction was removed.
    </ParamField>

    <ParamField path="read" type="boolean">
      Whether the reaction has been seen. null when unknown.
    </ParamField>

    <ParamField path="timestamp" type="string">
      When the reaction happened, as an ISO 8601 timestamp
    </ParamField>
  </Expandable>
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.