Ошибки и лимиты
Формат ошибки, коды, лимиты запросов и правильная стратегия повторов.
Esta página aún no está traducida a tu idioma — mostramos el original.
Любая ошибка API возвращается одинаково — HTTP-кодом и телом:
{
"error": {
"code": "insufficient_balance",
"message": "Недостаточно средств для открытия позиции",
"details": { "required": "120.00", "available": "84.31" },
"requestId": "req_01J8X…"
}
}Коды
| HTTP | code |
Что делать |
|---|---|---|
| 400 | invalid_request |
Починить тело запроса; повтор не поможет |
| 401 | unauthorized |
Проверить токен и его срок |
| 401 | bad_signature |
Пересчитать HMAC от сырого тела |
| 403 | scope_required |
У ключа нет нужного права |
| 404 | not_found |
Проверить идентификатор |
| 409 | duplicate_request |
Это не ошибка: requestId уже обработан |
| 422 | insufficient_balance |
Уменьшить объём |
| 422 | symbol_not_tradable |
Инструмент недоступен для торговли |
| 429 | rate_limited |
Подождать Retry-After, затем повторить |
| 502 | exchange_unavailable |
Биржа не отвечает — повторить с задержкой |
| 503 | maintenance |
Плановые работы, см. Retry-After |
Повторы
async function withRetry<T>(fn: () => Promise<T>, tries = 5): Promise<T> {
let lastError: unknown;
for (let i = 0; i < tries; i++) {
try {
return await fn();
} catch (e) {
lastError = e;
const status = (e as { status?: number }).status ?? 0;
if (status && status < 500 && status !== 429) throw e; // чинить, а не повторять
const base = Math.min(1000 * 2 ** i, 30_000);
await new Promise((r) => setTimeout(r, base * (0.7 + Math.random() * 0.6)));
}
}
throw lastError;
}¿Te sirvió esta página?
Gracias — lo leemos todo.