HW agent API 2.14.1

Сервер, CRM, бот

Через облако

Тот же API агента — с вашего сервера, без браузера на месте: облако hw-cloud передаёт запрос кассе по её исходящему соединению (касса за NAT, входящие порты не нужны). Путь, метод, тело и ответ — как у агента, в том числе картинки и PDF.

Адрес и ключ

Базовый адрес — https://cloud.hw-connector.ru/agent вместо http://localhost:7790, остальное без изменений. Вместо токена агента — ключ API аккаунта X-Api-Key: hwk_… из кабинета hw-connector.ru (раздел «Облако»), касса — X-Device-Id.

curl
# локально
curl -X POST 'http://localhost:7790/api/v1/registers/1/receipts' \
  -H 'Idempotency-Key: order-123' -H 'Prefer: wait=30' \
  -H 'Content-Type: application/json' --data @receipt.json

# через облако: другой адрес и два заголовка
curl -X POST 'https://cloud.hw-connector.ru/agent/api/v1/registers/1/receipts' \
  -H 'X-Api-Key: hwk_…' -H 'X-Device-Id: 42' \
  -H 'Idempotency-Key: order-123' -H 'Prefer: wait=30' \
  -H 'Content-Type: application/json' --data @receipt.json
JavaScript
// JS SDK агента (на сервере, Node 18+): другой адрес и два заголовка через свой fetch
const hw = new HwConnector({
  baseUrl: 'https://cloud.hw-connector.ru/agent',
  fetch: (url, init = {}) => fetch(url, { ...init, headers: { ...init.headers, 'X-Api-Key': 'hwk_…', 'X-Device-Id': '42' } }),
});
const devices = await hw.devices();   // как с агентом на этом компьютере
  • X-Device-Id — номер кассы из GET https://cloud.hw-connector.ru/api/v1/devices (тот же X-Api-Key). У аккаунта одна касса — можно не передавать; вместо него можно X-Device-Machine-Id — постоянный номер установки агента (GET /api/v1/system/computer). Номер кассы возвращается в ответном X-Device-Id.
  • Касса чужого аккаунта — 404. Ключ агента (Authorization) облако агенту не передаёт: агент вызывает себя своим токеном.
  • На кассе команды из облака можно выключить (hw.cloud.allow-commands: false) — тогда агент отвечает 403 COMMANDS_DISABLED.

Что передаётся

МетодыGET, POST, PUT, DELETE, PATCH; строка запроса — как есть
ТелоJSON или файл, до 10 МБ (больше — 413)
Заголовки агентуPrefer, Accept-Language, Content-Type, Accept, Idempotency-Key (с приставкой cloud:)
Ответкод и тело агента как есть (картинки, PDF тоже); заголовки Content-Type, Location (/api/v1/… → /agent/api/v1/…), Retry-After, Preference-Applied, Content-Disposition
Закрыто/api/v1/setup/** — 403; пути с .., // — 400
Лимит600 запросов в минуту на аккаунт, сверх — 429 и Retry-After

Ожидание и повтор

  • Облако ждёт ответ кассы до 60 с. Prefer: wait=N передаётся агенту, но не больше 55 с: не успела операция — 202 и Location: /agent/api/v1/operations/{id}, итог спросите через тот же прокси. Без Prefer — как локально.
  • POST, PUT, DELETE, PATCH без Idempotency-Key — облако создаёт ключ px-… и возвращает его в ответном Idempotency-Key (и при ошибке). После 504 или 502 повторите запрос с этим ключом — операция не выполнится дважды.
  • Касса не на связи — сразу 503: запросы не копятся (печать через час никому не нужна). Гарантированная доставка чека «когда касса появится» — POST https://cloud.hw-connector.ru/api/v1/receipts (очередь, вебхук).
  • Любой метод, файлы и заголовки — агент 2.14.0 и новее; старые агенты принимают через облако только GET и POST с JSON, остальное — 501 AGENT_OUTDATED.

Ошибки облака

Ответы облака отличаются от ответов агента заголовком X-Hw-Proxy-Error (у ответов агента его нет); тело — problem+json с тем же code.

HTTPX-Hw-Proxy-ErrorКогда и что делать
401UNAUTHORIZEDНет или неверный X-Api-Key
400DEVICE_REQUIREDУ аккаунта несколько касс, а X-Device-Id не передан
400BAD_DEVICE_IDX-Device-Id — не число
400BAD_PATHПуть с «..», «//» или закодированными косыми чертами
404DEVICE_NOT_FOUNDКасса не найдена или принадлежит другому аккаунту
403SETUP_FORBIDDEN/api/v1/setup/** через облако закрыт — настройка только на кассе
405METHOD_NOT_ALLOWEDМетод кроме GET, POST, PUT, DELETE, PATCH
413BODY_TOO_LARGEТело больше 10 МБ
429RATE_LIMITEDЛимит запросов аккаунта — подождите Retry-After
501AGENT_OUTDATEDАгент на кассе старше 2.14.0: через облако ему доступны только GET и POST с JSON
503NOT_CONNECTEDКасса не на связи с облаком; Retry-After — когда повторить
504TIMEOUTКасса не ответила за 60 с — повторите с тем же Idempotency-Key или спросите /operations/{id}
502CONNECTION_LOSTСвязь с кассой оборвалась посреди запроса — как 504
502RELAY_ERRORОшибка облака при доставке — как 504