---
title: "Send message"
method: POST
path: "/v1/social/chats/{chat_id}/messages"
tags: ["Direct Messages"]
---

# Send message

`POST /v1/social/chats/{chat_id}/messages`

## Request

- Base URL: `https://apihub.co.il`
- URL: `https://apihub.co.il/v1/social/chats/{chat_id}/messages`
- Auth: HTTP bearer

Creates an outbound message and queues it for delivery. The message is created immediately with status pending and published asynchronously; each send accepts either text or a single attachment, never both.

**Billing:** Engagement action (request) · **Rate limit:** 60/min

## Path parameters

- `chat_id` string, required: Chat ID — accepts the Postproxy hashid or the platform's external_conversation_id

## Headers

- `Idempotency-Key` string
- `X-Tag` string

## Request body

- object: Payload for sending an outbound message. Each send accepts either text (body) or a single attachment (media), never both.
  - `tag` 'HUMAN_AGENT': Message tag for sending outside the 24-hour window. Facebook and Instagram only — ignored on Telegram. Extends the reply window to 7 days from the participant's last inbound message; for a human resolving the participant's own inquiry only, never promotional content.
  - `body` string: Message text. Required when media is empty. Capped at 220 characters when buttons are present.
  - `card` object: Extra fields for the card carrying buttons — renders a richer, product-style card. Requires buttons.
    - `subtitle` string: Capped at 220 characters
    - `image_url` string: Must be an https:// URL
    - `default_action` object: Action when the card itself is tapped
      - `url` string: Must be an https:// URL
      - `type` 'web_url'
  - `media` unknown[]: A single media attachment. Accepts the same shapes as the Posts API — a multipart upload, a public URL, a base64 data URI, or a base64 hash. Currently one attachment per send (Meta Send API limit); passing more returns 422. Not supported on Bluesky (422).
    - unknown
  - `buttons` object[]: Facebook and Instagram only. Up to 3 buttons attached to the message. Requires body (capped at 220 characters); cannot be combined with media.
    - `url` string: Required for web_url buttons, must be an https:// URL
    - `type` 'web_url' | 'postback', required
    - `title` string, required: Required, 20 characters or fewer
    - `payload` string: Required for postback buttons, 1000 characters or fewer
  - `reply_markup` object: Telegram only. Inline keyboard (inline_keyboard), custom reply keyboard (keyboard, with one_time_keyboard / resize_keyboard), force_reply, or remove-keyboard payload — passed through to Telegram unchanged.
  - `quick_replies` object[]: Facebook and Instagram only. Up to 13 tappable chips shown above the participant's composer. On Instagram, delivered only on a plain-text message (not combinable with media or buttons).
    - `title` string, required: Required, 20 characters or fewer
    - `payload` string, required: Required, 1000 characters or fewer
    - `content_type` 'text': Optional; only "text" is accepted — Messenger's user_phone_number / user_email chips are not supported
  - `reply_to_external_id` string: Telegram only. Platform message_id to thread the reply under.

## Response `200`

Completed

- object
  - `id` string: Execution id — stable across internal retries; use it with GET /v1/executions/{id}
  - `status` 'pending' | 'processing' | 'completed' | 'partial' | 'failed' | 'cancelled' | 'timeout'
  - `operation` string
  - `tag` string, nullable: Your X-Tag, if sent
  - `created_at` string, date-time
  - `completed_at` string, date-time, nullable
  - `output` object: Operation result (see each operation). While a Studio render is processing: `stage` (queued · transcribing · downloading · preparing · cleaning_voice · mixing_audio · rendering · finishing), `phase` (the engine's: download · prepare · voice · audio · encode · qa · upload, or null), `progress` (a percent, 0–100) and `progress_fraction` (0–1), `eta_seconds` (seconds left, never below 0) and `estimate_seconds`
  - `error` string, nullable
  - `usage` object
    - `credits_charged` number, nullable
    - `credits_reserved` number
    - `estimated_credits` number
    - `cost_source` 'provider_reported' | 'calculated' | 'estimated' | 'null', nullable
    - `provider_usage` object, nullable: Normalised consumption, e.g. { VIDEO_SECOND: 22.4 }
  - `balance` object
    - `available` number
    - `reserved` number

## Other responses

- `400`: Invalid input
- `402`: Insufficient credits / project budget
- `404`: Resource not found (or not yours)
- `429`: Rate limited
- `503`: Service temporarily paused

---

[API](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai.md) · [All operations](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/revisions/a8caa42835ce?raw)
