# GET /api/v1/inboxes/:id/messages

Auth: Bearer

HTML: https://cooperemail.com/docs/reference/list-messages

## Summary

List messages, newest first unless ascending=true. :id can be inbox id, username, or email. labels= and unread= still filter on the server before limit (max 200, default 50). Also accepts before and after (ISO-8601 exclusive bounds on created_at; a bad value is 400 invalid_date), from, to (matches To and Cc), and subject (case-insensitive substrings; % and _ match those characters), direction=inbound or outbound (400 invalid_direction otherwise), thread_id, and page_token (base64url of created_at and id; 400 invalid_page_token). ascending must be true or false (400 invalid_ascending). The response includes next_page_token. Equal timestamps stay in id order so pages do not skip or repeat a message.

## Query

```json
?from=ada@example.com&subject=invoice&direction=inbound&limit=50
```

## Response

The OpenAPI document does not declare a JSON response schema for this call. The summary is the contract.

## Errors

- HTTP 400 invalid_date
- HTTP 400 invalid_direction
- HTTP 400 invalid_page_token
- HTTP 400 invalid_ascending

The live `message` is the sentence for that code. Branch on `code`.

```json
{
  "error": {
    "type": "invalid_request",
    "code": "invalid_date",
    "docs_url": "https://cooperemail.com/docs#invalid_date"
  }
}
```

## Idempotency

This route does not document Idempotency-Key or client_id.
