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.

Sobre de error
{  "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
CampoQué 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, pasado Retry-After si lo hay.
  • after_fixing: Corrige primero lo que dicen message y param, 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.

Tratar un código desconocido
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