Tikin · Docs
Conceptos

Errores

Cada error trae código de máquina, mensaje humano y doc_url. La tabla completa.

La forma de todo error

{
  "error": {
    "code": "monthly_limit_exceeded",
    "message": "El cupo del mes se agotó: llevabas $1.000.000 y renueva el 1 de octubre.",
    "doc_url": "https://docs.tikin.is/conceptos/errores#monthly_limit_exceeded",
    "details": { "used": "100000000", "limit": "100000000", "resets_at": "2026-10-01T00:00:00Z" }
  }
}
  • code es para tu código: estable, en inglés, se puede hacer switch sobre él.
  • message es para un humano: dice qué pasó con números, no "invalid request".
  • details trae los datos de la regla cuando aplica (cuánto llevabas, cuándo renueva).
  • doc_url apunta al ancla de ese código en esta página (/conceptos/errores#<code>) — el link del error resuelve de verdad.

Tikin-Request-Id

Toda respuesta del API — éxito o error — trae el header Tikin-Request-Id: el id único de ese request. Guárdalo en tus logs junto a cada llamada, y cítalo al escribir a soporte: con él encontramos tu request en segundos, sin arqueología. Un reporte sin request id es una búsqueda; con él, es un lookup.

La tabla

HTTPSignificaQué haces
400La forma del pedido es inválida — falta un campo, decimales de más, origen==destinoArregla el request; reintentar igual dará igual
401Token ausente, inválido o revocadoRevisa la credencial (tk_live_…)
403authority_insufficient — el rol del miembro en ESA cuenta no puede hacer estoNo es el token: es el permiso dentro de la cuenta
404El recurso no existe o no es de tu tenant — misma respuesta a propósitoNo se filtra ni la existencia de lo ajeno
409La misma Idempotency-Key con otro cuerpo, o una transición ilegal (disparar un lote que no está ready)Es un bug de tu lado: no reintentes, investiga
422La regla de negocio dijo no — el code dice cuálLee el código (tabla abajo); reintentar sin cambiar la realidad dará lo mismo
503No se pudo saber — el libro no contestóReintenta con la misma llave; jamás te inventamos un éxito ni un cero

Los códigos del 422

codeLa regla
insufficient_fundsNo alcanza — contra el disponible, no el total (lo retenido no se gasta)
capability_cannot_sendLa cuenta no declaró verificación: recibe, pero no saca
below_minimumBajo el mínimo por operación
above_per_operation_limitSobre el tope por operación
monthly_limit_exceededEl cupo del mes se agotó — details dice cuánto llevaba y cuándo renueva

El catálogo, código por código

Cada code tiene su ancla aquí — es a donde apunta el doc_url del error.

missing_field

400 — falta un campo obligatorio en el cuerpo; details.field dice cuál.

invalid_field

400 — un campo tiene forma inválida (decimales en un monto, alias mal formado); details{field, reason}.

missing_query

400 — al lookup le falta el criterio: exactamente UNO de alias o phone; los dos, o ninguno, cae aquí.

missing_idempotency_key

400 — el endpoint mueve dinero y el header Idempotency-Key no vino. No es opcional: genera un UUID y guárdalo ANTES de mandar.

idempotency_key_reused

409 — la misma llave con OTRO cuerpo (bytes de archivos incluidos). Eso no es un reintento, es un bug tuyo: investiga antes de tocar nada.

invalid_state

409 — la transición no es legal desde el estado actual (disparar un lote que no está ready, cancelar un payout in_progress); details{current, allowed[]}.

unauthorized

401 — token ausente, inválido o revocado. Revisa la credencial tk_live_….

insufficient_scope

401 — el token es válido pero no tiene el scope que este endpoint exige (lookup, transfers, payouts…). Pide un token con el scope justo.

authority_insufficient

403 — el rol del miembro en ESA cuenta no puede hacer esto. No es el token: es el permiso dentro de la cuenta.

not_found

404 — el recurso no existe o no es de tu tenant: misma respuesta a propósito, no se filtra ni la existencia de lo ajeno.

alias_taken

422 — ese alias ya es de otra cuenta en tu tenant. El alias es único dentro del tenant.

alias_reserved

422 — el alias está en la lista reservada de la plataforma (marcas, términos protegidos). Elige otro.

alias_in_quarantine

422 — el alias fue liberado hace menos de 90 días y está en cuarentena para que nadie herede pagos ajenos. Espera o elige otro.

insufficient_funds

422 — no alcanza, contra el disponible (lo retenido no se gasta); details{available, requested}.

capability_cannot_send

422 — la cuenta no declaró verificación: recibe, pero no saca. Declara el KYC con PUT /v1/accounts/{account_id}/verification.

below_minimum

422 — el monto está bajo el mínimo por operación; details trae el mínimo.

above_per_operation_limit

422 — el monto supera el tope por operación; details trae el tope.

monthly_limit_exceeded

422 — el cupo del mes se agotó; details{used, limit, resets_at}.

rate_limited

429 — demasiado rápido. Respeta Retry-After (segundos) y reintenta con backoff + jitter.

ledger_unavailable

503 — el libro no contestó: no se supo. Reintenta con la misma Idempotency-Key; jamás te inventamos un éxito ni un cero.

La regla de oro

4xx = el problema es del pedido (arréglalo). 503 = el problema fue nuestro o del camino (reintenta con la misma llave). Nunca trates un 422 como transitorio: la regla va a decir que no otra vez.

On this page