# List events for a message

`GET /v1/amb/messages/{message_id}/events`

Returns a message's lifecycle events in chronological order, one entry per status transition (`amb.accepted`, `amb.sent`, `amb.send_failed`, `amb.received`). The timeline is bounded and returned in full, so this list is not paginated. Event history does not expire based on age.

## Code samples

**TypeScript**

```ts
const result = await bird.amb.listEvents("amb_01krdgeqcxet5s7t44vh8rt9mg");
console.log(result);
```

Examples: [TypeScript](/docs/api/reference/list-amb-message-events.ts.md) · [Python](/docs/api/reference/list-amb-message-events.py.md) · [Go](/docs/api/reference/list-amb-message-events.go.md) · [PHP](/docs/api/reference/list-amb-message-events.php.md) · [CLI](/docs/api/reference/list-amb-message-events.cli.md) · [MCP](/docs/api/reference/list-amb-message-events.mcp.md) · [cURL](/docs/api/reference/list-amb-message-events.curl.md)

## Example response `200`

```json
{
  "data": [
    {
      "id": "aev_01krdgeqcxet5s7t44vh8rt9mg",
      "type": "amb.sent",
      "error": {
        "code": "bird:business_not_registered",
        "description": "Apple refused the message with HTTP status 404."
      }
    }
  ]
}
```

## Path parameters

- `message_id` (string): Message identifier. Starts with `amb_`.

## Query parameters

- `type` (string)

  Keep only events of this exact type (for example `amb.sent` or `amb.send_failed`). Omit for the full timeline.

  Possible values (may grow over time): `amb.accepted`, `amb.sent`, `amb.send_failed`, `amb.rejected`, `amb.received`

## Response body

- `data` (array of object, required): The message's events, oldest first. Not paginated: a message's timeline is bounded and returned in full.
- `data.id` (string, required): ID of the event, unique within the message's timeline.
- `data.type` (string, required)

  Message timeline event type:

  - `amb.accepted`: The API accepted the request.
  - `amb.sent`: The message was handed to Apple.
  - `amb.send_failed`: Apple refused the message, or its send attempts were exhausted.
  - `amb.rejected`: Bird refused the message before any send attempt.
  - `amb.received`: An inbound message arrived from the customer.

  This is an open enum. Accept unrecognized values.

  Possible values (may grow over time): `amb.accepted`, `amb.sent`, `amb.send_failed`, `amb.rejected`, `amb.received`
- `data.occurred_at` (string, required): When this event occurred.
- `data.error` (nullable object): Failure detail, on an `amb.send_failed` or `amb.rejected` event. Null on every other event type.
- `data.error.code` (string, required): Machine-readable reason a send failed, in one of two namespaces: `bird:` for a reason Bird's own pipeline assigned (for example `bird:business_not_registered`), or `apple:` followed by the HTTP status Apple's API returned for the send attempt (for example `apple:404`). This is an open, growing set in both namespaces; accept unrecognized values.
- `data.error.description` (string, required): The failure in words. Free-form, so branch on `code` and show this to a human.
- `data.error.occurred_at` (string, required): When the failure occurred.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
