Documentación
Errores de la API
Todo error de la API v1 trae un código estable, un estado HTTP y una instrucción de reintento (retry); la lista de códigos es abierta, así que tu código debe tratar un código desconocido por su estado HTTP.
Cómo leer un error
Todos los errores de la API usan el mismo sobre, en REST y en MCP. Los códigos son la parte estable; el texto de message está en español, es para personas y puede cambiar.
{ "ok": false, "status": 400, "request_id": "req_3z6y1wUd", "error": { "type": "invalid_request_error", "code": "invalid_amount_format", "message": "«abc» no es un monto válido. Usa un número positivo como texto con hasta 6 decimales, por ejemplo \"4.80\".", "param": "amount", "retry": "after_fixing", "retry_after_ms": null, "outcome_unknown": false }}| Campo | Qué es |
|---|---|
| `ok` | Siempre false en un error. |
| `status` | El estado HTTP de la respuesta. |
| `request_id` | Identificador de la petición; también va en la cabecera Request-Id. |
| `error.type` | La familia del error (autenticación, permiso, límite de tasa, idempotencia, petición, servicio). |
| `error.code` | El código estable. |
| `error.param` | El campo culpable, o null. |
| `error.retry` | Qué hacer con la misma intención: no, as_is o after_fixing. |
| `error.retry_after_ms` | Espera mínima antes de repetir, o null. |
| `error.outcome_unknown` | true si el pago pudo haberse hecho aunque la llamada falló. |
Qué significa retry
no: No repitas la petición: no va a funcionar sola.as_is: Repite la MISMA petición, con la misma llave de idempotencia, pasadoRetry-Aftersi lo hay.after_fixing: Corrige primero lo que dicenmessageyparam, y entonces repite.
La lista de códigos es abierta
Pueden aparecer códigos nuevos sin cambiar la versión de la API. Tu código no debe usar un switch cerrado sobre error.code: trata un código desconocido por su estado HTTP y por error.retry.
function handleError(status: number, error: { code: string; retry: string }) {
switch (error.code) {
case 'rate_limited':
return waitAndRetrySameRequest();
default:
// Código nuevo o desconocido: decide por error.retry y por el estado HTTP.
return error.retry === 'as_is' ? retrySameRequest() : showMessage();
}
}Qué hacer con un código que no conoces
- 400, 404, 409, 413 y 422: no repitas solo; muestra el mensaje o escala a una persona.
- 401 y 403: revisa la llave y los permisos.
- 429 y 5xx: repite la misma petición con la misma llave de idempotencia, con espera creciente.
400 · La petición está mal escrita
Hoy hay 53 códigos, agrupados por estado HTTP.
invalid_json
El cuerpo no es JSON válido.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request
invalid_request
La petición tiene un valor inválido; param dice cual.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
missing_parameter
Falta un campo obligatorio; param dice cual.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
unknown_parameter
Se envio un campo que la API no conoce (los esquemas no admiten campos extra).
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_amount_format
El monto no es un texto decimal válido (hasta 12 enteros y 6 decimales, sin signo ni notacion cientifica).
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
amount_not_positive
El monto debe ser mayor que cero.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
unsupported_currency
La moneda no esta soportada (en esta fase solo usdc).
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_destination
El destino no es un dominio, comodín ni dirección 0x válidos.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
resource_required
Un destino que es un dominio exige resource (la URL exacta que se quiere comprar).
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
resource_not_allowed_for_address
Un destino que es una dirección 0x es una transferencia: no lleva resource.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_resource
resource debe ser https, sin credenciales, sin puerto extrano, de hasta 2048 caracteres y con cuerpo solo en POST.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
resource_host_mismatch
La URL de resource debe estar en el mismo dominio que destination.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_memo
memo debe ser texto de hasta 280 caracteres.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_client_reference
client_reference debe ser texto de hasta 64 caracteres.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
missing_idempotency_key
Falta la cabecera Idempotency-Key: es obligatoria para crear un pago.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_idempotency_key
La llave de idempotencia debe tener de 16 a 128 caracteres [A-Za-z0-9_-] (un UUID sirve) y no ser un valor de juguete.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_pagination
limit (1-50), starting_after o ending_before inválidos.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_filter
Un filtro de la lista tiene un valor inválido.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
unsupported_version
La versión de Nouron-Version no existe. Quita la cabecera para usar la fijada a tu llave.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
invalid_policy
Las reglas enviadas tienen un valor mal formado; param dice cual.
HTTP 400 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
401 · No sabemos quién llama
missing_api_key
Falta la cabecera Authorization: Bearer <api_key>.
HTTP 401 · tipo authentication_error · retry: no · siguiente: verify_key
invalid_api_key
La llave no es válida: revisa que este completa, sin espacios ni saltos de línea, y que empiece por np_test_ o np_live_.
HTTP 401 · tipo authentication_error · retry: no · siguiente: verify_key
api_key_revoked
La llave fue revocada. Pide una nueva al dueño en Llaves de API.
HTTP 401 · tipo authentication_error · retry: no · siguiente: verify_key
api_key_expired
La llave venció. Rota la llave en Llaves de API.
HTTP 401 · tipo authentication_error · retry: no · siguiente: verify_key
403 · Sin permiso
permission_denied
La llave no tiene permiso para esta operación.
HTTP 403 · tipo permission_error · retry: no · siguiente: ask_owner_to_review
wrong_key_type
Esta operación exige otro tipo de llave (agente u dueño). La llave de dueño nunca se pega en un agente.
HTTP 403 · tipo permission_error · retry: no · siguiente: use_other_key_type
read_only_key
La llave es de solo lectura y esta operación escribe.
HTTP 403 · tipo permission_error · retry: no · siguiente: use_other_key_type
wrong_environment
El recurso o la operación pertenece al otro entorno (prueba o real).
HTTP 403 · tipo permission_error · retry: no · siguiente: verify_key
404 · No existe
not_found
No existe ese recurso en este entorno. Con una llave real, las rutas de simulación (/v1/test/*) tampoco existen.
HTTP 404 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
409 · Choca con el estado actual
idempotency_conflict
Reusaste una llave de idempotencia con una petición distinta; changed_fields dice que cambio.
HTTP 409 · tipo idempotency_error · retry: no · siguiente: new_attempt_needs_new_key · param
idempotency_key_in_use
Otra petición con la misma llave sigue en curso. Reintenta igual pasado Retry-After.
HTTP 409 · tipo idempotency_error · retry: sí · siguiente: retry_same_idempotency_key · Retry-After
cancel_too_late
El pago ya fue enviado (processing) o liquidado: no se puede cancelar.
HTTP 409 · tipo invalid_request_error · retry: no · siguiente: check_status_later
spend_not_cancellable
El pago ya termino (declined, failed, expired): no hay nada que cancelar.
HTTP 409 · tipo invalid_request_error · retry: no · siguiente: none
policy_version_conflict
Las reglas cambiaron desde que las leiste (expected_version no coincide). Vuelve a leerlas.
HTTP 409 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
agent_name_taken
Ya existe un agente activo con ese nombre.
HTTP 409 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
agent_not_archivable
El agente tiene pagos retenidos o en curso: espera a que se liquiden, venzan o cancelen.
HTTP 409 · tipo invalid_request_error · retry: no · siguiente: check_status_later
413 · Cuerpo demasiado grande
payload_too_large
El cuerpo supera el máximo (16 KiB).
HTTP 413 · tipo invalid_request_error · retry: no · siguiente: fix_request
422 · Una regla del producto no la acepta
agent_limit_reached
Se alcanzo el máximo de agentes activos (5 en prueba, 10 en real).
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: ask_owner_to_review
key_limit_reached
Un agente admite como máximo 3 llaves activas. Revoca una o rotala.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: ask_owner_to_review
quota_exceeded
Se alcanzo un tope de uso del entorno de prueba (pagos por dueño, agentes archivados...). Reinicia el entorno o pide una revision.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: ask_owner_to_review
destination_wildcard_not_allowed
No se permiten comodines sobre sufijos públicos compartidos (*.vercel.app, *.github.io...) porque autorizan a terceros.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
destination_blocked
El destino esta en la lista global de bloqueo de Nouron y no se puede permitir.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
policy_inconsistent
Las reglas se contradicen (por ejemplo el tope por pago supera el diario).
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: fix_request · param
agent_archived
El agente esta archivado y no admite esta operación.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: ask_owner_to_review
capability_unavailable
La función no está disponible para el país o el tipo de titular, o todavía no existe. Definido en el contrato; todavía no se devuelve.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: not_available_in_country · reservado
verification_required
La operación pide un nivel de verificación que el titular aún no tiene; el dueño lo completa en la consola. Definido en el contrato; todavía no se devuelve.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: complete_verification · reservado
account_on_hold
No se puede completar la operación ahora; escribe a soporte con el Request-Id. Mismo texto, forma y tiempo sea cual sea la causa. Definido en el contrato; todavía no se devuelve.
HTTP 422 · tipo invalid_request_error · retry: no · siguiente: contact_support · reservado
429 · Demasiado rápido
rate_limited
Demasiadas peticiones. Espera Retry-After y reintenta con retroceso exponencial y algo de azar.
HTTP 429 · tipo rate_limit_error · retry: sí · siguiente: retry_later · Retry-After
agent_busy
Este agente ya tiene un pago en proceso de decision; reintenta igual pasado Retry-After.
HTTP 429 · tipo rate_limit_error · retry: sí · siguiente: retry_same_idempotency_key · Retry-After
500 · Falla de Nouron
internal_error
Fallo nuestro. Reintenta con la misma llave de idempotencia; si persiste, escribe a soporte con el Request-Id.
HTTP 500 · tipo api_error · retry: sí · siguiente: retry_same_idempotency_key
503 · Servicio no disponible
service_unavailable
Servicio no disponible por un momento. Reintenta con la misma llave pasado Retry-After.
HTTP 503 · tipo api_error · retry: sí · siguiente: retry_same_idempotency_key · Retry-After
platform_paused
Nouron pauso la plataforma por seguridad. Los pagos se rechazan hasta que se reanude.
HTTP 503 · tipo api_error · retry: sí · siguiente: contact_support · Retry-After
partner_unavailable
Un servicio externo (socio) no responde. Reintenta pasado Retry-After. Definido en el contrato; todavía no se devuelve.
HTTP 503 · tipo api_error · retry: sí · siguiente: retry_later · Retry-After · reservado