Возвращает конверты писем папки — свежие первыми, страницами до 500 писем. Следующая страница — по nextBeforeUid из прошлого ответа. Чтение не помечает письма прочитанными.
| Запрос | POST /waInstance{idInstance}/getMessages/{apiTokenInstance} |
| Тело | JSON |
| Каналы | почта |
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
folder |
string | нет | папка: роль, имя на сервере или название. По умолчанию — «Входящие» |
limit |
integer | нет | писем на странице, 1–500. По умолчанию 50 |
beforeUid |
integer | нет | следующая страница: письма с uid меньше этого. Передайте nextBeforeUid из прошлого ответа |
unseen |
boolean | нет | true — только непрочитанные |
since |
string, integer | нет | письма с этой даты: ГГГГ-ММ-ДД или время Unix |
before |
string, integer | нет | письма до этой даты, не включая её |
since и before сравниваются с датой, когда письмо легло в ящик, с точностью до дня. Отбор по отправителю, теме и тексту — в searchMessages.
Пример запроса
Непрочитанные письма «Входящих», по два на странице:
curl
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/getMessages/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"folder": "inbox", "limit": 2, "unseen": true}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]
url = f"{BASE}/getMessages/{TOKEN}"
payload = {"folder": "inbox", "limit": 2, "unseen": True}
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}/getMessages/${GRATIO_TOKEN}`;
const payload = { folder: "inbox", limit: 2, unseen: true };
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 . '/getMessages/' . getenv('GRATIO_TOKEN');
$payload = ['folder' => 'inbox', 'limit' => 2, 'unseen' => true];
$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:
{
"folder": "INBOX",
"uidValidity": 1700000000,
"total": 14,
"messages": [
{
"idMessage": "7877cd439c05bc16617b",
"folder": "INBOX",
"uid": 1540,
"uidValidity": 1700000000,
"chatId": "maria@client.ru",
"messageId": "CAF1xQm9p4r@mail.gmail.com",
"threadId": "c62b698304229a98aad3",
"inReplyTo": "gr.ztme4rgc2femufilbicvmeimbh@school.ru",
"references": ["CAF1xQm7v2k@mail.gmail.com", "gr.ztme4rgc2femufilbicvmeimbh@school.ru"],
"timestamp": 1791828458,
"internalDate": 1791828460,
"from": {"address": "maria@client.ru", "name": "Мария"},
"to": [{"address": "info@school.ru", "name": ""}],
"cc": [],
"replyTo": [],
"subject": "Re: Запись на пробное",
"flags": [],
"seen": false,
"flagged": false,
"answered": false,
"draft": false,
"size": 52817,
"hasAttachments": true
},
{
"idMessage": "92395522895e09c7929a",
"folder": "INBOX",
"uid": 1537,
"uidValidity": 1700000000,
"chatId": "oleg@client.ru",
"messageId": "5f2a91c3@client.ru",
"threadId": "92395522895e09c7929a",
"inReplyTo": null,
"references": [],
"timestamp": 1791826200,
"internalDate": 1791826203,
"from": {"address": "oleg@client.ru", "name": "Олег"},
"to": [{"address": "info@school.ru", "name": ""}],
"cc": [],
"replyTo": [],
"subject": "Вопрос по оплате",
"flags": [],
"seen": false,
"flagged": false,
"answered": false,
"draft": false,
"size": 3120,
"hasAttachments": false
}
],
"nextBeforeUid": 1537
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
folder |
string | имя папки на сервере |
uidValidity |
integer | версия нумерации папки. Сменилась между страницами — начните сначала |
total |
integer | сколько писем подходит под условия; с beforeUid — среди писем старше него |
messages |
array | конверты писем, от свежих к старым — поля в статье Почта через API |
nextBeforeUid |
integer | beforeUid для следующей страницы; null — страница последняя |
Все письма папки
Пройти папку от свежих писем к старым страницами по 200:
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]
def letters(folder: str = "inbox", since: str | None = None):
"""Конверты писем папки — от свежих к старым."""
body = {"folder": folder, "limit": 200}
if since:
body["since"] = since
validity = None
while True:
r = requests.post(f"{BASE}/getMessages/{TOKEN}", json=body, timeout=90)
r.raise_for_status()
page = r.json()
if validity is not None and page["uidValidity"] != validity:
raise RuntimeError("нумерацию папки сменили на сервере — пройдите папку заново")
validity = page["uidValidity"]
yield from page["messages"]
if page["nextBeforeUid"] is None:
return
body["beforeUid"] = page["nextBeforeUid"]
for env in letters("inbox", since="2026-10-01"):
print(env["uid"], env["from"]["address"], env["subject"])
Вы увидите строки вида 1540 maria@client.ru Re: Запись на пробное. Новые письма между страницами в обход не попадут — они придут уведомлением Письмо.
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
limit или beforeUid — не число; дата не ГГГГ-ММ-ДД и не время Unix |
исправить запрос |
400 |
folder_not_found |
нет такой папки | проверить getFolders |
400 |
not_authorized |
ящик не подключён | подключить ящик: connectMailbox |
501 |
not_supported |
канал — не почта | вызвать у канала «Почта» |
Общие правила — в статье Ответы и ошибки.
Что дальше
- searchMessages — поиск по отправителю, теме, тексту и флагам.
- getEmail — письмо целиком.
- markMessages — отметить прочитанными.
