Skip to main content
Cada notificación llega como un POST con Content-Type: application/json a la URL de tu webhook. El cuerpo es un objeto JSON con dos partes en la raíz: el recurso que cambió, bajo su propio nombre (payment, charge, cashout…), y event, con los datos del evento.

Estructura general

Aquí el objeto del recurso va recortado a tres campos; los ejemplos de cada evento, más abajo, lo traen completo.
string
Nombre del evento, por ejemplo charge.paid. Es el mismo valor que llega en el header x-webhook-event.
integer
Momento en que OnePay generó el evento, en segundos Unix (UTC).
string
live para eventos de producción y test para eventos del modo de pruebas. Cada webhook recibe solo los eventos de su ambiente.
string
ID de tu empresa, la dueña del webhook que recibe el evento.

Dónde viene el recurso en cada evento

Cómo deduplicar

El mismo evento puede llegar más de una vez (ver Entrega y reintentos). En la mayoría de los eventos alcanza con event.type + el id del recurso, porque cada uno marca un cambio de estado que ocurre una sola vez. Estos cuatro, en cambio, se repiten legítimamente sobre el mismo recurso, y deduplicarlos solo por id te haría perder eventos reales:

Pagos

Los campos propios del cobro llegan en el primer nivel de payment. Los datos relacionados, en cambio, llegan cada uno en una clave numérica, envueltos en data: por ejemplo, el pagador está en payment["2"].data.customer. Las posiciones son fijas:
Una clave sin contenido llega como arreglo vacío ([]), nunca se omite. En los eventos payment.message.* las claves "0" a "4" llegan siempre como [].
Llega con la misma forma que payment.partially_paid. Cambian status, que pasa a partial_expired, y event:

Cargos

El charge.id es el charge_id que devuelve POST /charges.
source trae el recurso que originó el cargo (normalmente el cobro) con todos sus atributos; aquí se muestra recortado. Su status puede ir un paso atrás del cargo, así que el resultado del cargo léelo en charge.status. Cuando el medio es una cuenta (payment_method_type: "Account"), method trae la cuenta con los campos de account, sin customer.

Dispersiones

commissions trae solo lo que la dispersión cobró. Cuando falla o se cancela, las comisiones que se devuelven a tu saldo ya no aparecen. Los motivos de remarks están en Dispersiones.

Suscripciones

Igual que en los pagos, el plan llega en una clave numérica: subscription["0"].data.plan. Si la suscripción no tiene plan, plan llega en null.
Llega con la misma forma de subscription.paid, sin la clave payment en la raíz:
En subscription.paid, payment.id es el ID del pago de la cuota y payment.payment_id el del cobro con el que se pagó.

Cuentas bancarias

En los eventos account.*, customer llega siempre como []: identifica al cliente con customer_id.

Facturas

A diferencia de los eventos payment.*, el payment que viene dentro de invoice trae sus datos relacionados en el primer nivel (company, splits, customer, commission, method), sin claves numéricas. En invoice.created llega como [].
Si la factura se borró o el proveedor la retiró, payment llega como []:
Si se canceló porque el proveedor la reportó pagada por fuera de OnePay (status: "PAID_FROM_PROVIDER"), payment trae el cobro con la misma forma que en invoice.paid.
Las facturas creadas en OnePay (facturación electrónica) traen además, en invoice, los campos fiscales fiscal_status, stamp_policy, currency, customer, items, stampings y totals. En los eventos de timbrado, total va en centavos.

¿Necesitas un evento que no está en esta lista? Revisa la lista completa de eventos y configura tu webhook para recibirlos.