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

# Send messages

> List individual messages of a bulk send

## Description

Returns a paginated list of individual messages from a bulk send. Allows filtering by status to quickly identify failed, delivered, or read messages.

## Authentication header

<ParamField header="X-API-Key" type="string" required>
  Your Mindo API Key. Format: `mindo_xxxxxxxxxxxxxxxxxxxxxxxx`
</ParamField>

## Path parameters

<ParamField path="bulk_send_id" type="string (UUID)" required>
  Bulk send ID obtained when creating the send with [Send bulk](/en/api-reference/envio-masivo/enviar-masivo).
</ParamField>

## Query parameters

<ParamField query="status" type="string">
  Filter by message status. Possible values: `sent`, `delivered`, `read`, `failed`.
</ParamField>

<ParamField query="page" type="integer">
  Page number. Default: `1`.
</ParamField>

<ParamField query="page_size" type="integer">
  Results per page. Default: `20`.
</ParamField>

## Response

<ResponseField name="count" type="integer">
  Total messages matching the filters.
</ResponseField>

<ResponseField name="next" type="string | null">
  URL of the next page of results. `null` if it's the last page.
</ResponseField>

<ResponseField name="previous" type="string | null">
  URL of the previous page. `null` if it's the first page.
</ResponseField>

<ResponseField name="results" type="array">
  List of individual messages.

  <Expandable title="Properties of each message">
    <ResponseField name="id" type="integer">
      Message ID.
    </ResponseField>

    <ResponseField name="recipient_phone" type="string">
      Recipient's phone number.
    </ResponseField>

    <ResponseField name="status" type="string">
      Current message status. See [status table](#message-statuses).
    </ResponseField>

    <ResponseField name="meta_message_id" type="string">
      Message ID in Meta/WhatsApp.
    </ResponseField>

    <ResponseField name="variables_used" type="object">
      Variables used for this recipient.
    </ResponseField>

    <ResponseField name="sent_at" type="string (ISO 8601)">
      Date and time when the message was sent.
    </ResponseField>

    <ResponseField name="delivered_at" type="string (ISO 8601) | null">
      Delivery date and time. `null` if not yet delivered.
    </ResponseField>

    <ResponseField name="read_at" type="string (ISO 8601) | null">
      Read date and time. `null` if not yet read.
    </ResponseField>

    <ResponseField name="error_message" type="string | null">
      Error message if the send failed. `null` if there was no error.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.mindosoftware.com/api/v1/meta-templates/bulk-sends/a3f2b8c9-4d5e-6f7a-8b9c-0d1e2f3a4b5c/messages/?status=delivered&page=1&page_size=20" \
    -H "X-API-Key: mindo_xxxxxxxxxxxxxxxxxxxxxxxx"
  ```

  ```python Python theme={null}
  import requests

  bulk_send_id = "a3f2b8c9-4d5e-6f7a-8b9c-0d1e2f3a4b5c"

  response = requests.get(
      f"https://api.mindosoftware.com/api/v1/meta-templates/bulk-sends/{bulk_send_id}/messages/",
      headers={"X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx"},
      params={"status": "delivered", "page": 1, "page_size": 20}
  )

  data = response.json()
  print(f"Total messages: {data['count']}")
  for msg in data["results"]:
      print(f"  {msg['recipient_phone']}: {msg['status']}")
  ```

  ```javascript JavaScript theme={null}
  const bulkSendId = "a3f2b8c9-4d5e-6f7a-8b9c-0d1e2f3a4b5c";
  const params = new URLSearchParams({
    status: "delivered",
    page: "1",
    page_size: "20"
  });

  const response = await fetch(
    `https://api.mindosoftware.com/api/v1/meta-templates/bulk-sends/${bulkSendId}/messages/?${params}`,
    {
      headers: { "X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx" }
    }
  );

  const data = await response.json();
  console.log(`Total messages: ${data.count}`);
  data.results.forEach(msg => {
    console.log(`  ${msg.recipient_phone}: ${msg.status}`);
  });
  ```
</RequestExample>

<ResponseExample>
  ```json 200 - OK theme={null}
  {
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
      {
        "id": 1001,
        "recipient_phone": "+5491112345678",
        "status": "delivered",
        "meta_message_id": "wamid.HBgLNTU0MTE2NzU0Nzg1FQIAERgS...",
        "variables_used": {
          "name": "Juan Perez",
          "code": "ABC123"
        },
        "sent_at": "2025-11-16T21:30:10Z",
        "delivered_at": "2025-11-16T21:30:15Z",
        "read_at": null,
        "error_message": null
      },
      {
        "id": 1002,
        "recipient_phone": "+5491187654321",
        "status": "read",
        "meta_message_id": "wamid.HBgLNTU0MTE2NzU0Nzg1FQIAERgT...",
        "variables_used": {
          "name": "Maria Garcia",
          "code": "DEF456"
        },
        "sent_at": "2025-11-16T21:30:18Z",
        "delivered_at": "2025-11-16T21:30:23Z",
        "read_at": "2025-11-16T21:30:30Z",
        "error_message": null
      },
      {
        "id": 1003,
        "recipient_phone": "+5491199887766",
        "status": "sent",
        "meta_message_id": "wamid.HBgLNTU0MTE2NzU0Nzg1FQIAERgU...",
        "variables_used": {
          "name": "Carlos Lopez",
          "code": "GHI789"
        },
        "sent_at": "2025-11-16T21:30:26Z",
        "delivered_at": null,
        "read_at": null,
        "error_message": null
      }
    ]
  }
  ```

  ```json 404 - Not found theme={null}
  {
    "detail": "Not found."
  }
  ```

  ```json 401 - Not authenticated theme={null}
  {
    "error": "Este endpoint requiere autenticacion con API Key (header X-API-Key)"
  }
  ```
</ResponseExample>

## Message statuses

| Status      | Description                        |
| ----------- | ---------------------------------- |
| `sent`      | Message sent to the Meta API       |
| `delivered` | Message delivered to the recipient |
| `read`      | Message read by the recipient      |
| `failed`    | Send error                         |

<Note>
  Statuses are automatically updated via Meta webhooks. The status progresses from `sent` → `delivered` → `read`. If the send fails, the status will be `failed` and the `error_message` field will contain the error description.
</Note>
