Download OpenAPI specification:Download
La API de Binkio para mover dinero desde tu propio sistema: consultar saldos y movimientos, crear cobros y recibir avisos cuando se pagan.
Base: https://api.binkio.com/v1. Todo lo de esta referencia cuelga de ahí.
Cabecera Authorization, con el secreto de tu credencial:
Authorization: Bearer bk_live_sec_7f3a…
El prefijo declara el entorno: bk_test_… contra el entorno de pruebas,
bk_live_… contra el real. Se distinguen a simple vista en un log, en una
captura o en un ticket — es la defensa más barata contra configurar la
credencial equivocada.
El secreto se muestra una sola vez, al crearlo. Si se pierde, se rota; no se recupera. Puedes tener dos credenciales activas a la vez: ése es el procedimiento de rotación sin cortar servicio (crea la nueva, despliégala, comprueba que la vieja dejó de usarse, revócala).
Todos los fallos de autenticación devuelven el mismo 401, con el mismo
cuerpo: no distinguimos «revocada» de «IP no permitida» de «no existe». No es
una carencia de la documentación; distinguirlos le diría a quien está probando
credenciales que acertó una y sólo le falta cambiar de red.
Cada credencial lleva los permisos que le diste, por recurso y acción
(balances:read, links:write, logs:read…). Cada endpoint declara el
suyo. Emite claves con lo mínimo: una terminal de mostrador necesita crear
cobros, no leer el histórico de la empresa — si esa terminal se compromete, el
daño queda acotado a lo que su clave podía hacer.
Si a la credencial le falta el alcance, la respuesta es 403 y sí dice
cuál falta: quien pregunta ya demostró tener una credencial válida.
Obligatoria en todo método que crea o modifica (POST, PUT,
PATCH, DELETE). Sin la cabecera, 400.
Idempotency-Key: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c
Una clave por operación, no por reintento: los reintentos de la misma operación repiten la clave, y eso es justo lo que impide el cobro duplicado cuando una terminal con mala cobertura no llega a ver la respuesta.
| Situación | Respuesta |
|---|---|
| Clave nueva | Se ejecuta y se guarda la respuesta. |
| Misma clave, mismo cuerpo, ya terminada | La respuesta guardada, con Idempotent-Replay: true. No se vuelve a ejecutar. |
| Misma clave, mismo cuerpo, en curso | 409 idempotency_request_in_progress. Reintenta en unos segundos con la misma clave. |
| Misma clave, cuerpo distinto | 422 idempotency_key_reused. Es el caso peligroso: significa que reutilizaste la clave para otra operación. Ejecutarla sería cobrar dos veces con nuestra bendición. |
| Clave de hace más de 24 h | Se trata como nueva. |
Cómo comprobar que tu manejo es correcto sin mover un peso: llama dos veces a
POST /v1/ping con la misma clave. Si el execution_id es el mismo y
llega Idempotent-Replay: true, tu reintento no duplicó nada. Si cambia,
ejecutaste dos veces — y más vale descubrirlo ahí que con un cobro.
El contrato lleva fecha. La RUTA sigue siendo /v1 —eso identifica la API—
pero lo que decide la forma de cada respuesta es una versión con fecha, y
va en la cabecera Binkio-Version de toda respuesta, la hayas
pedido o no.
Se resuelve en este orden:
| Orden | De dónde sale |
|---|---|
| 1 | La cabecera Binkio-Version de tu petición. |
| 2 | La versión FIJADA en tu credencial al emitirla. No cambia sola. |
| 3 | La actual — sólo en el checkout, que no lleva credencial. |
Que el paso 2 no cambie solo es el punto entero: una integración escrita hoy sigue recibiendo la forma de hoy cuando publiquemos la siguiente. Subir de versión es una decisión tuya.
Manda la cabecera para probar una versión nueva en una llamada suelta,
desde curl, antes de tocar nada. Una versión que no existe se rechaza con
400 unknown_api_version y el mensaje enumera las válidas: no se cae en
silencio a la actual, porque un dedazo que cambia el comportamiento en silencio
es peor que un error.
| Versión | Qué trae |
|---|---|
2026-09-09 |
Línea de salida del contrato versionado. Incluye los eventos de enlace de pago con code y amount alineados con la API REST, y el neto del comercio en net_amount / net_currency. |
Dos, y hacen falta los dos: peticiones por minuto (abuso técnico) y operaciones de dinero por día (abuso económico — una credencial robada que respete el límite por minuto puede crear cientos de miles de cobros al día).
Los límites son por credencial, no por IP: detrás de un comercio hay muchas terminales tras la misma salida a internet, y un cubo por IP dejaría a todas sin servicio por culpa de una.
Cada respuesta trae con qué autorregularte:
| Cabecera | Qué dice |
|---|---|
RateLimit-Limit |
Peticiones por minuto de esta credencial. |
RateLimit-Remaining |
Cuántas quedan en la ventana actual. |
RateLimit-Reset |
Segundos hasta que la ventana se reinicia. |
RateLimit-Money-* |
Lo mismo para la cuota diaria de operaciones de dinero (sólo en métodos que mutan). |
Al pasarte: 429 y Retry-After con los segundos que faltan. Usa las
cabeceras y no llegarás a verlo.
Mismo sobre en toda la API:
{
"error": {
"type": "invalid_request",
"code": "insufficient_balance",
"message": "No hay saldo suficiente para esta operación.",
"param": "amount",
"request_id": "req_9f2a4c8b7e1d3a5f"
}
}
type — familia estable y corta. Es con lo que decides qué hacer
(reintentar, arreglar la petición, avisar a una persona) sin conocer el
catálogo completo.code — el caso concreto. Es lo que debes comparar en tu código.
No compares message: cambia, se traduce y se reescribe.param — qué campo lo provocó, cuando se puede determinar.request_id — identifica esta llamada exacta.request_idVa siempre: en la cabecera X-Request-Id y en el cuerpo, tanto en éxito
como en error. Guárdalo. Es lo primero que pide soporte, y es la clave con la
que encuentras tu propia llamada en GET /v1/request_logs.
Por cursor, no por número de página: un histórico al que se le añaden filas por delante hace que la página 2 de un listado por desplazamiento contenga cosas que ya viste en la página 1.
GET /v1/transactions?limit=50
GET /v1/transactions?limit=50&cursor=eyJ2IjoxLCJ0Ijoi…
Repite mientras has_more sea true, pasando el next_cursor de la
respuesta anterior. No te guíes por el número de elementos: una página
puede venir con menos de limit y aún tener más detrás.
El cursor es opaco. No lo interpretes ni lo construyas: su contenido no forma parte del contrato y puede cambiar.
Siempre cadena decimal, nunca número:
{ "amount": "1500.00000000" }
Un float de JSON no representa 0.1 exactamente. Un cliente que hace
JSON.parse sobre {"amount": 1234567.89} ya perdió precisión antes de
tocar el dato. La cadena es lo único que sobrevive intacto a cualquier
lenguaje. Mándalos igual: un número en el cuerpo recibe 400.
Para no tener que sondear, registra un destino en el panel y te enviamos un aviso firmado cuando algo pasa en tu cuenta. El contrato de firma —qué se firma exactamente, cómo se verifica y por qué no debes reserializar el cuerpo antes de comprobarlo— está en la guía de webhooks:
https://docs.binkio.com/api/webhooks
Esa guía es la única fuente del contrato de firma. No se reproduce aquí a propósito: dos copias de un contrato criptográfico acaban diciendo cosas distintas, y la que leas será la equivocada.
GET /v1/request_logs devuelve tus propias llamadas: qué pediste, qué
respondimos, cuándo, desde qué IP y con qué credencial. Es el sitio donde
mirar antes de abrir un ticket.
Comprobación de vida, sin credencial. Responde 200 mientras el proceso atienda peticiones.
No comprueba dependencias: que responda no garantiza que un cobro vaya a liquidar. Si necesitas saber si TU credencial funciona, usa /v1/ping, que además te dice sus alcances.
Alcance requerido: ninguno. Basta una credencial válida — es una comprobación, y exigir un alcance para ella empujaría a emitir claves más permisivas de lo necesario.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "status": "ok",
- "timestamp": "2026-09-06T14:32:07.482Z"
}La primera llamada que conviene hacer al integrar: confirma de punta a punta que tu credencial funciona, contra qué entorno estás pegando y qué alcances tiene — sin mover un peso.
Si environment no es el que esperabas, tienes la credencial del otro entorno configurada.
Alcance requerido: ninguno. Basta una credencial válida — es una comprobación, y exigir un alcance para ella empujaría a emitir claves más permisivas de lo necesario.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "ok": true,
- "environment": "live",
- "api_key": {
- "id": "7c1f0a4e-3d2b-4f9a-8b11-2e6c9d4a5f30",
- "name": "TPV sucursal Centro",
- "last_four": "x9f2",
- "scopes": [
- "balances:read",
- "links:write"
]
}, - "account": {
- "id": "b3d9c1a2-5e4f-4c8b-9a70-1f2e3d4c5b6a"
}, - "server_time": "2026-08-04T15:04:05.000Z",
- "request_id": "req_9f2a4c8b7e1d3a5f"
}Llama dos veces con la MISMA Idempotency-Key y el mismo cuerpo. Si el execution_id es idéntico y la segunda respuesta trae Idempotent-Replay: true, acabas de comprobar que tu reintento no duplicó nada. Si cambia, tu cliente ejecutó dos veces — y más vale descubrirlo aquí que con un cobro.
Pruébalo también con un cuerpo distinto y la misma clave: debe darte 422 idempotency_key_reused.
Alcance requerido: ninguno. Basta una credencial válida — es una comprobación, y exigir un alcance para ella empujaría a emitir claves más permisivas de lo necesario.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
Cualquier objeto JSON. Se devuelve tal cual en echo, para que puedas comprobar que la MISMA clave con un cuerpo distinto da 422 idempotency_key_reused.
| property name* additional property | any |
{ }{- "ok": true,
- "execution_id": "0f8c2b1a-7d6e-4c3b-9a58-1e2f3d4c5b6a",
- "executed_at": "2026-08-04T15:04:05.000Z",
- "idempotency_key": "9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c",
- "echo": {
- "hola": "mundo"
}, - "request_id": "req_9f2a4c8b7e1d3a5f"
}Devuelve el saldo de cada activo con fondos. available es lo que se puede operar, pending lo retenido y total la suma — publicada ya calculada para que nadie la sume mal.
Los importes son cadenas decimales de 8 decimales, la escala del libro. as_of dice cuándo se leyó: un saldo sin marca temporal es un dato del que no se puede decir si está viejo.
Alcance requerido: balances:read.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "balance_list",
- "account_id": "b3d9c1a2-5e4f-4c8b-9a70-1f2e3d4c5b6a",
- "as_of": "2026-08-04T15:04:05.000Z",
- "data": [
- {
- "object": "balance",
- "asset": "MXNB",
- "available": "18450.00000000",
- "pending": "0.00000000",
- "total": "18450.00000000"
}
]
}Crear, consultar y cancelar cobros. Es el motor: multimoneda, multirriel y con conversión cuando la moneda del pagador no es la tuya.
Reintentar con la misma Idempotency-Key devuelve el MISMO enlace, sin crear un segundo. Si no se envían accepted_methods, el sistema determina los métodos viables a partir de la divisa y el importe, y omite los que no pueda dejar listos en ese momento: lee accepted_methods en la respuesta para saber cuáles quedaron. Si los envías, o quedan TODOS o el enlace no se crea (payment_method_unavailable).
La CLABE de SPEI es un registro de un solo uso en el proveedor y caduca. Si caduca antes de que alguien pague, al abrir el enlace o el checkout se registra una nueva; mientras tanto, el detalle no publica la vencida.
El amount es lo que recibirá tu cuenta. Cuando el pagador use un método en otra divisa, el importe que él debe enviar viene en methods[].amount_due, con su caducidad en amount_due_expires_at: está bloqueado contra el proveedor y un envío por otra cantidad no acredita.
Alcance requerido: links:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Importe que recibirá la cuenta, en la divisa indicada en |
| currency required | string Enum: "MXNB" "USDC" "COP" Divisa que recibe la cuenta. Un enlace en |
| description required | string [ 1 .. 255 ] characters Concepto. Es lo que ve el pagador. |
| accepted_methods | Array of strings [ 1 .. 5 ] items unique Items Enum: "SPEI" "WIRE" "MXNB" "USDC" "USDT" "COP" Métodos que el enlace admitirá. Si se omite, el sistema determina los viables a partir de la divisa y el importe (pisos de conversión, mínimos de los rieles fiat) — es la opción recomendada: pedir un método que el importe no soporta devuelve 400. |
| fee_bearer | string Default: "payer" Enum: "payer" "merchant" Quién asume la comisión. Con |
| expires_at | string <date-time> Caducidad del enlace. Debe estar en el futuro. Si se omite, se aplica la caducidad por defecto de la plataforma. |
| return_url | string <= 2000 characters ^https:\/\/[^\s]+$ A dónde devolver al pagador cuando termina. Tiene que ser |
object Pares clave-valor tuyos. Se devuelven tal cual aquí y en el webhook, y no los interpretamos nunca: úsalos para atar este cobro a tu pedido sin mantener una tabla aparte. Máximo 50 claves, clave de 40 caracteres y valor de 500; los valores son cadenas (un número se rechaza, no se convierte). No metas datos personales: esto acaba en tus registros, en los nuestros y en correos de soporte. |
{- "amount": "1500.25",
- "currency": "MXNB",
- "description": "Factura A-1042",
- "accepted_methods": [
- "SPEI",
- "USDC"
], - "fee_bearer": "payer",
- "expires_at": "2026-12-31T23:59:00Z",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}
}{- "object": "payment_link",
- "code": "PL-4F2A-9C8B-7E1D",
- "status": "active",
- "amount": "1500.00000000",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "qr": {
- "object": "checkout_qr",
- "format": "svg",
- "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29 29\" shape-rendering=\"crispEdges\"><path fill=\"#fff\" d=\"M0 0h29v29H0z\"/><path stroke=\"#000\" d=\"M1 1.5h7m2 0h1m1 0h7\"/></svg>"
}, - "created_at": "2026-08-04T14:30:00.000Z",
- "expires_at": "2026-08-05T14:30:00.000Z",
- "paid_at": null,
- "paid_with_method": null,
- "methods": [
- {
- "object": "payment_link_method",
- "method": "SPEI",
- "asset": "MXN",
- "requires_conversion": true,
- "amount_due": "1522.50",
- "fee": "0.00",
- "exchange_rate": "1.00000000",
- "amount_due_expires_at": "2026-08-04T14:45:00.000Z",
- "quote_status": "locked",
- "instructions": {
- "clabe": "710969000000123456",
- "address": "0x9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b",
- "network": "ARBITRUM",
- "reference": "BNK4F2A9C",
- "bank": {
- "name": "Banco Ejemplo",
- "account_number": "0000123456",
- "routing_number": "021000021",
- "account_name": "Binkio SA de CV",
- "address": "Ciudad de México, MX"
}
}
}
]
}Devuelve los enlaces del más reciente al más antiguo. Para recorrer el histórico completo, repite la llamada pasando next_cursor en cursor mientras has_more sea true.
El listado NO trae methods: los importes por método salen del detalle, que es una llamada por enlace.
Alcance requerido: links:read.
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántos enlaces por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| status | string Enum: "active" "processing" "paid" "cancelled" "expired" Example: status=paid Devuelve sólo los enlaces en este estado. |
| currency | string Enum: "MXNB" "USDC" "COP" Example: currency=MXNB Devuelve sólo los enlaces emitidos en esta divisa. |
| created_after | string <date-time> Example: created_after=2026-09-01T00:00:00Z Sólo enlaces creados en o después de esta fecha. |
| created_before | string <date-time> Example: created_before=2026-09-01T00:00:00Z Sólo enlaces creados en o antes de esta fecha. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "payment_link",
- "code": "PL-4F2A-9C8B-7E1D",
- "status": "paid",
- "amount": "1500.00000000",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "created_at": "2026-08-04T14:30:00.000Z",
- "expires_at": "2026-08-05T14:30:00.000Z",
- "paid_at": "2026-08-04T14:41:22.000Z",
- "paid_with_method": "SPEI"
}
], - "has_more": false,
- "next_cursor": null
}El resumen que pinta un panel de comercio. Existe para no tener que recorrer el histórico entero: con páginas de 100, una cuenta con diez mil enlaces son cien llamadas para cuatro números.
Los estados son los del contrato público, así que processing agrupa los enlaces cobrados que todavía se están asentando.
Alcance requerido: links:read.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "payment_link_stats",
- "active": 12,
- "processing": 2,
- "paid": 340,
- "cancelled": 7,
- "expired": 23,
- "total": 384
}Crear un enlace con un accepted_methods que el importe no soporta devuelve 400. Los métodos de la OTRA familia de divisa exigen convertir, y la conversión tiene mínimos: un enlace de 500 MXNB no puede cobrarse en USDC.
Hasta ahora la única forma de saberlo por API era intentarlo y leer el error. Esto se pregunta ANTES, con el importe del carrito en la mano, y no crea ni consulta ningún enlace.
Alcance requerido: links:read.
| currency required | string Enum: "MXNB" "USDC" "COP" Example: currency=MXNB Divisa en la que recibiría la cuenta. |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Example: amount=50000.00 Importe que recibiría la cuenta, en esa divisa. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "payment_method_options",
- "currency": "MXNB",
- "amount": "80.00",
- "available_methods": [
- "MXNB"
], - "conversion_enabled": false,
- "methods": [
- {
- "method": "SPEI",
- "available": false,
- "requires_conversion": false,
- "unavailable_reason": "BELOW_FIAT_MINIMUM",
- "minimum_required": "100"
}, - {
- "method": "WIRE",
- "available": false,
- "requires_conversion": true,
- "unavailable_reason": "BELOW_CONVERSION_THRESHOLD",
- "minimum_required": "1800"
}, - {
- "method": "MXNB",
- "available": true,
- "requires_conversion": false
}, - {
- "method": "USDC",
- "available": false,
- "requires_conversion": true,
- "unavailable_reason": "BELOW_CONVERSION_THRESHOLD",
- "minimum_required": "100"
}, - {
- "method": "USDT",
- "available": false,
- "requires_conversion": true,
- "unavailable_reason": "BELOW_CONVERSION_THRESHOLD",
- "minimum_required": "100"
}
], - "amount_limits": {
- "min_amount": "10.00",
- "max_amount": "999999.00"
}
}Devuelve lo PERSISTIDO, no una cotización nueva: el importe bloqueado tal como se guardó y su caducidad. Si venció, se dice (quote_status: "expired") en lugar de refrescarlo por la espalda — una lectura que cambiara la CLABE que el pagador tiene delante significaría un pago llegando a una cuenta que ya nadie mira.
Alcance requerido: links:read.
| code required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "payment_link",
- "code": "PL-4F2A-9C8B-7E1D",
- "status": "active",
- "amount": "1500.00000000",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "qr": {
- "object": "checkout_qr",
- "format": "svg",
- "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29 29\" shape-rendering=\"crispEdges\"><path fill=\"#fff\" d=\"M0 0h29v29H0z\"/><path stroke=\"#000\" d=\"M1 1.5h7m2 0h1m1 0h7\"/></svg>"
}, - "created_at": "2026-08-04T14:30:00.000Z",
- "expires_at": "2026-08-05T14:30:00.000Z",
- "paid_at": null,
- "paid_with_method": null,
- "methods": [
- {
- "object": "payment_link_method",
- "method": "SPEI",
- "asset": "MXN",
- "requires_conversion": true,
- "amount_due": "1522.50",
- "fee": "0.00",
- "exchange_rate": "1.00000000",
- "amount_due_expires_at": "2026-08-04T14:45:00.000Z",
- "quote_status": "locked",
- "instructions": {
- "clabe": "710969000000123456",
- "address": "0x9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b",
- "network": "ARBITRUM",
- "reference": "BNK4F2A9C",
- "bank": {
- "name": "Banco Ejemplo",
- "account_number": "0000123456",
- "routing_number": "021000021",
- "account_name": "Binkio SA de CV",
- "address": "Ciudad de México, MX"
}
}
}
]
}Sólo se borra lo que ya no puede cobrar: un enlace cancelled o expired. Un enlace active hay que cancelarlo primero, y uno paid no se borra nunca — es el respaldo de un cobro que ocurrió, y en tus movimientos seguirá estando.
No se deshace.
Alcance requerido: links:write.
Exige la cabecera Idempotency-Key.
| code required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "error": {
- "type": "invalid_request",
- "code": "idempotency_key_required",
- "message": "Falta la cabecera `Idempotency-Key`. Es obligatoria en todo método que crea o modifica.",
- "request_id": "req_9f2a4c8b7e1d3a5f"
}
}Devuelve image/svg+xml. Codifica exactamente la misma checkout_url que el detalle del enlace. Sin medidas fijas: el tamaño lo decide quien lo pinta.
Alcance requerido: links:read.
| code required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{
"error": {
"type": "invalid_request",
"code": "unknown_api_version",
"message": "La cabecera `Binkio-Version` trae una versión que no existe. El mensaje enumera las válidas.",
"request_id": "req_9f2a4c8b7e1d3a5f"
}
}Sólo se puede cancelar un enlace active. Cancelar uno ya cobrado, ya cancelado o caducado devuelve 409 — nunca un éxito silencioso: un 200 sobre un enlace ya pagado le diría a tu sistema que el cobro quedó anulado cuando el dinero ya está en tu saldo.
Alcance requerido: links:write.
Exige la cabecera Idempotency-Key.
| code required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "object": "payment_link",
- "code": "PL-4F2A-9C8B-7E1D",
- "status": "active",
- "amount": "1500.00000000",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "qr": {
- "object": "checkout_qr",
- "format": "svg",
- "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29 29\" shape-rendering=\"crispEdges\"><path fill=\"#fff\" d=\"M0 0h29v29H0z\"/><path stroke=\"#000\" d=\"M1 1.5h7m2 0h1m1 0h7\"/></svg>"
}, - "created_at": "2026-08-04T14:30:00.000Z",
- "expires_at": "2026-08-05T14:30:00.000Z",
- "paid_at": null,
- "paid_with_method": null,
- "methods": [
- {
- "object": "payment_link_method",
- "method": "SPEI",
- "asset": "MXN",
- "requires_conversion": true,
- "amount_due": "1522.50",
- "fee": "0.00",
- "exchange_rate": "1.00000000",
- "amount_due_expires_at": "2026-08-04T14:45:00.000Z",
- "quote_status": "locked",
- "instructions": {
- "clabe": "710969000000123456",
- "address": "0x9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b",
- "network": "ARBITRUM",
- "reference": "BNK4F2A9C",
- "bank": {
- "name": "Banco Ejemplo",
- "account_number": "0000123456",
- "routing_number": "021000021",
- "account_name": "Binkio SA de CV",
- "address": "Ciudad de México, MX"
}
}
}
]
}Una cuenta tiene un QR maestro. Esta llamada lo crea; si ya hay uno, responde 409 — el que existe se consulta con GET /v1/qr.
Los dos campos son opcionales: sin cuerpo, la divisa se deduce de los activos que la cuenta tenga aprobados.
El id que devuelve es lo que se va a IMPRIMIR en el cartel, y no cambia. Por eso el alta es una llamada explícita y no un efecto secundario de la primera lectura.
Alcance requerido: qr:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| display_name | string <= 80 characters Nombre comercial que ve el pagador. Si se omite, se usa el de la cuenta. |
| currency | string Enum: "MXNB" "USDC" "COP" Divisa en la que se generarán los cobros. Si se omite, se deduce de los activos que la cuenta tenga aprobados. |
{- "display_name": "Cafeteria Central",
- "currency": "MXNB"
}{- "object": "qr",
- "id": "AShgI3mMYzIadVWN3maozr",
- "status": "active",
- "currency": "MXNB",
- "display_name": "Caja 1",
- "verification_code": "4F9C",
- "max_amount_per_charge": "5000.00000000",
- "max_amount_per_day": "50000.00000000",
- "amount_paid_today": "1250.00000000",
- "created_at": "2026-06-14T11:05:23.000Z"
}Devuelve la URL que codifica el QR, su divisa, sus topes y cuánto se lleva cobrado hoy. No crea nada: si la cuenta todavía no tiene QR, responde 404.
verification_code es para el mostrador: se enseña para que el pagador compruebe que el QR que escaneó es el del comercio y no una pegatina que alguien encimó.
Alcance requerido: qr:read.
| qr_id | string <= 32 characters Example: qr_id=qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "qr",
- "id": "AShgI3mMYzIadVWN3maozr",
- "status": "active",
- "currency": "MXNB",
- "display_name": "Caja 1",
- "verification_code": "4F9C",
- "max_amount_per_charge": "5000.00000000",
- "max_amount_per_day": "50000.00000000",
- "amount_paid_today": "1250.00000000",
- "created_at": "2026-06-14T11:05:23.000Z"
}Parcial: lo que no se envía se queda como está. Enviar null en un campo opcional quita el tope.
Los topes son tu red de seguridad: un QR de mostrador está expuesto, y acotar el máximo por cargo acota lo que puede salir mal.
Alcance requerido: qr:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| qr_id | string <= 32 characters El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
| display_name | string or null <= 80 characters Nombre comercial que ve el pagador. |
| currency | string Enum: "MXNB" "USDC" "COP" Divisa en la que se generarán los cobros. Si se omite, se deduce de los activos que la cuenta tenga aprobados. |
| max_amount_per_charge | string or null^\d{1,12}(\.\d{1,8})?$ Tope por cobro. |
| max_amount_per_day | string or null^\d{1,12}(\.\d{1,8})?$ Tope diario agregado sobre lo COBRADO en el día. |
{- "qr_id": "qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb",
- "display_name": "Cafeteria Central",
- "currency": "MXNB",
- "max_amount_per_charge": "50000.00",
- "max_amount_per_day": "200000.00"
}{- "object": "qr",
- "id": "AShgI3mMYzIadVWN3maozr",
- "status": "active",
- "currency": "MXNB",
- "display_name": "Caja 1",
- "verification_code": "4F9C",
- "max_amount_per_charge": "5000.00000000",
- "max_amount_per_day": "50000.00000000",
- "amount_paid_today": "1250.00000000",
- "created_at": "2026-06-14T11:05:23.000Z"
}Los cobros ya generados siguen su curso y se pueden pagar. Pausar uno ya pausado devuelve el mismo estado, sin error.
Alcance requerido: qr:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| qr_id | string <= 32 characters El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
{- "qr_id": "qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb"
}{- "object": "qr",
- "id": "AShgI3mMYzIadVWN3maozr",
- "status": "active",
- "currency": "MXNB",
- "display_name": "Caja 1",
- "verification_code": "4F9C",
- "max_amount_per_charge": "5000.00000000",
- "max_amount_per_day": "50000.00000000",
- "amount_paid_today": "1250.00000000",
- "created_at": "2026-06-14T11:05:23.000Z"
}Reanudar uno que ya estaba activo devuelve el mismo estado, sin error.
Alcance requerido: qr:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| qr_id | string <= 32 characters El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
{- "qr_id": "qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb"
}{- "object": "qr",
- "id": "AShgI3mMYzIadVWN3maozr",
- "status": "active",
- "currency": "MXNB",
- "display_name": "Caja 1",
- "verification_code": "4F9C",
- "max_amount_per_charge": "5000.00000000",
- "max_amount_per_day": "50000.00000000",
- "amount_paid_today": "1250.00000000",
- "created_at": "2026-06-14T11:05:23.000Z"
}Crea un enlace de pago por el importe indicado, en la divisa del QR. Devuelve el enlace con su url: eso es lo que la terminal convierte en el QR que ve el pagador.
Usa el número de ticket como Idempotency-Key. Si la terminal pierde la red justo al enviar y el cajero vuelve a pulsar, la misma clave devuelve el cobro original en vez de generar un segundo cargo — en un mostrador con prisa eso pasa más de lo que parece.
Alcance requerido: qr:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| qr_id | string <= 32 characters El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Importe a cobrar, en la divisa del QR. |
| reference | string <= 80 characters ^[\p{L}\p{N}\s.,#\-_/()'"&:]+$ Concepto libre del cobro («Mesa 5», «Pedido 12»). Admite letras, números, espacios y |
{- "qr_id": "qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb",
- "amount": "350.50",
- "reference": "Mesa 5"
}{- "object": "payment_link",
- "qr_id": "AShgI3mMYzIadVWN3maozr",
- "code": "PL-7C3D-1A2B-9E4F",
- "status": "active",
- "amount": "350.50000000",
- "currency": "MXNB",
- "description": "ticket-77",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "created_at": "2026-09-07T18:22:41.000Z",
- "expires_at": "2026-09-07T19:22:41.000Z",
- "paid_at": null,
- "paid_with_method": null,
- "qr": {
- "object": "checkout_qr",
- "format": "svg",
- "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29 29\" shape-rendering=\"crispEdges\"><path fill=\"#fff\" d=\"M0 0h29v29H0z\"/><path stroke=\"#000\" d=\"M1 1.5h7m2 0h1m1 0h7\"/></svg>"
}
}Del más reciente al más antiguo. Para recorrer el histórico completo, repite la llamada pasando next_cursor en cursor mientras has_more sea true.
Alcance requerido: qr:read.
| qr_id | string <= 32 characters Example: qr_id=qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántos cobros por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| status | string Enum: "active" "processing" "paid" "cancelled" "expired" Example: status=paid Devuelve sólo los cobros en este estado. |
| created_after | string <date-time> Example: created_after=2026-09-01T00:00:00Z Sólo cobros creados en o después de esta fecha. |
| created_before | string <date-time> Example: created_before=2026-09-01T00:00:00Z Sólo cobros creados en o antes de esta fecha. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "payment_link",
- "qr_id": "AShgI3mMYzIadVWN3maozr",
- "code": "PL-7C3D-1A2B-9E4F",
- "status": "paid",
- "amount": "350.50000000",
- "currency": "MXNB",
- "description": "ticket-77",
- "metadata": {
- "order_id": "4821",
- "sucursal": "centro"
}, - "fee_bearer": "merchant",
- "accepted_methods": [
- "SPEI",
- "MXNB"
], - "created_at": "2026-09-07T18:22:41.000Z",
- "expires_at": "2026-09-07T19:22:41.000Z",
- "paid_at": "2026-09-07T18:24:09.000Z",
- "paid_with_method": "SPEI"
}
], - "has_more": true,
- "next_cursor": "eyJpZCI6IjdjM2QxYTJiIn0"
}Los importes de hoy y del mes se calculan sobre lo COBRADO (no sobre lo generado) y con días UTC.
La diferencia entre generados y pagados es la que interesa vigilar: un salto ahí suele ser un problema de mostrador —el QR tapado, el cliente que se fue— no de la API.
Alcance requerido: qr:read.
| qr_id | string <= 32 characters Example: qr_id=qr_7Kd93Lm2Pq8Rt5Vw1Xy4Zb El QR sobre el que operar. Hoy la cuenta tiene uno solo y se puede omitir; mandarlo desde el principio deja la terminal preparada para cuando haya varios. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "qr_stats",
- "qr_id": "AShgI3mMYzIadVWN3maozr",
- "currency": "MXNB",
- "charges_generated": 128,
- "charges_paid": 119,
- "charges_pending": 9,
- "amount_paid_today": "1250.00000000",
- "amount_paid_this_month": "41830.75000000"
}Devuelve los movimientos del más reciente al más antiguo. Para recorrer el histórico completo, repite la llamada pasando next_cursor en cursor mientras has_more sea true. No te guíes por el número de elementos: una página puede venir con menos de limit y aun así tener más movimientos detrás.
Alcance requerido: transactions:read.
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántos movimientos por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| asset | string^[A-Za-z0-9]{2,10}$ Example: asset=USDC Código del activo: |
| type | string Enum: "deposit" "withdrawal" "conversion" "payment" "transfer" "p2p" Example: type=withdrawal Familia de movimiento. |
| status | string Enum: "pending" "completed" "failed" Example: status=completed Estado del movimiento. |
| created_after | string <date-time> Example: created_after=2026-09-01T00:00:00Z Sólo movimientos creados en o después de esta fecha. |
| created_before | string <date-time> Example: created_before=2026-09-01T00:00:00Z Sólo movimientos creados en o antes de esta fecha. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "transaction",
- "id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
- "type": "payment",
- "direction": "credit",
- "status": "completed",
- "amount": "1500.00000000",
- "asset": "MXNB",
- "reference": "BNK-4F2A9C",
- "created_at": "2026-08-04T14:32:10.000Z"
}
], - "has_more": true,
- "next_cursor": "eyJ2IjoxLCJ0IjoiMjAyNi0wOC0wNFQxNDozMjoxMC4xMjM0NTZaIn0"
}Añade al movimiento su comisión, su tasa y —cuando aplica— la red y el hash on-chain.
Los campos opcionales se omiten cuando no aplican, en lugar de venir a null: un "fee": null obliga a cada cliente a distinguir «no hubo comisión» de «no lo sabemos», y casi ninguno lo hace bien.
No se publican los datos del tercero (destino de un retiro, quién pagó un enlace): que la operación sea de tu cuenta no los convierte en tuyos.
Alcance requerido: transactions:read.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "transaction",
- "id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
- "type": "conversion",
- "direction": "debit",
- "status": "completed",
- "amount": "1500.00000000",
- "asset": "MXNB",
- "reference": "BNK-4F2A9C",
- "created_at": "2026-08-04T14:32:10.000Z",
- "completed_at": "2026-08-04T14:32:44.000Z",
- "fee": "12.50000000",
- "net_amount": "1487.50000000",
- "exchange_rate": "17.42000000",
- "from_asset": "MXNB",
- "to_asset": "USDC",
- "from_amount": "1500.00000000",
- "to_amount": "85.39000000",
- "network": "ARBITRUM",
- "tx_hash": "0x4f2a9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f",
- "payment_link_code": "PL-4F2A-9C8B-7E1D",
- "travel_rule_applied": false
}El catálogo completo, con los campos que viajan en data de cada uno. Esa lista de campos es la lista blanca real: no llega nada más, ni aunque el evento interno tenga más datos.
Pídelo antes de crear un destino en vez de escribir los tipos a mano: un evento mal escrito se rechaza con 400, no en silencio.
Alcance requerido: webhooks:manage.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "webhook_event_type",
- "type": "payment_link.paid",
- "description": "Un enlace de pago se pagó por completo. `code` y `amount` son los mismos que devuelve `GET /v1/payment_links/{code}`: el importe que el comercio le puso al enlace. `net_amount` es lo que acabó en su saldo, ya sin comisión ni IVA, y `net_currency` el activo en que se acreditó (puede no ser la moneda del enlace). `link_code` es un alias en desuso de `code`; se sigue mandando por compatibilidad.",
- "fields": [
- "code",
- "link_code",
- "amount",
- "currency",
- "net_amount",
- "net_currency",
- "payment_method",
- "metadata"
]
}, - {
- "object": "webhook_event_type",
- "type": "deposit.completed",
- "description": "Un depósito se confirmó y se abonó al saldo.",
- "fields": [
- "deposit_id",
- "amount",
- "asset",
- "method"
]
}
], - "has_more": false,
- "next_cursor": null
}Del más reciente al más antiguo. Sin paginar: el tope por cuenta son 10 destinos, así que la lista cabe siempre en una respuesta.
Nunca incluye el secreto de firma, sólo sus últimos cuatro caracteres.
Alcance requerido: webhooks:manage.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "webhook_endpoint",
- "id": "3e8b1d24-6f70-4c19-b2a5-0d9e7f4c6a13",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": true,
- "disabled_at": null,
- "disabled_reason": null,
- "consecutive_failures": 0,
- "last_success_at": "2026-09-01T14:22:10.000Z",
- "last_failure_at": null,
- "secret_rotated_at": null,
- "created_at": "2026-06-14T11:05:23.000Z"
}
], - "has_more": false,
- "next_cursor": null
}Única respuesta, junto con la rotación, que incluye signing_secret. Se muestra una sola vez: guárdalo al recibirlo, porque no se puede recuperar y perderlo obliga a rotar.
Con él verificas cada envío: la firma es un HMAC-SHA256 sobre el momento y el cuerpo tal cual llegó. El contrato completo está en la guía de webhooks enlazada en la portada.
El destino nace encendido.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| url required | string [ 1 .. 2000 ] characters URL a la que enviaremos los avisos. Tiene que ser |
| description | string <= 200 characters Etiqueta para distinguirlos cuando tienes varios. |
| enabled_events required | Array of strings [ 1 .. 50 ] items unique Eventos a los que se suscribe. Los válidos salen de |
{- "description": "Produccion — cobros",
- "enabled_events": [
- "payment_link.paid",
- "withdrawal.completed"
]
}{- "object": "webhook_endpoint",
- "id": "3e8b1d24-6f70-4c19-b2a5-0d9e7f4c6a13",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": true,
- "disabled_at": null,
- "disabled_reason": null,
- "consecutive_failures": 0,
- "last_success_at": null,
- "last_failure_at": null,
- "secret_rotated_at": null,
- "created_at": "2026-09-01T10:00:00.000Z",
- "signing_secret": "whsec_7f3a9c2e5b1d8a406c93e2f7b5a1d4c8"
}Útil para releer el estado sin descargarte la lista entera: live te dice si ahora mismo estás recibiendo avisos, y disabled_reason por qué no, si lo hemos apagado nosotros.
Alcance requerido: webhooks:manage.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "webhook_endpoint",
- "id": "9a1f7c3e-2b4d-4a68-9e05-7c1b3d5a8f24",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": false,
- "disabled_at": "2026-08-30T09:12:44.000Z",
- "disabled_reason": "5 entregas agotadas seguidas",
- "consecutive_failures": 5,
- "last_success_at": "2026-08-29T18:41:02.000Z",
- "last_failure_at": "2026-08-30T09:12:44.000Z",
- "secret_rotated_at": null,
- "created_at": "2026-06-14T11:05:23.000Z"
}Parcial: lo que no mandes, no se toca. El secreto de firma no cambia — para eso está la rotación.
Una description vacía la borra; omitirla la deja como estaba.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| url | string [ 1 .. 2000 ] characters URL a la que enviaremos los avisos. Tiene que ser |
| description | string <= 200 characters Etiqueta del destino. La cadena vacía la QUITA; omitir el campo la deja como está. |
| enabled_events | Array of strings [ 1 .. 50 ] items unique Eventos a los que se suscribe. Los válidos salen de |
{- "description": "Produccion — cobros",
- "enabled_events": [
- "payment_link.paid",
- "withdrawal.completed"
]
}{- "object": "webhook_endpoint",
- "id": "9a1f7c3e-2b4d-4a68-9e05-7c1b3d5a8f24",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": false,
- "disabled_at": "2026-08-30T09:12:44.000Z",
- "disabled_reason": "5 entregas agotadas seguidas",
- "consecutive_failures": 5,
- "last_success_at": "2026-08-29T18:41:02.000Z",
- "last_failure_at": "2026-08-30T09:12:44.000Z",
- "secret_rotated_at": null,
- "created_at": "2026-06-14T11:05:23.000Z"
}Dejamos de avisar a esa URL y su secreto se pierde. No se deshace.
Si sólo quieres dejar de recibir un rato, usa /disable: conserva el destino, su secreto y sus eventos.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "error": {
- "type": "invalid_request",
- "code": "idempotency_key_required",
- "message": "Falta la cabecera `Idempotency-Key`. Es obligatoria en todo método que crea o modifica.",
- "request_id": "req_9f2a4c8b7e1d3a5f"
}
}Además del interruptor, limpia la desactivación automática y su contador de fallos. Por eso encender y apagar son dos operaciones y no un campo booleano: no son la misma al revés.
Si lo apagamos nosotros porque tu servidor rechazaba los envíos, arréglalo antes de encenderlo: si sigue rechazando, se vuelve a apagar.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "object": "webhook_endpoint",
- "id": "9a1f7c3e-2b4d-4a68-9e05-7c1b3d5a8f24",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": false,
- "disabled_at": "2026-08-30T09:12:44.000Z",
- "disabled_reason": "5 entregas agotadas seguidas",
- "consecutive_failures": 5,
- "last_success_at": "2026-08-29T18:41:02.000Z",
- "last_failure_at": "2026-08-30T09:12:44.000Z",
- "secret_rotated_at": null,
- "created_at": "2026-06-14T11:05:23.000Z"
}Deja de recibir avisos conservando el destino, su secreto y sus eventos. Es lo que quieres durante un mantenimiento: dar de baja y volver a crear cambiaría el secreto.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "object": "webhook_endpoint",
- "id": "9a1f7c3e-2b4d-4a68-9e05-7c1b3d5a8f24",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": false,
- "disabled_at": "2026-08-30T09:12:44.000Z",
- "disabled_reason": "5 entregas agotadas seguidas",
- "consecutive_failures": 5,
- "last_success_at": "2026-08-29T18:41:02.000Z",
- "last_failure_at": "2026-08-30T09:12:44.000Z",
- "secret_rotated_at": null,
- "created_at": "2026-06-14T11:05:23.000Z"
}El secreto anterior deja de valer de inmediato. Despliega el nuevo ANTES de rotar, o firmarás con uno que tu servidor todavía no conoce: los envíos que rechace se reintentan durante horas, pero no para siempre, y cinco entregas agotadas seguidas apagan el destino.
Como en el alta, el secreto se devuelve una sola vez.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "object": "webhook_endpoint",
- "id": "3e8b1d24-6f70-4c19-b2a5-0d9e7f4c6a13",
- "description": "Producción",
- "enabled_events": [
- "payment_link.paid",
- "deposit.completed"
], - "secret_last_four": "4f9c",
- "enabled": true,
- "live": true,
- "disabled_at": null,
- "disabled_reason": null,
- "consecutive_failures": 0,
- "last_success_at": null,
- "last_failure_at": null,
- "secret_rotated_at": null,
- "created_at": "2026-09-01T10:00:00.000Z",
- "signing_secret": "whsec_7f3a9c2e5b1d8a406c93e2f7b5a1d4c8"
}Devuelve el desenlace real, no un acuse de que lo intentamos: si tu servidor contestó 500, aquí lo ves con su last_status_code y su last_error.
Es la forma de comprobar tu verificación de firma sin esperar a que ocurra un cobro de verdad. webhook.test no es suscribible: se manda a este destino aunque no lo tengas en enabled_events.
Alcance requerido: webhooks:manage.
Exige la cabecera Idempotency-Key.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
{- "object": "webhook_delivery",
- "id": "c7d2e491-3a58-4b6f-8102-9e4d7a3c5b60",
- "endpoint_id": "3e8b1d24-6f70-4c19-b2a5-0d9e7f4c6a13",
- "event_id": "evt_5b1d8a406c93e2f7",
- "event_type": "webhook.test",
- "status": "failed",
- "attempt_count": 1,
- "attempts": [
- {
- "attempt": 1,
- "at": "2026-09-06T12:30:11.482Z",
- "status_code": 500,
- "duration_ms": 214,
- "error_message": "El destino respondió 500"
}
], - "next_retry_at": "2026-09-06T12:31:11.482Z",
- "delivered_at": null,
- "last_status_code": 500,
- "last_error": "El destino respondió 500",
- "created_at": "2026-09-06T12:30:11.201Z"
}Del intento más reciente al más antiguo. Es lo PRIMERO que hay que mirar cuando un aviso no llega: dice si salió, cuántas veces se intentó, qué respondió tu servidor en cada intento y cuándo toca el siguiente.
status distingue los cuatro estados reales: pending (en cola), delivering (ahora mismo), succeeded y failed. Una entrega agotada se queda en failed con next_retry_at en null.
Para recorrer el histórico completo, repite la llamada pasando next_cursor en cursor mientras has_more sea true.
Alcance requerido: webhooks:manage.
| id required | string |
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántas entregas por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| status | string Enum: "pending" "delivering" "succeeded" "failed" Example: status=failed Devuelve sólo las entregas con este desenlace. Lo normal es venir a buscar |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "webhook_delivery",
- "id": "c3f1a9d4-2b8e-4a6f-9c1d-7e5b0a3f8d2c",
- "endpoint_id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
- "event_id": "evt_7c3d1a2b9e4f",
- "event_type": "payment_link.paid",
- "status": "failed",
- "attempt_count": 3,
- "attempts": [
- {
- "attempt": 1,
- "at": "2026-09-07T18:22:41.000Z",
- "status_code": 500,
- "duration_ms": 812,
- "error_message": null
}, - {
- "attempt": 2,
- "at": "2026-09-07T18:23:41.000Z",
- "status_code": 500,
- "duration_ms": 774,
- "error_message": null
}, - {
- "attempt": 3,
- "at": "2026-09-07T18:28:41.000Z",
- "status_code": null,
- "duration_ms": 10000,
- "error_message": "timeout"
}
], - "next_retry_at": "2026-09-07T18:43:41.000Z",
- "delivered_at": null,
- "last_status_code": null,
- "last_error": "timeout",
- "created_at": "2026-09-07T18:22:40.000Z"
}, - {
- "object": "webhook_delivery",
- "id": "b2e0f8c3-1a7d-4b5e-8f0c-6d4a9e2b7f1a",
- "endpoint_id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
- "event_id": "evt_4f2a8b1c7d3e",
- "event_type": "deposit.completed",
- "status": "succeeded",
- "attempt_count": 1,
- "attempts": [
- {
- "attempt": 1,
- "at": "2026-09-07T17:05:12.000Z",
- "status_code": 200,
- "duration_ms": 143,
- "error_message": null
}
], - "next_retry_at": null,
- "delivered_at": "2026-09-07T17:05:12.000Z",
- "last_status_code": 200,
- "last_error": null,
- "created_at": "2026-09-07T17:05:11.000Z"
}
], - "has_more": true,
- "next_cursor": "eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wN1QxNzowNToxMS4wMDBaIn0"
}Tus propias llamadas a la API: qué pediste, qué respondimos y cuándo. Es lo primero que hay que mirar cuando algo no cuadra.
Devuelve las llamadas de la más reciente a la más antigua, de todas las credenciales de la cuenta. Para recorrer el histórico, repite la llamada pasando next_cursor en cursor mientras has_more sea true.
Es el primer sitio donde mirar antes de abrir un ticket: si tu llamada no aparece aquí, no nos llegó.
Ojo con dos campos que se parecen: call_request_id es el req_… de la llamada REGISTRADA (el que abres en un ticket) y request_id, al nivel de la respuesta, es el de esta consulta.
Alcance requerido: logs:read.
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántas llamadas por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| api_key_id | string <uuid> Example: api_key_id=d41f8a2c-9b73-4e15-a6c8-3f0e7b2d1a94 Sólo las llamadas hechas con ESTA credencial. |
| method | string Enum: "GET" "POST" "PUT" "PATCH" "DELETE" Example: method=POST Sólo las llamadas con este método HTTP. |
| status | number <int32> [ 100 .. 599 ] Example: status=429 Código HTTP exacto. |
| failed | boolean Example: failed=true
|
| created_after | string <date-time> Example: created_after=2026-09-01T00:00:00Z Sólo llamadas hechas en o después de esta fecha. |
| created_before | string <date-time> Example: created_before=2026-09-01T00:00:00Z Sólo llamadas hechas en o antes de esta fecha. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "request_log",
- "id": "5c4b3a2f-1e0d-4c9b-8a76-5f4e3d2c1b0a",
- "call_request_id": "req_9f2a4c8b7e1d3a5f",
- "api_key_id": "7c1f0a4e-3d2b-4f9a-8b11-2e6c9d4a5f30",
- "method": "POST",
- "path": "/v1/payment_links",
- "status": 201,
- "error_code": null,
- "duration_ms": 184,
- "ip": "187.190.12.44",
- "idempotency_key": "9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c",
- "idempotent_replay": false,
- "created_at": "2026-08-04T14:30:00.000Z"
}
], - "has_more": false,
- "next_cursor": null
}Añade al listado los parámetros y el cuerpo de la petición, redactados: los campos con nombre sensible (contraseñas, secretos, firmas, tarjetas) salen como [REDACTED] y los valores muy largos, truncados.
El cuerpo de la RESPUESTA no se guarda: lo que se conserva es status y error_code, que es lo que necesitas para decidir qué hacer.
Alcance requerido: logs:read.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "request_log",
- "id": "5c4b3a2f-1e0d-4c9b-8a76-5f4e3d2c1b0a",
- "call_request_id": "req_9f2a4c8b7e1d3a5f",
- "api_key_id": "7c1f0a4e-3d2b-4f9a-8b11-2e6c9d4a5f30",
- "method": "POST",
- "path": "/v1/payment_links",
- "status": 422,
- "error_code": "idempotency_key_reused",
- "duration_ms": 41,
- "ip": "187.190.12.44",
- "idempotency_key": "9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c",
- "idempotent_replay": false,
- "created_at": "2026-08-04T14:30:00.000Z",
- "query": { },
- "request_body": {
- "amount": "1500.00",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "webhook_secret": "[REDACTED]"
}, - "user_agent": "binkio-node/1.4.2"
}Dónde te pueden mandar dinero —CLABE, llave Bre-B, direcciones on-chain— y qué ha entrado. Sólo lectura: un depósito lo inicia quien envía.
Todos los sitios a los que tu cuenta puede recibir: la CLABE para SPEI, la llave Bre-B para Colombia y las direcciones on-chain, cada una con su red.\n\nMira usable. Una vía recién aprovisionada puede estar todavía en trámite con el proveedor; enseñársela a un pagador antes de tiempo es perder el dinero que mande.\n\n:::danger La red importa más que la dirección\nEn las instrucciones de cripto, network es la red EXACTA. Mandar el mismo activo por otra red pierde el dinero y no se recupera. Enséñala junto a la dirección, siempre.\n:::\n\nEstos datos son estables: la CLABE de una cuenta no cambia. Se pueden guardar, pero conviene refrescarlos cuando aparezca un activo nuevo.
Alcance requerido: deposits:read.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "deposit_instruction",
- "rail": "spei",
- "asset": "MXNB",
- "currency": "MXN",
- "usable": true,
- "clabe": "710969000000123456",
- "bank_name": "Nvio"
}, - {
- "object": "deposit_instruction",
- "rail": "crypto",
- "asset": "USDC",
- "currency": "USDC",
- "usable": true,
- "address": "0x9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b",
- "network": "ETHEREUM"
}, - {
- "object": "deposit_instruction",
- "rail": "crypto",
- "asset": "USDC",
- "currency": "USDC",
- "usable": true,
- "address": "0x4f2a8b1c7d3e5a9f0b6c2d8e1a3f7b5c9d0e2a4f",
- "network": "BASE"
}, - {
- "object": "deposit_instruction",
- "rail": "breb",
- "asset": "COP",
- "currency": "COP",
- "usable": false,
- "breb_key": "@CB5LU67NI"
}
], - "has_more": false,
- "next_cursor": null
}Del más reciente al más antiguo, con el riel por el que llegó y de dónde vino cuando el proveedor lo informa.\n\nPara enterarte de un depósito EN CUANTO llega, suscríbete a deposit.completed en vez de sondear aquí. → /v1/webhook_endpoints
Alcance requerido: deposits:read.
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántos depósitos por página. |
| status | string Enum: "processing" "completed" "failed" Example: status=completed Devuelve sólo los depósitos en este estado. El filtro se aplica en la consulta, así que la página viene llena y se puede paginar. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "deposit",
- "id": "e2f8a1c4-6b09-4d73-8e5a-1c7f3b90d426",
- "status": "completed",
- "rail": "spei",
- "amount": "25000.00000000",
- "asset": "MXNB",
- "source": "012180001234567890",
- "provider_reference": "JUNO-ISS-7C3D1A2B",
- "created_at": "2026-09-08T10:14:02.000Z",
- "completed_at": "2026-09-08T10:14:37.000Z"
}, - {
- "object": "deposit",
- "id": "c5b1d704-9a3e-4f28-b6c0-7d2e8a1f403b",
- "status": "processing",
- "rail": "crypto",
- "amount": "500.00000000",
- "asset": "USDC",
- "source": "0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b",
- "provider_reference": null,
- "created_at": "2026-09-08T09:51:18.000Z",
- "completed_at": null
}
], - "has_more": false,
- "next_cursor": null
}Tres estados: processing (llegó y se está confirmando), completed (acreditado en tu saldo) y failed.\n\n**processing no es un fallo**: un depósito en cadena espera confirmaciones y uno por transferencia espera al banco.
Alcance requerido: deposits:read.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "deposit",
- "id": "e2f8a1c4-6b09-4d73-8e5a-1c7f3b90d426",
- "status": "completed",
- "rail": "spei",
- "amount": "25000.00000000",
- "asset": "MXNB",
- "source": "012180001234567890",
- "provider_reference": "JUNO-ISS-7C3D1A2B",
- "created_at": "2026-09-08T10:14:02.000Z",
- "completed_at": "2026-09-08T10:14:37.000Z"
}Cambiar el saldo de un activo a otro. Dos pasos: pedir precio y ejecutarlo, porque el precio caduca.
Devuelve cuánto recibirías, a qué tasa y hasta cuándo vale ese precio. No mueve dinero y no consume nada: cotizar dos veces devuelve dos precios distintos si el mercado se movió, que es lo correcto.\n\nExige Idempotency-Key, como todo POST de la API. Ojo a la consecuencia: repetir la misma clave devuelve la cotización GUARDADA, no una nueva. Para pedir precio otra vez, clave nueva.\n\nGuarda el quote_id: es lo único que POST /v1/conversions acepta para ejecutar ESTE precio.\n\nto_amount ya trae la comisión descontada — es lo que de verdad entra en tu cuenta, no el bruto.\n\nSi off_market viene en true, el mercado del par está cerrado (fin de semana, festivo) y la tasa es peor de lo habitual. Es la única explicación de por qué el precio de un domingo no es el del martes.
Alcance requerido: conversions:read.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| from_asset required | string Enum: "MXNB" "USDC" "USDT" "COP" Activo de origen. |
| to_asset required | string Enum: "MXNB" "USDC" "USDT" "COP" Activo de destino. |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Cuánto convertir, expresado en |
{- "from_asset": "USDC",
- "to_asset": "MXNB",
- "amount": "1500.00"
}{- "object": "conversion_quote",
- "quote_id": "cq_7f3a2b9c1d4e8a6f",
- "from_asset": "MXNB",
- "to_asset": "USDC",
- "from_amount": "30000.00000000",
- "to_amount": "1738.52000000",
- "exchange_rate": "17.25000000",
- "fee": "17.39000000",
- "fee_percentage": "1.00",
- "expires_at": "2026-09-08T14:32:10.000Z",
- "off_market": false
}Convierte al precio que devolvió POST /v1/conversions/quote. El quote_id es obligatorio: no se puede ejecutar «lo último que cotizaste», porque entonces no habría forma de saber qué precio aceptaste.\n\nfrom_asset, to_asset y amount van ADEMÁS del quote_id y se contrastan con lo que guardamos al cotizar. Si no cuadran, se rechaza — es lo que impide que reusar por error un quote_id de otro par convierta algo distinto de lo que aceptaste.\n\nmax_slippage_bps acota cuánto puede empeorar la tasa entre las dos llamadas. Entre cotizar y ejecutar pasa tiempo real y el mercado se mueve: sin tope, una ejecución tardía se liquida a un precio que nadie aceptó.\n\nLa respuesta puede llegar en processing: las rutas de dos patas —vender y emitir— no terminan en la misma llamada. processing no es un fallo.
Alcance requerido: conversions:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| quote_id required | string El |
| from_asset required | string Enum: "MXNB" "USDC" "USDT" "COP" Activo de origen. Debe coincidir con el de la cotización: si no, se rechaza sin convertir nada. |
| to_asset required | string Enum: "MXNB" "USDC" "USDT" "COP" Activo de destino. Debe coincidir con el de la cotización. |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Importe a convertir. Debe coincidir con el de la cotización. |
| max_slippage_bps | number <int32> [ 0 .. 1000 ] Cuánto puede empeorar la tasa entre cotizar y ejecutar, en puntos básicos (100 bps = 1 %). Si se supera, la conversión falla en vez de liquidarse a un precio que nadie aceptó. |
{- "quote_id": "qt_9f2a4c8b7e1d3a5f",
- "from_asset": "USDC",
- "to_asset": "MXNB",
- "amount": "1500.00",
- "max_slippage_bps": 50
}{- "object": "conversion",
- "id": "a7c2e910-4b6d-4f83-9e21-c5b8a0d3f742",
- "status": "completed",
- "from_asset": "MXNB",
- "to_asset": "USDC",
- "from_amount": "30000.00000000",
- "to_amount": "1738.52000000",
- "exchange_rate": "17.25000000",
- "fee": "17.39000000",
- "failure_reason": null,
- "created_at": "2026-09-08T14:30:04.000Z",
- "completed_at": "2026-09-08T14:30:21.000Z"
}Para conciliar: from_amount es lo que salió del activo de origen y to_amount lo que entró en el de destino. La diferencia contra la tasa es la comisión.
Alcance requerido: conversions:read.
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántas conversiones por página. |
| status | string Enum: "processing" "completed" "failed" Example: status=completed Devuelve sólo las conversiones en este estado. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "conversion",
- "id": "a7c2e910-4b6d-4f83-9e21-c5b8a0d3f742",
- "status": "completed",
- "from_asset": "MXNB",
- "to_asset": "USDC",
- "from_amount": "30000.00000000",
- "to_amount": "1738.52000000",
- "exchange_rate": "17.25000000",
- "fee": "17.39000000",
- "failure_reason": null,
- "created_at": "2026-09-08T14:30:04.000Z",
- "completed_at": "2026-09-08T14:30:21.000Z"
}, - {
- "object": "conversion",
- "id": "b93f1d05-8e2a-4c71-b6f4-2d90a7e13c68",
- "status": "failed",
- "from_asset": "USDC",
- "to_asset": "MXNB",
- "from_amount": "2000.00000000",
- "to_amount": null,
- "exchange_rate": "17.10000000",
- "fee": "20.00000000",
- "failure_reason": "issuance rejected by provider",
- "created_at": "2026-09-05T11:02:44.000Z",
- "completed_at": null
}
], - "has_more": false,
- "next_cursor": null
}Tres estados: processing (en marcha), completed (el saldo ya está en el activo de destino) y failed.\n\nCuando falla, failure_reason dice QUÉ paso falló. Importa: una conversión por la vía de mercado tiene dos patas —vender y emitir— y saber cuál se cayó es lo que decide si tiene sentido reintentar.
Alcance requerido: conversions:read.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "conversion",
- "id": "a7c2e910-4b6d-4f83-9e21-c5b8a0d3f742",
- "status": "completed",
- "from_asset": "MXNB",
- "to_asset": "USDC",
- "from_amount": "30000.00000000",
- "to_amount": "1738.52000000",
- "exchange_rate": "17.25000000",
- "fee": "17.39000000",
- "failure_reason": null,
- "created_at": "2026-09-08T14:30:04.000Z",
- "completed_at": "2026-09-08T14:30:21.000Z"
}Sacar el dinero cobrado hacia tus cuentas bancarias. Sólo a destinos ya dados de alta: la API no puede añadir uno nuevo.
Las cuentas bancarias dadas de alta en el panel, que son las únicas a las que la API puede enviar dinero. El id de una de ellas es lo que lleva POST /v1/withdrawals.\n\nMira usable antes de ordenar un retiro. Una cuenta recién dada de alta está esperando al proveedor y no admite envíos todavía; ordenar contra ella falla más adelante, con el saldo ya apartado.\n\nDel número de cuenta se publican sólo los últimos cuatro dígitos: sirven para reconocerla en una pantalla, y para ordenar el retiro se usa el id.
Alcance requerido: withdrawals:read.
| rail | string Enum: "spei" "wire" Example: rail=spei Devuelve sólo los destinos de este riel. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "payout_destination",
- "id": "d41f8a2c-9b73-4e15-a6c8-3f0e7b2d1a94",
- "rail": "spei",
- "alias": "Cuenta principal",
- "beneficiary_name": "Tienda Ejemplo SA de CV",
- "bank_name": "BBVA México",
- "last_four": "3456",
- "currency": "MXN",
- "usable": true,
- "created_at": "2026-07-02T09:14:03.000Z"
}, - {
- "object": "payout_destination",
- "id": "e58c0b19-4d2f-4a7e-b91c-5a3d8f0e2b76",
- "rail": "wire",
- "alias": null,
- "beneficiary_name": "Ejemplo Corp",
- "bank_name": "Bank of Example",
- "last_four": "7788",
- "currency": "USD",
- "usable": false,
- "created_at": "2026-09-06T16:40:22.000Z"
}
], - "has_more": false,
- "next_cursor": null
}Saca dinero de tu saldo hacia una de tus cuentas. El riel —SPEI o transferencia internacional— lo decide el destino, no tú.\n\nEsta llamada no se deshace. Usa como Idempotency-Key un identificador tuyo y estable (el número de la orden de pago, el del lote), nunca un aleatorio: un aleatorio hace que cada reintento sea un retiro nuevo.\n\nfee_mode decide quién pone la comisión. Con net_out (por defecto) pides 1.000 y llegan 1.000 menos comisión; con gross_up llegan 1.000 exactos y de tu saldo sale algo más.\n\nLa respuesta llega en processing: el dinero está en camino, no entregado. El desenlace llega por el webhook withdrawal.completed o withdrawal.failed, y también se puede consultar aquí.
Alcance requerido: withdrawals:write.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| destination_id required | string <uuid> El destino al que enviar, tomado de |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Importe a retirar, en la divisa del destino. |
| concept required | string [ 1 .. 40 ] characters Lo que verá el beneficiario en su estado de cuenta. El tope de 40 caracteres lo impone SPEI. |
| fee_mode | string Default: "net_out" Enum: "net_out" "gross_up" Quién asume la comisión. |
{- "destination_id": "d41f8a2c-9b73-4e15-a6c8-3f0e7b2d1a94",
- "amount": "1500.00",
- "concept": "Liquidacion septiembre",
- "fee_mode": "net_out"
}{- "object": "withdrawal",
- "id": "9f3b1c7e-2a4d-4e8f-b0c6-1d5a2e9f4b83",
- "status": "processing",
- "rail": "spei",
- "destination_last_four": "3456",
- "amount": "5015.50000000",
- "net_amount": "5000.00000000",
- "fee": "15.50000000",
- "asset": "MXNB",
- "concept": "Liquidacion semana 36",
- "provider_reference": null,
- "receipt_url": null,
- "failure_reason": null,
- "created_at": "2026-09-07T19:02:11.000Z",
- "completed_at": null
}Para conciliar: amount es lo que salió de tu saldo y net_amount lo que recibió el destino. La diferencia es la comisión.\n\nreceipt_url trae el CEP —el comprobante oficial de Banxico— en cuanto el proveedor lo publica. Es lo que vale como prueba ante quien cobró.
Alcance requerido: withdrawals:read.
| limit | number <int32> [ 1 .. 100 ] Default: 25 Example: limit=25 Cuántos retiros por página. |
| cursor | string <= 512 characters Example: cursor=eyJ2IjoxLCJ0IjoiMjAyNi0wOS0wOFQxNzo1ODo0Mi40MzgyMzRaIn0 El |
| status | string Enum: "processing" "completed" "failed" "cancelled" Example: status=completed Devuelve sólo los retiros en este estado. |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "list",
- "data": [
- {
- "object": "withdrawal",
- "id": "9f3b1c7e-2a4d-4e8f-b0c6-1d5a2e9f4b83",
- "status": "processing",
- "rail": "spei",
- "destination_last_four": "3456",
- "amount": "5015.50000000",
- "net_amount": "5000.00000000",
- "fee": "15.50000000",
- "asset": "MXNB",
- "concept": "Liquidacion semana 36",
- "provider_reference": null,
- "receipt_url": null,
- "failure_reason": null,
- "created_at": "2026-09-07T19:02:11.000Z",
- "completed_at": null
}, - {
- "object": "withdrawal",
- "id": "4c8e2f1a-7b3d-4956-8a2e-0f6c1b9d3e57",
- "status": "completed",
- "rail": "spei",
- "destination_last_four": "3456",
- "amount": "12030.00000000",
- "net_amount": "12000.00000000",
- "fee": "30.00000000",
- "asset": "MXNB",
- "concept": "Liquidacion semana 35",
- "provider_reference": "BNK7C3D1A2B",
- "failure_reason": null,
- "created_at": "2026-08-31T19:02:11.000Z",
- "completed_at": "2026-08-31T19:04:38.000Z"
}
], - "has_more": false,
- "next_cursor": null
}El estado real, sin depender de que el webhook haya llegado.\n\nCuatro estados: processing (en camino), completed (llegó), failed (no salió, el saldo volvió a tu cuenta) y cancelled. processing no es un fallo: un SPEI tarda minutos y una transferencia internacional, días.
Alcance requerido: withdrawals:read.
| id required | string |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "withdrawal",
- "id": "9f3b1c7e-2a4d-4e8f-b0c6-1d5a2e9f4b83",
- "status": "processing",
- "rail": "spei",
- "destination_last_four": "3456",
- "amount": "5015.50000000",
- "net_amount": "5000.00000000",
- "fee": "15.50000000",
- "asset": "MXNB",
- "concept": "Liquidacion semana 36",
- "provider_reference": null,
- "receipt_url": null,
- "failure_reason": null,
- "created_at": "2026-09-07T19:02:11.000Z",
- "completed_at": null
}El destino va en el cuerpo y no se valida contra ninguna lista: no hay direcciones dadas de alta que comprobar. Es lo que separa esta llamada de POST /v1/withdrawals, y por eso lleva su propio alcance.
:::danger Esto no se deshace, y no hay a quién reclamar Una dirección equivocada, o la red equivocada, pierde el dinero para siempre. No lo recupera soporte, ni el proveedor, ni nosotros. Valida la dirección en tu lado antes de llamar, y no la construyas concatenando cadenas. :::
network es obligatorio y no tiene valor por defecto. El mismo activo vive en varias redes y la dirección no dice en cuál: deducirla por ti sería acertar casi siempre y perder el dinero el resto de las veces.
A partir de cierto importe hace falta beneficiary (Regla de Viaje, FATF R.16). Se pide ANTES de mover nada: sin esos datos el proveedor rechaza el envío, y para entonces el saldo ya está apartado.
Alcance requerido: withdrawals:crypto.
Exige la cabecera Idempotency-Key.
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
| Idempotency-Key required | string Example: 9f2a4c8b-7e1d-4a5f-8c3b-2d1e0f9a8b7c Clave única de la operación (uuid o cadena de ≤255). Reintentar con la misma clave y el mismo cuerpo devuelve la respuesta guardada, con |
| asset required | string Enum: "MXNB" "USDC" "USDT" Activo a enviar. |
| amount required | string^\d{1,12}(\.\d{1,8})?$ Importe a enviar, en el activo indicado. |
| address required | string [ 20 .. 128 ] characters Dirección de destino. No se valida contra ninguna lista: sólo se comprueba la forma. Que sea la dirección correcta es cosa tuya, y el envío no tiene vuelta atrás. |
| network required | string [ 2 .. 32 ] characters Red por la que enviar. Obligatorio y sin valor por defecto: el mismo activo vive en varias redes, la dirección se parece, y enviarlo por la equivocada lo pierde. Las redes disponibles para cada activo salen de lo que el proveedor admita en ese momento. |
| fee_mode | string Default: "net_out" Enum: "net_out" "gross_up" Quién asume la comisión. |
object Datos del beneficiario, exigidos por la Regla de Viaje a partir de cierto importe (FATF R.16). Por debajo del umbral se ignoran. |
{- "asset": "USDC",
- "amount": "500.00",
- "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
- "network": "arbitrum",
- "fee_mode": "net_out",
- "beneficiary": {
- "first_name": "Ana",
- "last_name": "Martinez",
- "country": "MX",
- "vasp_name": "Binance",
- "vasp_country": "MT"
}
}{- "object": "withdrawal",
- "id": "9f3b1c7e-2a4d-4e8f-b0c6-1d5a2e9f4b83",
- "status": "processing",
- "rail": "spei",
- "destination_last_four": "3456",
- "amount": "5015.50000000",
- "net_amount": "5000.00000000",
- "fee": "15.50000000",
- "asset": "MXNB",
- "concept": "Liquidacion semana 36",
- "provider_reference": null,
- "receipt_url": null,
- "failure_reason": null,
- "created_at": "2026-09-07T19:02:11.000Z",
- "completed_at": null
}La pantalla que ve el PAGADOR. Sin credencial, a propósito: quien paga no tiene cuenta con nosotros.
Público: la credencial es el propio código del enlace. Devuelve el importe, quién cobra, las instrucciones de cada método y hasta cuándo vale cada importe. Un método con la cotización vencida no trae ni importe ni instrucciones: enviar dinero contra un importe caducado no acredita.
Alcance requerido: ninguno. Basta una credencial válida — es una comprobación, y exigir un alcance para ella empujaría a emitir claves más permisivas de lo necesario.
| code required | string Example: PL-A1B2-C3D4-E5F6 |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "checkout",
- "code": "PL-A1B2-C3D4-E5F6",
- "status": "active",
- "payable": true,
- "unpayable_reason": null,
- "amount": "1500.00000000",
- "currency": "MXNB",
- "description": "Pedido #10432",
- "merchant": {
- "object": "checkout_merchant",
- "name": "Tienda Ejemplo"
}, - "server_time": "2026-09-07T18:30:00.000Z",
- "expires_at": "2026-09-08T18:30:00.000Z",
- "expires_in": 86400,
- "paid_at": null,
- "qr": {
- "object": "checkout_qr",
- "format": "svg",
- "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 29 29\" shape-rendering=\"crispEdges\"><path fill=\"#fff\" d=\"M0 0h29v29H0z\"/><path stroke=\"#000\" d=\"M1 1.5h7m2 0h1m1 0h7\"/></svg>"
}, - "methods": [
- {
- "object": "checkout_method",
- "method": "SPEI",
- "asset": "MXN",
- "requires_conversion": true,
- "payable": true,
- "quote": {
- "object": "checkout_quote",
- "status": "locked",
- "amount_due": "1522.50",
- "fee": "0.00",
- "exchange_rate": "1.00000000",
- "expires_at": "2026-09-07T18:45:00.000Z",
- "expires_in": 900
}, - "instructions": {
- "clabe": "710969000000123456",
- "beneficiary": "Binkio SA de CV",
- "reference": "BNKA1B2C3"
}
}, - {
- "object": "checkout_method",
- "method": "MXNB",
- "asset": "MXNB",
- "requires_conversion": false,
- "payable": true,
- "quote": {
- "object": "checkout_quote",
- "status": "native",
- "amount_due": "1500.00000000",
- "fee": "0.00000000"
}, - "instructions": {
- "address": "0x9c8b7e1d3a5f6c2b0a9d8e7f6a5b4c3d2e1f0a9b",
- "network": "ARBITRUM"
}
}
], - "realtime": {
- "object": "checkout_realtime",
- "transport": "socket.io",
- "namespace": "/checkout",
- "path": "/socket.io",
- "join": {
- "event": "checkout:join",
- "payload": {
- "code": "PL-A1B2-C3D4-E5F6"
}
}, - "notify_events": [
- "payment_link:paid",
- "payment_link:quotes_updated"
], - "poll_interval_seconds": 5
}
}Respuesta mínima y sin QR. Pensado para llamarse tras un aviso del canal en tiempo real, o cada poll_interval_seconds si no se puede usar. Es la FUENTE DE VERDAD del estado: la carga útil de los eventos del socket no forma parte de este contrato.
Alcance requerido: ninguno. Basta una credencial válida — es una comprobación, y exigir un alcance para ella empujaría a emitir claves más permisivas de lo necesario.
| code required | string Example: PL-A1B2-C3D4-E5F6 |
| Binkio-Version | string Example: 2026-09-09 Versión del contrato para esta llamada. Sin ella se aplica la que tiene fijada tu credencial, que no cambia sola. Sirve para probar una versión nueva en una llamada suelta antes de adoptarla. Una versión que no existe se rechaza con |
{- "object": "checkout_status",
- "code": "PL-A1B2-C3D4-E5F6",
- "status": "active",
- "payable": true,
- "unpayable_reason": null,
- "paid_at": null,
- "server_time": "2026-09-07T18:30:00.000Z"
}