Быстрый старт
Цель: первый успешный ответ 200 от публичного эндпоинта, затем — один подписанный запрос.
Шаг 1. Ключи
- Откройте Настройки в панели Cobrex.
- Создайте или скопируйте секрет API (используется для HMAC-подписи).
- Запишите ваш User ID (
u-…) и при работе с мерчантом — Merchant ID (m-…).
Шаг 2. Публичный запрос без подписи
Список сетей и активов не требует заголовков авторизации:
GET https://api.cobrex.com/public/assets
Accept: application/json
Ожидаемый ответ: массив объектов с полями network, asset, лимитами и комиссиями. Если это работает, DNS и TLS в порядке.
Шаг 3. Подписанный запрос
Любой «защищённый» метод нуждается в заголовках:
| Заголовок | Назначение |
|---|---|
x-uid или x-mid | Кто инициирует запрос: пользователь или мерчант |
x-timestamp | Текущее время в секундах (Unix time) |
x-signature | HMAC-SHA256 от канонической строки (см. ниже) |
Каноническая строка для подписи:
- Возьмите полный URL запроса (схема, хост, путь и query-строка как в реальном запросе).
- Добавьте перевод строки
\n. - Добавьте то же значение, что пойдёт в
x-timestamp(в секундах). - Если есть тело (обычно
POST/PUT/PATCHс JSON): перевод строки\nи сырое тело байт-в-байт как отправляете на сервер (после сериализации JSON).
Для GET без тела после timestamp ничего не добавляйте (без третьей строки и без лишнего \n в конце).
Вычислите:
x-signature = HMAC-SHA256( каноническая_строка , api_secret )
в виде hex-строки (нижний регистр hex — как в примерах ниже).
Мини-пример на JavaScript (Node.js)
Установка зависимости не обязательна: используйте встроенный crypto.
const crypto = require('crypto');
const apiSecret = process.env.COBREX_API_SECRET;
const baseUrl = 'https://api.cobrex.com/accounts';
const timestampSec = Math.floor(Date.now() / 1000); // секунды, не миллисекунды
const canonical = `${baseUrl}\n${timestampSec}`;
const signature = crypto.createHmac('sha256', apiSecret).update(canonical).digest('hex');
// Далее подставьте signature и timestampSec в заголовки x-signature и x-timestamp
Для POST с телом:
const bodyRaw = JSON.stringify({ asset: ['USDT', 'TRX'], network: 'TRON', client: 'demo' });
const url = 'https://api.cobrex.com/wallet';
const canonical = `${url}\n${timestampSec}\n${bodyRaw}`;
Подробности, краевые случаи и проверка webhooks — на странице Авторизация и подпись.
Шаг 4. Проверьте ответ
- 2xx — запрос обработан (для многих методов успех это 200).
- 4xx — ошибка клиента (подпись, формат, права, не найдено).
- 5xx — ошибка на стороне сервиса; имеет смысл повтор с backoff.
Дальше: общие методы (GET /accounts, балансы) или сценарии платежей / выплат.