Documentación
Inicio rápido: tu primer pago con la API
Con una llave de agente de práctica puedes comprobar la conexión con GET /v1/me, pedir un pago con POST /v1/spends y leer el resultado: un rechazo por regla llega como respuesta normal, no como error.
Antes de empezar
- Una llave de agente de práctica (
np_test_agent_…). Se crea en la consola, en Llaves de API, cuando se abre tu acceso. Se muestra una sola vez. - Un agente con reglas: el monto máximo por pago y los destinos permitidos.
- Un cliente HTTP. Los ejemplos usan curl y la dirección base que publica
openapi.json.
Paso 1: comprueba la conexión
GET /v1/me dice quién eres para la API: la llave, el agente y el entorno. Si responde 200, la llave funciona.
curl https://api.nouronpass.com/v1/me \
-H "Authorization: Bearer $NOURON_API_KEY"Un 401 con invalid_api_key o missing_api_key significa que la llave está mal escrita o no llega; mira la página de errores.
Paso 2: pide un pago
POST /v1/spends pide un pago. amount es el MÁXIMO que el agente acepta pagar; el vendedor fija el monto final. La cabecera Idempotency-Key es obligatoria: si repites la llamada con la misma llave, no se paga dos veces.
curl -X POST https://api.nouronpass.com/v1/spends \
-H "Authorization: Bearer $NOURON_API_KEY" \
-H "Idempotency-Key: 7c1f0a52-3e9d-4c1b-9b3e-a41d0b6f2c11" \
-H "Content-Type: application/json" \
-d '{
"amount": "5.00",
"destination": "registry.npmjs.org",
"resource": {
"url": "https://registry.npmjs.org/-/pro/private-packages/month",
"method": "GET"
}
}'Cada intento nuevo usa una llave de idempotencia nueva; un reintento de la misma llamada usa la misma.
Paso 3: lee el resultado
La respuesta es un pago con un status. Decide por status, decline_reason y next_action, nunca por el texto de message.
{ "id": "spd_9a2f1a7c0d4e5b3a8c6d7e0f1a2b3c4d", "status": "settled", "amount": "5.00", "amount_settled": "4.80", "destination": "registry.npmjs.org", "decline_reason": null, "next_action": { "code": "none" }}| Estado | Qué significa |
|---|---|
| `pending_approval` | Supera el umbral del dueño y espera su aprobación. No lo repitas: consúltalo con GET /v1/spends/{id}. |
| `approved` | Pasó las reglas y tiene cupo reservado; todavía no se envió. |
| `processing` | Se envió y no hay resultado todavía. Consúltalo más tarde. |
| `settled` | Pagado. Trae el resultado de la compra y el recibo firmado. |
| `declined` | Una regla lo detuvo. Es una decisión, no un error: lee decline_reason. |
| `failed` | Se aprobó pero el pago falló; no se movió dinero. Un intento nuevo exige una llave de idempotencia nueva. |
| `expired` | Nadie aprobó a tiempo y el pago venció. |
| `cancelled` | El agente lo canceló antes de enviarlo. |
Un rechazo por regla no es un error
Cuando una regla del dueño detiene un pago, la API responde con HTTP 201 y un pago con status: declined y un motivo estable en decline_reason. Así curl -f no se rompe y un modelo no lo confunde con una falla.
Si algo falla
Un error de verdad (JSON mal escrito, llave inválida, recurso inexistente) llega con un estado HTTP 4xx o 5xx y el mismo sobre en todos los casos. Lee estos campos:
error.code: el código estable. Decide por él.error.retry:nono repitas,as_isrepite la misma petición con la misma llave de idempotencia,after_fixingcorrige primero lo que dicenmessageyparam.error.outcome_unknown: si es true, el pago pudo haberse hecho; no repitas con otra llave, consulta el pago.request_id: dalo a soporte si necesitas ayuda.
{ "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 }}Siguientes pasos
- Errores: cada código y qué hacer.
- Eventos y webhooks: enterarte de los cambios sin consultar.
- Versionado: qué puede cambiar sin avisar y qué no.
- Límites: cuántas peticiones y de qué tamaño.