REST API поставщика ТОВАРНО
Базовый адрес — https://app.moyskladdemo.xyz.
API позволяет агенту поставщика загружать Excel/CSV и проверять результат обработки. Ключ связан с Telegram ID его владельца. Агент получает доступ к документам этого пользователя.
Подключение
- Откройте бота ТОВАРНО, нажмите «Старт», выберите загрузку документов и роль поставщика или сотрудника.
- Откройте личный кабинет через Mini App или персональную ссылку из бота.
- Перейдите в раздел API, задайте понятное название ключа и создайте ключ.
- Сохраните показанный ключ в секретах своей системы. В кабинете он показывается один раз.
- При прекращении интеграции отзовите ключ в кабинете.
Передавайте ключ только в заголовке Authorization: Bearer …. Ключ хранится на стороне вашего сервера или агента. В клиентскую веб-страницу и в URL его помещать не следует.
Формат документа
Загрузка принимает файлы XLSX или CSV размером от 1 байта до 100 МиБ — 104 857 600 байт. Исходный файл сохраняется в закрытом хранилище и появляется в журнале с именем файла, автором, Telegram ID, временем и источником.
Для автоматического проведения прямых отгрузок текущая версия полностью обрабатывает таблицу до 20 строк данных. Более крупный документ принимается в журнал и требует проверки перед проведением.
| Колонка |
Содержимое |
| Дата |
Дата отгрузки в формате ГГГГ-ММ-ДД |
| Заказ |
Номер заказа поставщика |
| Площадка |
Например, Ozon или Wildberries |
| Артикул |
Наш код товара или артикул из каталога МоегоСклада |
| Наименование |
Название товара |
| Количество |
Положительное целое число |
| Закупка ₽/шт |
Положительная закупочная цена за единицу в рублях |
| Продажа ₽/шт |
Положительная продажная цена за единицу в рублях |
Заголовки должны быть в первой строке. В XLSX используется первый читаемый лист. Для CSV удобен UTF-8 с BOM и разделитель ;. Формулы в таблице требуют проверки.
Обработка
После приёма запускается проверка товаров и документов. Точный артикул или уникальное точное название сопоставляются с каталогом. Сокращения поставщика используются после явного подтверждения соответствия. При неоднозначности документ получает статус needs_review, а бот присылает уведомление.
Уточнить обозначение можно в боте сообщением Уточнить N: название поставщика = НАШ-АРТИКУЛ, где N — номер записи журнала. Для нескольких неизвестных товаров отправляйте уточнения последовательно. Подтверждённые соответствия сохраняются для данного поставщика.
Успешное проведение создаёт приёмки и отгрузки в МоёмСкладе на отдельном складе прямых отгрузок. Закупка образует обязательство перед поставщиком, продажа — задолженность покупателя. Фактические оплаты учитываются отдельными операциями.
| Статус |
Значение |
received |
Файл сохранён, обработка ещё продолжается |
needs_review |
Нужны уточнение товара, корректировка таблицы или проверка ошибки |
posted |
Приёмки и отгрузки проведены в МоёмСкладе |
Голосовые пояснения доступны через Telegram-бота. Передача аудио через этот REST API пока не предусмотрена.
Загрузка через агента
POST /api/v1/documents
Тело запроса содержит исходные байты файла. Обязательные заголовки приведены ниже.
| Заголовок |
Значение |
Authorization |
Bearer и персональный ключ API |
Content-Type |
application/octet-stream |
Content-Length |
Точный размер тела запроса в байтах |
X-File-Name |
Имя файла, закодированное percent-encoding в UTF-8 |
Idempotency-Key |
Уникальный идентификатор вашей отправки, 1–100 печатных ASCII-символов |
X-Content-SHA256 |
SHA-256 исходного файла, 64 строчных шестнадцатеричных символа |
Пример для Bash. Переменная TOVARNO_API_KEY должна быть заранее передана средой исполнения из секретов вашей системы.
file='./supplier-report.xlsx'
filename=$(python3 -c 'import pathlib,sys,urllib.parse; print(urllib.parse.quote(pathlib.Path(sys.argv[1]).name, safe=""))' "$file")
checksum=$(python3 -c 'import hashlib,sys; print(hashlib.file_digest(open(sys.argv[1],"rb"),"sha256").hexdigest())' "$file")
curl --fail-with-body --silent --show-error \
'https://app.moyskladdemo.xyz/api/v1/documents' \
-H "Authorization: Bearer ${TOVARNO_API_KEY}" \
-H 'Content-Type: application/octet-stream' \
-H "X-File-Name: ${filename}" \
-H "X-Content-SHA256: ${checksum}" \
-H 'Idempotency-Key: warehouse-20261111-report-001' \
--data-binary "@${file}"
Пример ответа HTTP 201.
{
"id": 42,
"filename": "supplier-report.xlsx",
"status": "received",
"size": 5821
}
Номер, имя и размер выше приведены как пример. Сохраните реальный id из ответа и проверяйте состояние через метод документа.
Повтор запроса
При потере ответа повторите запрос с тем же Idempotency-Key, тем же именем, размером и содержимым файла. API вернёт HTTP 200 и тот же id, с полем reused: true. Поле status такого ответа отражает приём файла, актуальный результат проведения получите отдельным GET-запросом.
Если для уже использованного идентификатора изменились имя, размер или контрольная сумма, сервер вернёт HTTP 409. Для новой версии файла используйте новый идентификатор. Запрос с неверной контрольной суммой отклоняется с HTTP 422.
При HTTP 5xx или сетевой ошибке используйте ограниченные повторы с задержкой и тем же идентификатором отправки. При HTTP 400, 401, 409, 413, 415 или 422 сначала устраните указанную причину.
Статус документа
GET /api/v1/documents/{id}
document_id=42
curl --fail-with-body --silent --show-error \
"https://app.moyskladdemo.xyz/api/v1/documents/${document_id}" \
-H "Authorization: Bearer ${TOVARNO_API_KEY}"
Ответ содержит document — поля записи журнала — и processing — результат обработки или null, пока он отсутствует. Поле document.status содержит актуальный статус. Результат обработки может включать errors, unmatched, totals и ссылки на созданные документы.
Для опроса достаточно интервала 5–10 секунд с ограничением числа попыток. Статус needs_review требует действия человека или исправленного файла. Статус posted завершает проведение.
Список документов
GET /api/v1/documents
curl --fail-with-body --silent --show-error \
'https://app.moyskladdemo.xyz/api/v1/documents' \
-H "Authorization: Bearer ${TOVARNO_API_KEY}"
Ответ — { "entries": [...], "counts": {...}, "scope": "own" }. Возвращаются последние 100 записей пользователя, которому принадлежит ключ. API не возвращает закрытые пути хранения.
Ошибки
| HTTP |
Причина и действие |
| 400 |
Некорректные поля или роль не выбрана. Проверьте заголовки и выберите роль в боте |
| 401 |
Ключ отсутствует, неверен или отозван. Проверьте секрет |
| 404 |
Документ отсутствует или недоступен данному пользователю |
| 409 |
Повторный идентификатор отправки использован с другим файлом |
| 411 |
Отсутствует допустимый Content-Length |
| 413 |
Размер файла выходит за пределы допустимого |
| 415 |
Неверный Content-Type |
| 422 |
Контрольная сумма не совпала с полученными байтами |
| 503 |
Сервис временно недоступен |
| 507 |
Недостаточно свободного места на сервере |
Управление ключами из кабинета
Эти методы используются интерфейсом кабинета с браузерной сессией или подписанными Telegram initData. Тело — JSON. Доступ ограничен ключами текущего пользователя.
| Метод |
Тело |
Ответ |
POST /api/keys/list |
{} |
{keys:[...]} |
POST /api/keys/create |
{"name":"Агент склада"} |
HTTP 201 и поля id,name,prefix,created_at,key |
POST /api/keys/revoke |
{"id":7} |
{"revoked":true} |
В списке видны название, безопасный префикс и времена создания, последнего использования и отзыва. Времена передаются в секундах Unix. Полное значение ключа возвращается только при создании. На сервере хранится его хеш.
Ключ авторизует загрузку файлов и чтение собственных записей через REST. Уточнения товаров и назначение имён отправителям выполняются через кабинет и Telegram с соответствующими правами.