Qué significa
Cobrix confirmó el pago por verificación automática, aprobación manual, débito inmediato o pasarela. Este evento solo se emite después de una aprobación real; completar el checkout o encontrar una transacción sin validar todas sus condiciones no es suficiente.Payload completo
{
"id": "evt_40544883-5dd6-420d-960a-f473ec2a754a",
"event": "payment.succeeded",
"created_at": "2026-07-14T16:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_842f7712",
"checkoutSessionId": "cs_5e52b98d",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "[email protected]",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": ["internet"],
"status": "active",
"customFieldsData": null,
"type": "individual",
"address": {
"street": "Av. Principal",
"city": "San Cristóbal",
"state": "Táchira",
"postalCode": "5001",
"country": "VE"
}
},
"amount": 12.5,
"amountMinor": 1250,
"amountSource": "ocr",
"documentAmountDue": 25,
"documentAmountDueMinor": 2500,
"documentCurrency": "USD",
"expectedAmount": 12.5,
"expectedAmountMinor": 1250,
"isPartialPayment": false,
"appliedAmount": 25,
"appliedAmountMinor": 2500,
"remainingBalance": 0,
"remainingBalanceMinor": 0,
"verification": {
"status": "verified",
"attemptCount": 1,
"automaticApproval": true,
"provider": "bdv",
"lastOutcome": "1000"
},
"currency": "VES",
"method": "pagoMovil",
"payment": {
"id": "pay_842f7712",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_5e52b98d",
"subscriptionId": null,
"status": "succeeded",
"reconciliationStatus": "matched",
"amount": 12.5,
"amountMinor": 1250,
"currency": "VES",
"referenceAmountMinor": 2500,
"referenceCurrency": "USD",
"provider": null,
"providerChargeId": null,
"hasPaymentReference": true,
"paymentReference": "PAY-9001",
"paymentReferenceMasked": "****9001",
"hasProof": true,
"paidAt": "2026-07-14T16:00:00.000Z",
"valueDate": null,
"createdAt": "2026-07-14T15:59:00.000Z",
"updatedAt": "2026-07-14T16:00:00.000Z",
"exchange": {
"targetCurrency": "USD",
"rate": 0.5,
"rateDate": "2026-07-18T02:14:48.521Z",
"rateSource": "manual",
"convertedAmount": 25,
"convertedAmountMinor": 2500
}
},
"paymentMethod": {
"kind": "pago_movil",
"method": "pagoMovil",
"label": "Pago móvil",
"channel": "proof",
"provider": "pago_movil",
"isManual": false,
"requiresReconciliation": false,
"receiver": null,
"receiverCheck": null,
"submitted": null,
"review": {
"requiresReview": false,
"reasons": [],
"ocrVerdict": null,
"ocrConfidence": null
}
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"externalInvoiceId": "erp-1001",
"source": "erp_acme",
"currency": "USD",
"remainingBalanceMinor": "0",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"paymentReference": "PAY-9001",
"status": "succeeded",
"subscriptionId": null,
"paidAt": "2026-07-14T16:00:00.000Z",
"exchange": {
"targetCurrency": "USD",
"rate": 0.5,
"rateDate": "2026-07-18T02:14:48.521Z",
"rateSource": "manual",
"convertedAmount": 25,
"convertedAmountMinor": 2500
},
"reconciledAt": "2026-07-14T16:00:00.000Z",
"requiresReview": false,
"reviewReasons": []
}
}
Regla de implementación
Usadata.paymentId como identificador estable. Si ya procesaste ese pago, responde 200 sin repetir la acreditación. No deduzcas el monto desde texto ni desde la deuda del documento: usa amountMinor y currency para el dinero recibido.
Monedas y montos
| Campo | Moneda | Significado |
|---|---|---|
amountMinor | currency | Monto financiero recibido. Si amountSource es ocr, coincide con el comprobante persistido. |
expectedAmountMinor | currency | Monto elegido por el cliente y validado exactamente contra el OCR. |
documentAmountDueMinor | documentCurrency | Deuda congelada al enviar el checkout. |
appliedAmountMinor | documentCurrency | Monto aplicado después de la aprobación real. |
remainingBalanceMinor | documentCurrency | Saldo del documento después de aplicar. |
No compares directamente
amountMinor con documentAmountDueMinor cuando currency y documentCurrency son distintas. Usa exchange y los campos de aplicación ya calculados por Cobrix.Si necesitas conocer qué documentos fueron afectados, procesa también
payment.applied_to_collection_document.
