Senden API — набор для интеграции

BASE_URL: https://api-senden.ru/api/v1
Node.js >=20 или Python >=3.10. Только стандартная библиотека, без npm/pip.

1. Войдите в кабинет и создайте именованный Senden API-ключ в профиле.
   Для discovery достаточно read. Отправка/загрузка/аренда уведомлений требуют write.
   Аккаунт, создание/отзыв ключей и админ-панель работают с cookie браузера, не с API-ключом.
2. Укажите SENDEN_BASE_URL и SENDEN_API_KEY через окружение/хранилище секретов.
   .env.example — пример, клиенты сами .env не читают. Не сохраняйте реальный ключ
   в репозитории, HTML, переписке с AI, Postman export или журналах.
3. Запустите node senden-node.mjs или python senden-python.py.
   Это один GET integrations/manifest: полный HTTP-каталог commands, безопасные
   instances, connectedMessengers и permissions. Отправки, QR-входа, загрузки и lease нет.
   getManifest/get_manifest и getCommands/get_commands используют этот endpoint.
   GET /methods и getMethods/get_methods — только native-подмножество, не весь HTTP API.
4. Выберите connected подключение и получите GET /instances/{id}/chats.
   Для to используйте ID из chats. Телефон и ID контакта не являются универсальным ID чата.
   MAX contacts.lookup сейчас возвращает user ID в поле chatId; не подставляйте его в to.
5. Импортируйте класс SendenClient в свою программу. Явно вызовите sendText/send_text
   или sendFile/send_file и передайте стабильный непустой Idempotency-Key (8..128 символов).
   Клиенты не повторяют HTTP-запросы автоматически. operation() принимает реальные
   native имена из GET /methods и требует ключ для native mutation=true.

Запуск в Bash (введите ключ скрыто, он не попадёт в текст команды):
export SENDEN_BASE_URL='https://api-senden.ru/api/v1'
read -rsp 'Senden API key: ' SENDEN_API_KEY
export SENDEN_API_KEY
node senden-node.mjs
python3 senden-python.py
unset SENDEN_API_KEY

Запуск в PowerShell (введите ключ скрыто):
$env:SENDEN_BASE_URL='https://api-senden.ru/api/v1'
$secureKey=Read-Host 'Senden API key' -AsSecureString
$env:SENDEN_API_KEY=[System.Net.NetworkCredential]::new('', $secureKey).Password
node .\senden-node.mjs
python .\senden-python.py
Remove-Item Env:SENDEN_API_KEY

У файлов два отдельных шага: uploadFile/upload_file -> file.id, затем sendFile/send_file.
Файл: 1..20 MiB, имя до180 символов, текст/подпись до16000. Загрузка не отправляет файл.
GET /files/{fileId} скачивает локальную копию upload: сравните размер и SHA256 до отправки.
После send проверяйте message.provider_id и native messages.get, если транспорт поддерживает.
Это не доказывает побайтовое совпадение удалённой копии, доставку или прочтение получателем.

POST messages возвращает202: сообщение только принято в постоянную очередь.
queued, sending, submitted и provider_id не равны delivered/read. Смотрите историю,
очередь и события; часть транспортов не публикует подтверждения доставки/прочтения.
При сетевой неопределённости проверяйте тот же запрос с тем же ключом и теми же данными.
При delivery_unknown/native_command_unknown НЕ повторяйте с новым ключом: возможен дубль.
Idempotency-Key с другими параметрами даёт409. failed и delivery_unknown — разные состояния;
ручной retry разрешён только для подтверждённого failed. Архивные подключения остановлены.

Ошибки JSON: {"error":{"code":"MACHINE_CODE","message":"Безопасное описание"}}.
400 — проверка ввода;401 — ключ отсутствует/истёк/отозван;403 — права;404 — ресурс/чужое
пространство;409 — состояние/идемпотентность;413 — размер;429 — лимит;501 — метод не
поддерживается этим мессенджером;503 — транспорт/неподтверждённый native outcome.
Методы native POST с mutation=false требуют read, но всё равно connected.
POST notifications/receive требует write: создаёт lease. Подтверждайте receiptId после
обработки. Webhook может повториться: дедупликация по event.id; auth/QR в durable очереди нет.

Postman: импортируйте postman.collection.json, задайте SendenAPIKey и instanceId/chatId.
Изменения пропускаются по умолчанию (allowWrites=false). Для явно выбранного действия
установите allowWrites=true и при необходимости idempotencyKey. Нужна версия Postman
с pm.execution.skipRequest(). Не запускайте все изменения подряд через Collection Runner.
quickstart.http содержит только placeholders; выбирайте запросы вручную.

openapi.json — полная системная схема с корректной cookie-security account/admin.
Postman и ai-context.json содержат только интеграционные bearer/public маршруты.
llms.txt и ai-context.json не содержат ключей, аккаунтов, чатов или live IDs.
Каталог и поддержка мессенджеров генерируются из актуальных исходников сервиса.
GET /integrations/manifest, GET /methods и OpenAPI сервиса — текущий контракт.
