Перейти к содержимому

sendMessage

Обновлено 17 октября 2026

Отправляет текст собеседнику или в группу. Можно ответить цитатой, показать «печатает» перед отправкой и защититься от дублей при повторе запроса.

Запрос POST /waInstance{idInstance}/sendMessage/{apiTokenInstance}
Тело JSON
Каналы MAX, Telegram, WhatsApp, почта

Параметры

Параметр Тип Обязательный Описание
chatId string да получатель: личный чат, группа или номер 79991234567@c.us — см. Идентификаторы чатов и сообщений
message string да текст. Предел — max_text_len канала: MAX — 4000, Telegram — 4096, WhatsApp — 65 536 символов
quotedMessageId string нет ответить цитатой на сообщение этого же чата
typingTime integer нет показать «печатает» 1000–20000 мс, затем отправить. Запрос ждёт это время
clientMessageId string нет ваш ключ от дублей: повтор с тем же ключом не создаст второе сообщение — см. Надёжная отправка без дублей

Пример запроса

Ответ клиенту по номеру телефона, с ключом от дублей:

curl

curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/sendMessage/$GRATIO_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "chatId": "79991234567@c.us",
    "message": "Здравствуйте! Записали вас на субботу, 11:00.",
    "clientMessageId": "booking-1532-confirm"
  }'

Python

import os
import requests

BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]

url = f"{BASE}/sendMessage/{TOKEN}"
payload = {
    "chatId": "79991234567@c.us",
    "message": "Здравствуйте! Записали вас на субботу, 11:00.",
    "clientMessageId": "booking-1532-confirm",
}
response = requests.post(url, json=payload, timeout=60)
print(response.status_code, response.json())

Node.js

const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/waInstance${GRATIO_ID}`;

const url = `${base}/sendMessage/${GRATIO_TOKEN}`;
const payload = {
  chatId: "79991234567@c.us",
  message: "Здравствуйте! Записали вас на субботу, 11:00.",
  clientMessageId: "booking-1532-confirm",
};
const response = await fetch(url, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(payload),
});
console.log(response.status, await response.json());

PHP

<?php
$base = getenv('GRATIO_URL') . '/waInstance' . getenv('GRATIO_ID');
$url = $base . '/sendMessage/' . getenv('GRATIO_TOKEN');
$payload = [
    'chatId' => '79991234567@c.us',
    'message' => 'Здравствуйте! Записали вас на субботу, 11:00.',
    'clientMessageId' => 'booking-1532-confirm',
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);

Пример ответа

Ответ 200 OK:

{"idMessage": "117428956522361912"}

Поля ответа

Поле Тип Описание
idMessage string id отправленного сообщения. По нему правят и удаляют сообщение и связывают статусы

Ещё примеры

В группу

chatId — id группы. В MAX это отрицательное число строкой:

curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/sendMessage/$GRATIO_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "chatId": "-80040066617372",
    "message": "Занятие в субботу переносится на 12:00."
  }'

Ответ цитатой

quotedMessageId — сообщение собеседника, на которое отвечаете:

curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/sendMessage/$GRATIO_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "chatId": "8695836",
    "message": "Да, место есть.",
    "quotedMessageId": "117428955282341903"
  }'

С «печатает»

Собеседник 3 секунды видит «печатает», потом получает сообщение. Запрос отвечает через 3 секунды:

curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/sendMessage/$GRATIO_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "chatId": "8695836",
    "message": "Сейчас проверю расписание.",
    "typingTime": 3000
  }'

Что происходит после отправки

Приложение              Gratio                    Мессенджер
    │ sendMessage ──────────►│                          │
    │                        │── сообщение ────────────►│
    │◄── {"idMessage"} ──────│                          │
    │◄── outgoingAPIMessageReceived                     │
    │◄── outgoingMessageStatus: sent                    │
    │                        │◄── прочитано ────────────│
    │◄── outgoingMessageStatus: read                    │
  • В MAX перед отправкой Gratio отмечает прочитанными сообщения собеседника, пришедшие до неё, — как человек, который отвечает в открытом чате. В других каналах «прочитано» ставит readChat.
  • Статусы приходят уведомлением outgoingMessageStatus: sent, затем delivered (только WhatsApp) и read.

Ошибки

Код code Когда Что делать
400 validation нет chatId или message добавить поле
400 not_authorized канал не на связи проверить getStateInstance
400 no_account на номере …@c.us нет аккаунта в этом мессенджере выбрать другой канал
400 text_too_long текст длиннее предела канала разбить на части
400 код площадки чата нет, собеседник закрыл сообщения см. message
402 payment_required канал на паузе за неоплату продлить канал в кабинете
409 idempotency_conflict тот же clientMessageId с другим текстом новый ключ для нового сообщения
429 too_frequent и другие темп канала или правило WhatsApp повторить после Retry-After
503 outcome_unknown связь оборвалась посреди отправки повторить с тем же clientMessageId

Общие правила — в статье Ответы и ошибки.

Особенности каналов

  • Почта. Письмо-ответ в ту же цепочку: на quotedMessageId или на последнее письмо переписки не старше 30 дней, иначе новое письмо. Тема — «Re: …» или первая строка текста. Письмо со всеми полями — sendEmail.
  • WhatsApp. Первое сообщение новому собеседнику ограничено правилами качества — см. WhatsApp.
  • Кнопки ни в одном канале не поддерживаются: sendButtons и sendInteractiveButtons отвечают 501. Варианты ответа пишите текстом.

Что дальше

Была ли статья полезна?