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 сервиса — текущий контракт.