Подпись запросов
Постоянно получаю INVALID_SIGNATURE — что не так?
Постоянно получаю INVALID_SIGNATURE — что не так?
- Сериализуйте JSON один раз, подпишите эту строку и отправьте именно её.
- Не используйте библиотеку, которая повторно сериализует объект перед отправкой (другой порядок ключей или пробелы сломают подпись).
- Сообщение для HMAC — это
{timestamp}.{raw_body}(timestamp, точка, тело). - Ключ HMAC —
api_secret, результат — hex в нижнем регистре.
Как подписывать GET-запросы и запросы без тела?
Как подписывать GET-запросы и запросы без тела?
raw_body — пустая строка (не {} и не null).
Тогда сообщение для подписи получается вида {timestamp}. (timestamp, затем точка и ничего
после неё).Передаётся ли api_secret по сети?
Передаётся ли api_secret по сети?
api_secret участвует только в вычислении X-Signature на вашей стороне и никогда
не отправляется в заголовках. Платформа хранит секрет в зашифрованном виде и проверяет
подпись на сервере. Не используйте устаревший заголовок X-Api-Secret.Время и часы
Что означает TIMESTAMP_SKEW?
Что означает TIMESTAMP_SKEW?
X-Timestamp вышел за пределы ±300 секунд от времени сервера платформы. Обычно это
рассинхронизация часов.- Включите синхронизацию по NTP на сервере обменника.
- Берите
X-Timestampнепосредственно перед отправкой запроса, а не заранее. - Время — в секундах Unix (не в миллисекундах).
В каких единицах X-Timestamp?
В каких единицах X-Timestamp?
1782000000). Распространённая ошибка — прислать
миллисекунды; такой timestamp окажется далеко в будущем и вернёт TIMESTAMP_SKEW.Идемпотентность и дубликаты
Как не создать дубликат при сетевом сбое?
Как не создать дубликат при сетевом сбое?
X-Idempotency-Key: <uuid>. Повтор того же
запроса с тем же ключом и тем же телом вернёт первый результат — без дубликата и без 409.
Ключ хранится 24 часа и изолирован в пределах вашего сайта.В чём разница между order_id и X-Idempotency-Key?
В чём разница между order_id и X-Idempotency-Key?
order_id — ваш бизнес-идентификатор заявки; по нему ресурс ищется позже через
GET .../by-order-id/{order_id}. По умолчанию он строго уникален в рамках сайта — повтор
вернёт 409 DUPLICATE_ORDER_ID. X-Idempotency-Key — технический ключ безопасного повтора
одного и того же HTTP-запроса. Используйте оба: order_id для связи с заявкой,
X-Idempotency-Key для надёжных ретраев. Подробнее — Идемпотентность.Получаю IDEMPOTENCY_CONFLICT, хотя ключ новый — почему?
Получаю IDEMPOTENCY_CONFLICT, хотя ключ новый — почему?
X-Idempotency-Key уже использовался, но с другим
телом запроса. Сгенерируйте новый UUID для нового тела, либо повторяйте ровно то же тело,
что и в первый раз.Суммы и числа
Почему суммы — строки, а не числа?
Почему суммы — строки, а не числа?
"100.50"). Числа с плавающей точкой теряют точность
(0.1 + 0.2 !== 0.3), что недопустимо для финансов. Передавайте и читайте суммы как строки;
на своей стороне считайте через decimal-библиотеку, а не через float/number.Что значит AMOUNT_TOO_MANY_DECIMALS?
Что значит AMOUNT_TOO_MANY_DECIMALS?
asset.decimals).
Например, USDT_TRC20 — 6 знаков, BTC/LTC — 8. Округлите сумму до точности актива
(значение decimals есть в GET /v1/public/assets).Где взять минимальные суммы и точность актива?
Где взять минимальные суммы и точность актива?
GET /v1/public/assets: поля minDeposit, minPayout, decimals. Не хардкодьте —
набор активов и лимиты зависят от настроек инстанса.Сети, адреса и memo (TON)
Зачем для TON нужен memo/comment?
Зачем для TON нужен memo/comment?
Получаю INVALID_ADDRESS / INVALID_MEMO — что проверить?
Получаю INVALID_ADDRESS / INVALID_MEMO — что проверить?
code из GET /v1/public/networks), а memo — формату memo-based сети.
Не подставляйте адрес одной сети в операцию другой сети.Как узнать, какие сети и активы включены?
Как узнать, какие сети и активы включены?
GET /v1/public/networks — список включённых сетей с архетипом и числом подтверждений;
GET /v1/public/assets — активы с привязкой к сети, точностью и лимитами. Эти справочники
меняются редко — кэшируйте их.Webhooks, тестирование и polling
Как протестировать приём webhooks?
Как протестировать приём webhooks?
POST /v1/public/webhooks/test — платформа поставит в очередь тестовый webhook
(X-Event-Type: webhook.test) на ваш callback_url с настоящей подписью. Так вы проверите,
что endpoint доступен и корректно валидирует X-Signature, ещё до первой реальной операции.
Переотправить уже сгенерированное событие можно через POST /v1/public/webhooks/resend/{event_id}
(по X-Event-Id).Webhooks или polling — что использовать?
Webhooks или polling — что использовать?
GET .../{uuid} или .../by-order-id/{order_id}) держите как редкий запасной механизм
на случай пропущенного webhook — не чаще раза в несколько секунд, иначе упрётесь в
лимиты запросов.Как проверять подпись входящего webhook?
Как проверять подпись входящего webhook?
X-Signature, X-Timestamp, X-Event-Type, X-Event-Id.
Подпись — HMAC-SHA256 от сырого тела webhook с вашим callback_secret. Сверяйте её и
используйте X-Event-Id для идемпотентной обработки на своей стороне. Детали — на странице
Webhooks.Доступ: IP-whitelist и ключи
Есть ли отдельная sandbox/тестовая среда?
Есть ли отдельная sandbox/тестовая среда?
POST /v1/public/webhooks/test.Получаю IP_NOT_WHITELISTED
Получаю IP_NOT_WHITELISTED
Как ротировать API-ключ без простоя?
Как ротировать API-ключ без простоя?
api_id / api_secret, убедитесь, что запросы проходят, и только потом отзовите старый
ключ. api_secret показывается один раз при создании — сохраните его сразу в надёжном
месте. Запросы старым отозванным ключом получат API_KEY_REVOKED.Что делать, если api_secret скомпрометирован?
Что делать, если api_secret скомпрометирован?
Общее
На что ориентироваться при обработке ошибок?
На что ориентироваться при обработке ошибок?
error.code — он стабилен. error.message предназначен для людей и может меняться.
Полный каталог кодов с рекомендациями по устранению — на странице Ошибки.Что такое traceId в ответе и зачем он нужен?
Что такое traceId в ответе и зачем он нужен?
error.traceId — идентификатор запроса в логах инстанса. При обращении в поддержку укажите
его: по traceId оператор быстро найдёт конкретный запрос. Для 5xx это основной способ
диагностики, так как внутренний message в production скрыт.Базовый URL — какой он?
Базовый URL — какой он?
https://wallet.your-exchange.com). Все эндпоинты живут под /v1/public/*. Подробнее —
Окружения и справочники.