---
title: "Status of an email"
method: GET
path: "/api/v1/emails/{id}"
tags: ["Emails"]
---

# Status of an email

`GET /api/v1/emails/{id}`

## Request

- Base URL: `https://mailcheer.com`
- URL: `https://mailcheer.com/api/v1/emails/{id}`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`

Permission required: `emails:send`. The status changes after the send, as our provider reports back. With a test key, only test emails are found; a live key never sees them.

## Path parameters

- `id` string, required

## Response `200`

The email.

- EmailDetail
  - `id` string: The identifier to pass back to `GET /api/v1/emails/{id}` to learn about delivery.
  - `object` 'email'
  - `from` string
  - `to` string[]: Always an array in the response, even if you passed a single address.
  - `subject` string
  - `created_at` string, date-time
  - `status` 'queued' | 'sent' | 'delivered' | 'opened' | 'bounced' | 'complained' | 'failed': `queued` on acceptance, then `sent`, `delivered`, `opened`, `bounced`, `complained` or `failed` as our provider reports back. Expect a few seconds before `delivered`. With several addresses, it follows the recipients in `to` only: a copy (`cc`, `bcc`) that bounces does not change it — read `recipients` for each address.
  - `error` string, nullable: The reason for the refusal, when `status` is `bounced`, `complained` or `failed`. `null` otherwise.
  - `tags` object, nullable: The send's tags, after forbidden characters were rewritten.
  - `sent_at` string, date-time, nullable
  - `delivered_at` string, date-time, nullable
  - `opened_at` string, date-time, nullable: The first open, bots included.
  - `open_count` integer: How many times the tracking pixel was loaded. Apple and Gmail preload images: this says attention, not readings.
  - `human_opened_at` string, date-time, nullable: The first open by a person — `null` as long as only bots have opened.
  - `track_opens` boolean: Whether this email carried an open-tracking pixel. `false`: `opened_at` stays `null` because opens are not tracked, not because nobody opened.
  - `track_clicks` boolean: Whether this email's links were tracked (`track_clicks`).
  - `click_count` integer: How many times a tracked link was clicked, bots included.
  - `clicked_at` string, date-time, nullable: The first click, bots included.
  - `human_clicked_at` string, date-time, nullable: The first click by a person — `null` as long as only bots have clicked.
  - `recipients` object[]: Every address of the email — `to`, then `cc`, then `bcc` — with what Amazon reported for it. `status` above follows `to` only; here each copy has its own state. Opens are not per address: the tracking pixel is the same in every copy.
    - `email` string
    - `type` 'to' | 'cc' | 'bcc'
    - `status` 'queued' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'failed': `sent` until Amazon reports on this address, then `delivered`, `bounced` or `complained`. `queued` or `failed` while the email itself is.
    - `reason` string, nullable: The bounce type Amazon reports (`Permanent`, `Transient`, `Undetermined`) when `status` is `bounced`. `null` otherwise.

## Other responses

- `401`: Key missing, unknown or revoked.
- `403`: The key does not have the requested permission, or the workspace cannot send: `sending_blocked` (suspended, blocked or banned — nothing goes out, through any channel), `commitment_required` (the anti-spam commitment is not accepted), `reputation_blocked` (too many bounces or complaints).
- `404`: The object does not exist in this workspace.

---

[API](https://skmtc.dev/mailcheer/apis/mailcheer-api.md) · [All operations](https://skmtc.dev/mailcheer/apis/mailcheer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mailcheer/apis/mailcheer-api/revisions/ba64b7ef2170?raw)
