---
title: "Resend a message"
method: POST
path: "/v3/messages/{id}/resend"
tags: ["Messages"]
---

# Resend a message

`POST /v3/messages/{id}/resend`

## Request

- Base URL: `https://api.sent.dm`
- URL: `https://api.sent.dm/v3/messages/{id}/resend`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Resends a message you already sent, on the same message id, without rebuilding the request. The typical use is recovering a BLOCKED message — for example one refused for insufficient balance — after the account has been topped up.

**A resend bills again.** Each accepted resend is a new delivery attempt and records a new charge against the same message id; a client that resends on every failure is charged on every loop.

**Every policy runs again.** The resend goes back through the full send pipeline — consent, balance, KYC and channel quota, template approval, quiet hours and channel health — so it can land on BLOCKED, FILTERED or SCHEDULED again rather than being sent, exactly as a fresh send would. Status webhooks (message.sent, message.blocked, message.filtered, message.failed) fire again for the same message id, so consumers keyed on the id will see repeated transitions.

**What can be resent.** A message in a terminal state — DELIVERED, FAILED, READ or BLOCKED — or one stuck at SENT for more than 15 minutes. A FILTERED message can never be resent: the recipient opted out or a routing rule refused the send. A message still in flight (QUEUED, PROCESSED, ROUTED), held for quiet hours (SCHEDULED), or SENT less than 15 minutes ago returns 409. Two concurrent resends of one id are serialised: one is accepted, the other gets 409.

The resend keeps the channel the message was originally requested on; the channel cannot be changed on a resend — send a new message instead. `Idempotency-Key` is honoured, so a retried request replays the first accepted response instead of resending twice.

The response has the same shape as `POST /v3/messages`: `recipients` has a single entry whose `message_id` is the id you resent.

## Path parameters

- `id` string, uuid, required

## Headers

- `Idempotency-Key` string
- `x-profile-id` string, uuid

## Request body

- SentDmServicesEndpointsCustomerAPIv3MessagesRequestsResendMessageV3Request: Base request for mutation operations (POST, PUT, PATCH) with sandbox mode support
  - `sandbox` boolean: Sandbox flag - when true, the operation is simulated without side effects Useful for testing integrations without actual execution

## Response `202`

Resend accepted; the message is QUEUED again and will be billed as a new attempt

- SentDmServicesEndpointsCustomerAPIv3SharedApiResponseOfSendMessageResponse: Standard API response envelope for all v3 endpoints
  - `success` boolean: Indicates whether the request was successful
  - `data` SentDmServicesEndpointsCustomerAPIv3MessagesResponsesSendMessageResponse: The result of a multi-recipient send. Declared here rather than in the service layer. POST /v3/messages used to publish MessageSendResult — a type in Common.Services.Messaging.Contracts — so the public contract was whatever the send service happened to return, and changing that service for an internal reason changed the API. The service keeps its result; this is what a caller sees, and the mapping between them is a decision the endpoint makes. The shape of an immediate send: it never has a scheduled_at key. A send that carried scheduled_at is a ScheduledSendMessageResponse, and the endpoint decides which of the two to answer with. From always returns this type.
    - `status` string: QUEUED: the batch is accepted. A request that carried scheduled_at is QUEUED here too; each message moves to SCHEDULED once it is held, as GET /v3/messages/{id} and the message.scheduled webhook report.
    - `template_id` string, uuid
    - `template_name` string
    - `recipients` SentDmServicesEndpointsCustomerAPIv3MessagesResponsesMessageRecipientResponse[]
      - `message_id` string, uuid: Identifier for tracking this recipient's message.
      - `to` string: Phone number in E.164 format.
      - `channel` string, nullable: Channel this message will be sent on — sms, whatsapp — or null to auto-detect.
      - `body` string, nullable: Resolved template body for this recipient's channel, or null when the channel is auto-detected.
  - `error` SentDmServicesEndpointsCustomerAPIv3SharedApiError: Error information
    - `code` string: Machine-readable error code (e.g., "RESOURCE_001")
    - `message` string: Human-readable error message
    - `details` object, nullable: Additional validation error details (field-level errors)
    - `doc_url` string, nullable: URL to documentation about this error
  - `meta` SentDmServicesEndpointsCustomerAPIv3SharedApiMeta: Request and response metadata
    - `request_id` string: Unique identifier for this request (for tracing and support)
    - `timestamp` string, date-time: Server timestamp when the response was generated
    - `version` string: API version used for this request

## Other responses

- `400`: Invalid message ID
- `401`: Unauthorized - Invalid API credentials
- `403`: Forbidden
- `404`: Message not found
- `409`: Message is not resendable in its current state (in flight, scheduled, recently sent, or filtered)
- `429`: Rate limit exceeded - resends are limited per customer because each one bills
- `500`: Internal server error, or the message's stored data could not be rebuilt for a resend (the message is marked FAILED and was not resent)

## Changes

- **2026-11-03** `bdcca958cac7`: 2 info
  - added `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3MessagesResponsesSendMessageResponse` to the `data` response property `allOf` list for the response status `202`
  - removed `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3MessagesResponsesResendMessageV3Response` from the `data` response property `allOf` list for the response status `202`
- **2026-10-16** `6c829543a93e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/changes/v3/messages/:id/resend/post.md)

---

[API](https://skmtc.dev/sentdm/apis/sent-dm-api-v3.md) - [All operations](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/revisions/bdcca958cac7?raw)
