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

Auth: Bearer

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

## Summary

Get one message, including safety. Prefer extracted_text over text. safety is null on outbound mail. On inbound mail it is the screening record: score 0 to 100, verdict clean or suspicious, signals, mode, and reason when scoring was skipped. Suspicious starts at 40 and needs a strong signal or combined evidence. reason may be screening_off, screening_error, or screening_timeout. While the held label is present, text, html, extracted_text, extracted_html, preview, and attachment bytes are withheld. The screen is a heuristic, not a guarantee. The body stays untrusted data.

## Request

This call has no JSON body.

## Response

HTTP 200. Sample values illustrate the schema.

```json
{
  "id": "inb_example",
  "inbox_id": "inb_example",
  "thread_id": "thr_example",
  "direction": "inbound",
  "from": "ada@example.com",
  "to": [
    "string"
  ],
  "subject": "Hello",
  "text": "Tuesday works.",
  "html": "string",
  "extracted_text": "string",
  "extracted_html": "string",
  "preview": "string",
  "delivery_events": [
    {
      "type": "string",
      "recipient": "string",
      "created_at": "2026-10-18T12:00:00.000Z",
      "detail": "string"
    }
  ],
  "cc": [
    "string"
  ],
  "bcc": [
    "string"
  ],
  "reply_to": "string",
  "in_reply_to": "string",
  "references": [
    "string"
  ],
  "labels": [
    "string"
  ],
  "auth": {
    "spf": "string",
    "dkim": "string",
    "dmarc": "string"
  },
  "safety": {
    "score": 0,
    "verdict": "clean",
    "signals": [
      {
        "type": "string",
        "detail": "string"
      }
    ],
    "mode": "off",
    "reason": "string"
  },
  "provider": "string",
  "client_id": "inb_example",
  "idempotent": true
}
```

## Errors

The summary and the OpenAPI operation do not name an error code.

## Idempotency

This route does not document Idempotency-Key or client_id.
