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

# Get a message

`GET /v1/messages/{id}`

## Request

- Base URL: `https://api.samva.dev`
- URL: `https://api.samva.dev/v1/messages/{id}`
- Auth: API key in header `x-api-key`

Returns a message by its ID: addresses, subject, status, and why it is waiting when it is. Per-recipient delivery state and the body are their own reads.

## Path parameters

- `id` string, required

## Response `200`

Message

- Message
  - `id` string, required
  - `channel` 'email', required
  - `direction` 'outbound' | 'inbound', required
  - `status` 'pending' | 'scheduled' | 'queued' | 'processing' | 'sent' | 'delivered' | 'read' | 'failed' | 'bounced' | 'complained', required
  - `from` MessageSender, required
    - `address` string, required
    - `name` string, nullable, required
  - `to` MessageAddress[], required
    - `address` string, required
    - `contactId` string, required
  - `cc` MessageAddress[], required
    - `address` string, required
    - `contactId` string, required
  - `bcc` MessageAddress[], required
    - `address` string, required
    - `contactId` string, required
  - `replyTo` string[], required
  - `subject` string, nullable, required
  - `conversationId` string, required
  - `inReplyToMessageId` string, required
  - `tags` string[], required
  - `metadata` object, nullable, required
  - `isTest` boolean, required
  - `scheduledAt` string, nullable, required
  - `submission` MessageSubmission, required
    - `origin` 'direct' | 'campaign' | 'scheduled' | 'mailbox' | 'forwarding' | 'journey', required
    - `transport` 'http', nullable, required
    - `credential` union, required
      - object
        - `kind` 'api_key', required
        - `apiKeyId` string, required
      - object
        - `kind` 'oauth', required
        - `clientId` string, nullable, required
      - object
        - `kind` 'session', required
    - `userId` string, required
    - `client` SubmissionClient, required
      - `surface` 'typescript-promise' | 'typescript-effect' | 'cli' | 'mcp', required
      - `version` string, required
  - `waitReason` 'rate' | 'daily-quota' | 'domain-health' | 'sending-paused' | 'upstream-unavailable' | 'retry' | 'campaign-paused' | 'domain-warming' | 'onboarding-review' | 'content-review' | 'screening-unavailable', nullable, required
  - `reviewExpectedAt` string, nullable, required
  - `skippedRecipients` SkippedRecipient[], required
    - `address` string, required
    - `reason` 'bounce' | 'complaint' | 'unsubscribe' | 'manual' | 'group-unsubscribe', required
    - `unsubscribeGroupId` string
  - `createdAt` string, required
  - `updatedAt` string, required

## Other responses

- `401`: UnauthorizedError
- `403`: ForbiddenError
- `404`: ResourceNotFoundError
- `422`: ValidationError
- `500`: InternalError
- `504`: GatewayTimeoutError

---

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