conversations

List conversation messages

Read the message history (inbound and outbound) for one conversation, oldest first.

This is how you read inbound replies; for a real-time feed subscribe to the message.received webhook instead of polling.

Messages come oldest first and the cursor walks forward, so ?limit=1 returns the first message in the conversation, not the newest reply. Take the newest reply from the message.received webhook (it carries message_id and the body), or page through to the end; the SDK's messagesAll() walks every page for you.

Always branch on has_media, not on body. A customer who sends a photo or a PDF with no caption produces an empty body. Without has_media that is indistinguishable from an empty text message, and the attachment is silently missed.

media_status is pending while we fetch the asset from WhatsApp, downloaded once it is stored, and failed when the download permanently gave up. Treat failed as terminal: WhatsApp's media handle has expired by then and the asset cannot be recovered. Poll or wait for the webhook rather than assuming a null media_url means there is no attachment.

To fetch a file, call media_download_path with your API key (GET /api/v1/conversations/{id}/messages/{messageId}/media): it answers with a signed URL that works for five minutes. media_download_path is null when the message has no file.

media_url is deprecated and will be removed on 2027-04-15: use media_download_path. Until then it is a signed link minted for each read that works for one hour (it was the stored link before, which for files you sent stayed valid for seven days). Never store it: read it again, or call the download path, when you need the file.

get/api/v1/conversations/{id}/messages

Request

  • Base URL: https://app.blueticked.com
  • URL: https://app.blueticked.com/api/v1/conversations/{id}/messages
  • Auth: HTTP bearer

Path parameters

idstring required

The resource's unique identifier.

Query parameters

limitinteger

Maximum number of items to return.

cursorstring

Opaque pagination cursor. Pass the next_cursor from a previous response; do not construct it yourself.

Response

Success

next_cursorstring nullable required
has_moreboolean required
request_idstring required

Example response

{
  "data": [
    {
      "id": "763c4dc3-d46b-4c10-8bd4-3f233a933ea0",
      "body": "Yes, 2pm works",
      "status": "delivered",
      "created_at": "2026-05-22T10:30:00.000Z",
      "updated_at": "2026-05-22T10:30:00.000Z",
      "media_type": "document",
      "media_mime": "application/pdf",
      "media_filename": "invoice-4471.pdf",
      "media_status": "downloaded",
      "media_download_path": "/api/v1/conversations/fa3efd47-67b2-428c-b75f-17d1dd2e9790/messages/089542d5-2dc1-4619-8063-38a4eda42716/media",
      "media_url": "https://…/storage/v1/object/sign/inbound-media/…/invoice-4471.pdf?token=…"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}

Changes

No recorded changes to this operation across all 1 revision of this API.