---
title: "single_simple_send"
method: POST
path: "/simple_send_single"
tags: ["Send"]
---

# single_simple_send

`POST /simple_send_single`

## Request

- Base URL: `https://api.commpeak.com/textpeak/streams`
- URL: `https://api.commpeak.com/textpeak/streams/simple_send_single`
- Auth: API key in header `Authorization`

Send a single message in one request. The body is a flat object — ideal for transactional, one-off messages. For high volume, use `simple_send` to batch up to 250 messages per call.

**Extras.** On WhatsApp, `actions` turns the message into reply buttons, a link button or a list. `check_duplication_time_window` skips the send when the same sender already messaged the recipient within that many hours (up to 72).

Set an `internal_id` to correlate the message with delivery webhooks; it defaults to the recipient phone number.

**Response.** HTTP `200` with a `task_id` and one entry per message. `status` is `false` when any message failed: failed entries come first and carry `error` (hex code) and `details`; accepted entries carry `message_uuid` (and `conversation_uuid` on two-way channels). Match entries by `internal_id`. Final delivery status is sent asynchronously to your configured webhook.

**Whole-request errors.** Invalid JSON field types return HTTP `200` with `status: false`, `error_code` `0x1` and no `task_id`. `402` (`0x41`) means the balance is depleted.

**Authentication:** stream token in the `Authorization` header (see **Authentication** in the API Overview).

## Request body

- SingleSendRequest
  - `internal_id` string, nullable: Your identifier for the message. Echoed back in the response and in delivery webhooks (`internal_id`). Up to 36 characters are kept; longer values are cut. Not checked for uniqueness. Defaults to the recipient phone number.
  - `sender` string, nullable: An alphanumeric sender ID or a phone number registered on the stream. Omit it to use the stream's default sender.
  - `recipient_phone` string, nullable: Recipient phone number in international format, as a string. `+`, spaces, `-` and parentheses are removed before validation. Not needed when `conversation_uuid` or `contact.phone` identifies the recipient.
  - `message_content` string, required: The text body. With `actions`, the body of the interactive message.
  - `contact` Contact
    - `display_name` string, nullable: Name shown in the inbox. Defaults to `first_name` + `last_name`.
    - `first_name` string, nullable: First name.
    - `last_name` string, nullable: Last name.
    - `phone` string, nullable: Phone number; used as the recipient when `recipient_phone` is not set.
    - `email` string, nullable: E-mail address.
    - `external_id` string, nullable: Your CRM identifier for the contact; stored as the conversation lead ID.
    - `additional` object, nullable: Extra contact attributes. `additional.lead_id` takes precedence over `external_id`.
  - `conversation_uuid` string, nullable: Continue an existing conversation: the sender and recipient are taken from it. Two-way channels only (WhatsApp, Telegram, two-way SMS); ignored on one-way SMS.
  - `actions` MessageAction[], nullable: WhatsApp interactive buttons. One `cta_url` item: a link button. One to three items: reply buttons. More than three: a list.
    - `id` string, nullable: Button or list-row identifier, returned when the recipient taps it.
    - `title` string, nullable: Button text: up to 20 characters (24 for list rows).
    - `type` string, nullable: `cta_url` (or `url`) for a link button; omit for a reply button.
    - `url` string, nullable: Link opened by a `cta_url` button.
    - `description` string, nullable: List-row description, up to 72 characters.
  - `check_duplication_time_window` integer, nullable: Skip the send when this sender already messaged this recipient within the last N hours (content is not compared). At most 72. The skipped message is reported with error `0x19`.
  - `senders_pool` string[], nullable: Candidate senders, used only when no sender is set on the message, the request or the stream: a sender allowed for the destination is picked at random. When none is allowed, the whole request fails with `0x61`.
  - `schedule_to` string, nullable: Send at this time instead of now (ISO 8601 date-time).

## Response `200`

Successful Response

- SendResponse
  - `status` boolean, required: `true` when every message was accepted; `false` when at least one failed. The HTTP status is `200` either way.
  - `task_id` string, required: Identifier of this request.
  - `messages` SendResultItem[], required: One entry per message. Failed messages are listed first, then accepted ones; match them by `internal_id`.
    - `internal_id` string, nullable: Your `internal_id`, echoed back (cut to 36 characters).
    - `message_uuid` string, nullable: Platform message identifier. Accepted messages only; use it with **Get message status**.
    - `conversation_uuid` string, nullable: The conversation the message belongs to. Two-way channels only.
    - `error` string, nullable: Failed messages only: the hex error code, for example `0x1` (invalid input), `0x19` (duplicate) or `0x31` (daily limit).
    - `details` string, nullable: Failed messages only: why it failed.

## Other responses

- `401`: Invalid token, or the token is not valid from this IP address.
- `402`: Payment required: the account balance is depleted (`0x41`).
- `403`: Missing token, blocked IP address, or the stream is not available (`0x11`, `0x16`, `0x21`, `0x22`).
- `422`: Validation Error
- `500`: The request was rejected as a whole (`0x0`): for example an unknown template or more than 250 items.

---

[API](https://skmtc.dev/commpeak/apis/commpeak-textpeak-streams-api.md) - [All operations](https://skmtc.dev/commpeak/apis/commpeak-textpeak-streams-api/llms.txt) - [OpenAPI document](https://skmtc.dev/commpeak/apis/commpeak-textpeak-streams-api/revisions/b9aaa8b4efa2?raw)
