---
title: "Get message"
method: GET
path: "/messages/{message_id}"
tags: ["Messages"]
---

# Get message

`GET /messages/{message_id}`

Returns a sent message's status, recipient, event, and per-provider delivery detail, with timestamps for enqueued, sent, delivered, opened, and clicked.

## Path parameters

- `message_id` string, required

## Response `200`

- MessageDetailsExtended
  - `id` string, required — A unique identifier associated with the message you wish to retrieve (results from a send).
  - `status` 'CANCELED' | 'CLICKED' | 'DELAYED' | 'DELIVERED' | 'DIGESTED' | 'ENQUEUED' | 'FILTERED' | 'OPENED' | 'ROUTED' | 'SENT' | 'SIMULATED' | 'THROTTLED' | 'UNDELIVERABLE' | 'UNMAPPED' | 'UNROUTABLE', required
  - `enqueued` integer, required — A UTC timestamp at which Courier received the message request. Stored as a millisecond representation of the Unix epoch.
  - `sent` integer — A UTC timestamp at which Courier passed the message to the Integration provider. Stored as a millisecond representation of the Unix epoch.
  - `delivered` integer — A UTC timestamp at which the Integration provider delivered the message. Stored as a millisecond representation of the Unix epoch.
  - `opened` integer — A UTC timestamp at which the recipient opened a message for the first time. Stored as a millisecond representation of the Unix epoch.
  - `clicked` integer — A UTC timestamp at which the recipient clicked on a tracked link for the first time. Stored as a millisecond representation of the Unix epoch.
  - `recipient` string, required — A unique identifier associated with the recipient of the delivered message.
  - `event` string, required — A unique identifier associated with the event of the delivered message.
  - `notification` string, required — A unique identifier associated with the notification of the delivered message.
  - `error` string, nullable — A message describing the error that occurred.
  - `reason` 'BOUNCED' | 'FAILED' | 'FILTERED' | 'NO_CHANNELS' | 'NO_PROVIDERS' | 'OPT_IN_REQUIRED' | 'PROVIDER_ERROR' | 'UNPUBLISHED' | 'UNSUBSCRIBED'

## Other responses

- `400`
- `404`

## Changes

- **2026-07-29** `f76bed79a913` — 2 info
  - api tag `Messages` added
  - api tag `Sent Messages` removed
- **2026-03-12** `19330fca8fa9` — 4 breaking
  - the response property `allOf[subschema #1: MessageDetails]/clicked` became optional for the status `200`
  - the response property `allOf[subschema #1: MessageDetails]/delivered` became optional for the status `200`
  - the response property `allOf[subschema #1: MessageDetails]/opened` became optional for the status `200`
  - the response property `allOf[subschema #1: MessageDetails]/sent` became optional for the status `200`
- **2025-10-15** `e67d02739533` — 2 info
  - api tag `Sent Messages` added
  - api tag `Messages` removed
- **2025-10-07** `7143ea51f307` — 3 warning
  - added the new `BOUNCED` enum value to the `allOf[subschema #1: MessageDetails]/reason` response property for the response status `200`
  - added the new `FAILED` enum value to the `allOf[subschema #1: MessageDetails]/reason` response property for the response status `200`
  - added the new `OPT_IN_REQUIRED` enum value to the `allOf[subschema #1: MessageDetails]/reason` response property for the response status `200`

[Change history](https://skmtc.dev/trycourier/apis/courier/changes/messages/:message_id/get.md)

---

[API](https://skmtc.dev/trycourier/apis/courier.md) · [All operations](https://skmtc.dev/trycourier/apis/courier/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/trycourier/courier/revisions/cb8586034158/schema)
