Saltar al contenido principal

Errores

La API devuelve errores en formato application/problem+json (RFC 9457). Todo error comparte una estructura estable y predecible:

{
"type": "https://docs.skipo.com/errors/unauthorized",
"title": "Unauthorized",
"status": 401,
"detail": "This operation requires a signed request (X-API-Key header + signed JWT).",
"code": "unauthorized",
"retryable": false,
"instance": "/v2/withdrawals"
}

Campos

CampoDescripción
typeURI estable que documenta el error (apunta a docs.skipo.com/errors/{code}).
titleResumen legible del tipo de error.
statusCódigo HTTP.
detailDescripción específica de esta ocurrencia.
codeCódigo estable legible por máquina — úsalo para ramificar tu lógica.
retryabletrue si reintentar la misma petición puede tener éxito.
instanceRuta de la petición que falló.
reasonSub-código estable presente en algunos errores (p. ej. varios 422 unprocessable) que precisa qué regla de negocio falló — más fino que code. Ramificable igual que code. Ausente cuando no aplica.
consejo

Ramifica tu manejo de errores sobre code (y sobre reason cuando esté presente), nunca sobre title ni detail (que pueden cambiar de redacción o traducirse). code y reason son contratos estables.

Un mismo code puede cubrir varias causas; reason las distingue. Por ejemplo, un 422 unprocessable al pedir un precio sobre un mercado cerrado:

{
"type": "https://docs.skipo.com/errors/unprocessable",
"title": "Unprocessable request",
"status": 422,
"code": "unprocessable",
"reason": "MARKET_CLOSED",
"detail": "Market 'NVDASPV-CLP' is closed right now.",
"retryable": false,
"instance": "/v2/markets/NVDASPV-CLP/price?side=BUY"
}

Códigos comunes

codeHTTP¿Reintentable?
unauthorized401no
invalid_signature401no
insufficient_scope403no
not_found404no
validation_error400no
unprocessable422no
rate_limited429
internal_error500

El catálogo completo de errores documenta los 22 códigos, cada uno con su propia página en docs.skipo.com/errors/{code} — la misma URI que aparece en el campo type de la respuesta.