n1coePayDocs Referencia del API

Errores

La forma de los errores del API, los códigos HTTP y qué hacer con cada código.

  1. Decide con el código HTTP y error.code, que es estable.
  2. En un 400 invalid_request, lee details.field y details.code.
  3. Reintenta solo lo que se puede reintentar, respetando Retry-After.
Un llamado sin llave secreta
curl -s https://api-epay.dev.n1co.dev/v1/payment_intents/pi_UGF5bWVudEludGVudEV4YW1w
401 Unauthorized
{
  "error": {
    "code": "invalid_api_key",
    "message": "a valid secret key is required: Authorization: Bearer sk_..."
  }
}

El sobre de error#

Campo Descripción
error.code Código estable en inglés. Úsalo en tu código.
error.message Texto en inglés para tus logs. Puede cambiar; no lo muestres.
error.details Datos adicionales en algunos códigos, como field y code.

Los mensajes nunca repiten lo que enviaste. La validación informa solo el primer campo que falla.

Códigos HTTP#

HTTP Significado ¿Reintentar?
400 La solicitud no es válida. No. Corrige la solicitud.
401 Falta la llave o no es válida. No. Revisa tu llave.
404 El objeto no existe en tu tienda. No.
409 Conflicto con el estado actual. Según el código.
413 El cuerpo pasa de 16 KiB. No.
415 Content-Type no es application/json. No.
422 n1co no aceptó la solicitud. Según el código.
429 Demasiadas solicitudes. Sí, después de Retry-After.
500 Error interno. Sí, con espera creciente.
503 n1co no está disponible por ahora. Sí, después de Retry-After cuando viene.

Códigos generales#

error.code HTTP Qué hacer
invalid_request 400 Lee details.field y details.code y corrige.
invalid_api_key 401 Revisa Authorization: Bearer sk_….
request_too_large 413 Reduce el cuerpo a 16 KiB o menos.
unsupported_media_type 415 Envía Content-Type: application/json.
rate_limited 429 Espera los segundos de Retry-After.
internal_error 500 Reintenta más tarde. Si persiste, contacta a n1co.
n1co_api_unavailable 503 Reintenta después de Retry-After.
platform_access_pending 503 El acceso de ePay a tu tienda no está listo. Reintenta después de Retry-After.

Un details.code unknown_field significa una clave no documentada; details.field la nombra, como customer.<clave> dentro del cliente. Los nombres distinguen mayúsculas y minúsculas.

Configuración#

Códigos de POST /v1/setup. Ninguno guarda nada: puedes repetir la configuración.

error.code HTTP Qué hacer
invalid_request 400 El cuerpo o la webhook_url no es válido; el mensaje nombra el campo.
invalid_credentials 401 n1co rechazó el client id o el client secret.
store_already_enabled 409 No había nada que cambiar. details trae store_id y publishable_key.
client_id_in_use 409 Esa aplicación ya está vinculada a otra tienda.
setup_conflict 409 Otra configuración de la tienda corría al mismo tiempo. Reintenta.
missing_roles 422 details.missing_roles lista los roles que faltan.
client_app_not_found 422 n1co no conoce la aplicación. Revisa el client id.
rate_limited 429 5 por minuto por client_id, 60 por minuto en total. Espera Retry-After.
n1co_api_unavailable 503 Repite después de Retry-After (30 s).
platform_access_pending 503 El acceso a tu aplicación aún no está listo. Repite después de Retry-After.
platform_certificate_mismatch 503 Un problema de configuración del lado de n1co. Contacta a n1co.

Sesiones de tarjeta y tarjetas#

error.code HTTP Qué hacer
card_session_not_found 404 La sesión no existe en tu tienda.
card_not_found 404 payment_method no es una tarjeta del cliente con ese customer.id.
card_unavailable 409 La tarjeta ya no se puede usar. El comprador escribe otra vez su tarjeta.
details.code Significado
missing_customer, invalid_customer Falta customer o no es un objeto.
missing_id, invalid_id, missing_name, invalid_name, missing_email, invalid_email, missing_phone, invalid_phone Un campo del cliente; details.field es customer.<campo>.
unknown_field Una clave no documentada; dentro del cliente, details.field es customer.<clave>.
invalid_page_origins page_origins no es válido.

Pagos#

error.code HTTP Qué hacer
payment_intent_not_found 404 El intent no existe en tu tienda.
payment_intent_not_cancelable 409 Solo se cancela en requires_payment_method o requires_action; ver details.status.

Al crear un payment intent, details.code puede ser:

details.code Significado
missing_amount, invalid_amount Falta amount o no es un entero de 1 a 1000000000.
missing_currency, invalid_currency Falta currency o no es un código ISO 4217.
currency_not_supported La moneda no tiene dos decimales.
currency_mismatch Tu tienda cobra en otra moneda.
missing_customer, invalid_customer, códigos de campo del cliente Como en las sesiones de tarjeta.
invalid_description, invalid_reference, invalid_metadata El campo no cumple sus reglas.
invalid_billing, missing_country, invalid_country, invalid_state, invalid_postal_code La facturación no es válida.
invalid_page_origins page_origins no es válido.
invalid_payment_method payment_method no es un id de tarjeta.

Fallos de un pago#

Un intento fallido no es un error HTTP: llega en last_error del intent, con code, decline_code y message. n1co.js traduce message para el comprador.

last_error.code Qué pasó Qué hacer
card_declined El banco rechazó el cargo; decline_code trae su código. Otra tarjeta, o que el comprador llame a su banco.
card_rejected n1co no aceptó la tarjeta nueva. Pide otra tarjeta.
card_unavailable La tarjeta guardada dejó de servir. Cobra con el card element.
billing_required La tarjeta necesita dirección de facturación. Confirma otra vez con billing.
invalid_request n1co rechazó la solicitud. Pide otra tarjeta.
authentication_failed 3D Secure no se completó. Deja reintentar.
authentication_expired 3D Secure venció sin respuesta (10 minutos). Deja reintentar.
provider_error n1co respondió algo que no se pudo usar. Reintenta en unos minutos.
outcome_unknown No se sabe si hubo cargo; el intent sigue en processing. No cobres otra vez. Espera el webhook.
currency_mismatch, amount_mismatch n1co cobró otra moneda u otro monto; se anuló y se canceló. Crea otro intent.

Reembolsos#

error.code HTTP Qué hacer
payment_intent_not_found 404 El intent no existe en tu tienda.
refund_not_found 404 El reembolso no existe en tu tienda.
payment_intent_not_refundable 409 details.reason dice por qué (tabla siguiente).
refund_exists 409 Ya tiene un reembolso que no se reenvía ahora; details.refund es su id.
refund_in_progress 409 Se está enviando; espera Retry-After.
n1co_api_unavailable, platform_access_pending 503 No se envió nada. El siguiente POST lo envía.
details.reason Qué pasó
not_succeeded El intent no está succeeded.
order_unknown El pago no tiene número de orden de n1co. Contacta a n1co.
attempts_exhausted El reembolso ya se envió 3 veces.
details.code Significado
unknown_field Una clave no documentada, incluido amount.
missing_payment_intent, invalid_payment_intent Falta payment_intent o no es válido.
invalid_reason reason no tiene de 1 a 150 caracteres o tiene caracteres de control.
invalid_metadata metadata no es válido.

Un rechazo de n1co llega en last_error del reembolso:

last_error.code status Qué hacer
refund_rejected failed Lee message, el texto de n1co. Reenvía o contacta a n1co.
provider_error failed Reenvía más tarde o contacta a n1co.
order_not_found failed n1co no conoce la orden. Contacta a n1co.
outcome_unknown pending Espera el webhook; reenvía pasados 3 minutos.

Eventos#

error.code HTTP Qué hacer
event_not_found 404 El evento no existe en tu tienda.
details.code Significado
invalid_limit limit no es un entero de 1 a 100.
invalid_type type no es un tipo de evento.
unknown_parameter, duplicate_parameter, invalid_query Un parámetro no documentado, repetido o ilegible.

Errores en el navegador#

Los errores de capture() y confirmPayment() son de n1co.js, no del API. Están en la referencia de n1co.js.

Cuándo reintentar#

Situación Reintento
429 y 503 con Retry-After Espera esos segundos y repite.
500, o un error de red sin respuesta Repite con espera creciente.
409 setup_conflict Repite enseguida.
400, 401, 404, 413, 415 No repitas sin corregir.