# Certificación para producción
Source: https://docs.cobrix.co/api-guides/certification
Lista de aceptación antes de usar datos y pagos reales
## Matriz mínima en sandbox
Autenticación válida, llave revocada y scope insuficiente
Firma válida, firma alterada y timestamp vencido
Idempotencia repetida y conflicto por cuerpo diferente
Creación, consulta, actualización y cancelación de documentos de cobro
Pago aplicado, tasa certificada y consulta del resultado
Webhook válido, firma inválida, duplicado y reintento
Rate limiting y respeto de `Retry-After`
## Requisitos del receptor de webhooks
* HTTPS con certificado válido.
* Conservación del cuerpo crudo.
* Comparación timing-safe de firmas.
* Respuesta rápida antes de ejecutar lógica pesada.
* Deduplicación durable por ID o combinación de evento y recurso.
* Monitoreo de errores y capacidad de reprocesar eventos.
## Paso a producción
1. Crea el partner y la llave nuevamente en producción.
2. Replica únicamente los scopes aprobados.
3. Configura el webhook productivo y su secreto propio.
4. Cambia `COBRIX_BASE_URL` a `https://api.cobrix.co/api`.
5. Ejecuta un smoke test de bajo monto y verifica API, ledger, checkout y webhook.
6. Rota cualquier credencial usada durante la certificación si fue compartida fuera del gestor de secretos.
# Elegir la API correcta
Source: https://docs.cobrix.co/api-guides/choose-api
Decide por capacidad, contrato y efecto financiero
No elijas por el nombre del recurso. Elige por el flujo que controla tu sistema y por la unidad monetaria que ya maneja.
Usa la **API de integraciones** si necesitas upsert de clientes y documentos, filtros por cursor, links para varios documentos o pagos dirigidos a cobros concretos.
Usa la **API pública de documentos de cobro** si quieres crear un documento y recibir inmediatamente su cobro vigente con un contrato compacto en `snake_case`.
Usa `verified-payments` cuando tu sistema confirma un pago externo y Cobrix debe aplicarlo al ledger. La API pública de documentos también acepta `PAID_FROM_PROVIDER`, pero únicamente para el saldo completo.
Configura webhooks después de elegir la API. No mezcles la fórmula de firma general con la firma específica de documentos públicos.
## Comparación directa
| Decisión | API de integraciones | API pública de documentos de cobro |
| --------------- | -------------------------------------------------- | -------------------------------------------------------------- |
| Base | `/integrations/v1/{companyId}` | `/v1/invoices` |
| Forma de campos | `camelCase` | `snake_case` |
| Montos | Unidades menores: `2025` = USD 20,25 | Unidades mayores: `20.25` = USD 20,25 |
| Seguridad | Bearer + timestamp + firma HMAC | Bearer |
| Idempotencia | `Idempotency-Key` en todos los `POST` | `x-idempotency` al crear |
| Cliente | Recurso explícito con ID externo | Resolución automática por la cédula/RIF enviada en `reference` |
| Pagos | Aplicación por documentos; admite tasa certificada | Pago completo; no admite parcialidad |
## Recorridos recomendados
Crea o actualiza la identidad externa.
Envía líneas y montos en unidades menores.
Selecciona uno o varios documentos abiertos.
Procesa pago y aplicación financiera de forma idempotente.
Envía la cédula o RIF en `reference`, la identidad del documento en `provider_id` y el monto en unidades mayores.
Usa `payment.payment_link` devuelto por Cobrix.
Un `PUT` reemplaza el checkout y ajusta el ledger.
Recibe `invoice.paid` o anula con `DELETE`.
Reporta el pago por `verified-payments` si trabajas con documentos sincronizados. Para un documento público usa `PAID_FROM_PROVIDER` con `provider_payment_id`. Nunca envíes un monto superior al saldo abierto.
`/v1/invoices` crea o reutiliza automáticamente al cliente dentro de la empresa de la API key. El portal busca por la identidad fiscal interna y muestra todos sus documentos vinculados; no requiere un request adicional de clientes ni un campo nuevo.
No copies payloads entre ambas APIs. Los nombres, unidades, autenticación, idempotencia y errores son contratos distintos.
# Cobrix para desarrolladores
Source: https://docs.cobrix.co/api-guides/developer-platform
Integra clientes, documentos de cobro, pagos y webhooks con Cobrix
Cobrix Developer Platform
De tu sistema al cobro, sin piezas ocultas.
Sincroniza clientes y cartera, genera links, registra pagos verificados o usa la API compacta de documentos de cobro. Cada capacidad está organizada igual que en el drawer de permisos de tu empresa.
18operaciones públicas
12scopes de integración
2protocolos de webhooks
## Empieza por la capacidad que necesitas
Identidades externas vinculadas al `source` de la llave.
Seis endpoints compactos para documentos y checkout.
Upsert, consulta y anulación auditada de documentos.
Sesiones de pago para documentos abiertos seleccionados.
Pagos verificados, consultas y tasas certificadas.
Requests, errores y contexto operativo visibles en el panel.
`whatsapp_events:read` · tablero por semana, mes o fechas, con histórico y confirmaciones de la empresa.
## APIs públicas, una sola credencial
Consulta confirmaciones y totales con Bearer y `whatsapp_events:read`.
**Endpoint:** `GET /api/v1/whatsapp/events` · empresa obtenida de la llave.
Usa `report.summary` para tarjetas y `report.daily` para el gráfico. Filtra con `dateFrom` y `dateTo`; consulta el [ejemplo completo de tablero y períodos](/api-guides/whatsapp-daily).
Úsala para sincronización bidireccional de clientes, documentos, links y pagos. Requiere Bearer, firma HMAC y `Idempotency-Key` en cada `POST`.
**Base:** `/api/integrations/v1/{companyId}` · **Montos:** unidades menores.
Úsala cuando el sistema externo ya trabaja con un contrato compacto de documentos de cobro. Requiere Bearer y `x-idempotency` al crear.
**Base:** `/api/v1/invoices` · **Montos:** unidades mayores de la moneda de la empresa.
Recibe cambios de estado de forma asíncrona. Cobrix ofrece un protocolo general y otro específico para documentos públicos; cada uno tiene su propia fórmula de firma.
Compara casos de uso, unidades monetarias, seguridad y efectos financieros antes de implementar.
# Idempotencia
Source: https://docs.cobrix.co/api-guides/idempotency
Reintentos seguros en las APIs públicas de Cobrix
La idempotencia evita duplicar clientes, documentos, pagos y asientos financieros cuando una solicitud se repite por timeout o pérdida de conexión.
## API de integraciones
Todos los `POST` bajo `/integrations/v1` requieren:
```http theme={null}
Idempotency-Key: 2cf0b8d1-3388-47ea-8b67-bc11e7de4efe
```
La clave se almacena por empresa, llave, método y ruta. El mismo cuerpo reproduce la respuesta original; reutilizarla con un cuerpo diferente devuelve un conflicto.
## API pública de documentos de cobro
La creación usa un header distinto:
```http theme={null}
x-idempotency: 2cf0b8d1-3388-47ea-8b67-bc11e7de4efe
```
* Misma llave y mismo cuerpo: devuelve el documento original con `201`.
* Misma llave y cuerpo diferente: `409 idempotency_error`.
* Header ausente: `409 idempotency_error`.
* Con `provider_id`, la identidad del documento es `provider + provider_id`.
* Sin `provider_id`, Cobrix usa `provider + sha256(x-idempotency)`.
* Dos documentos del mismo cliente deben usar un `provider_id` o una clave de idempotencia diferente.
## Recomendaciones
1. Genera una clave UUID por operación de negocio, no por intento HTTP.
2. Conserva la clave hasta recibir una respuesta definitiva.
3. Reintenta timeouts y errores `5xx` con backoff exponencial.
4. No reutilices una clave para otro documento o pago.
5. Conserva exactamente el mismo cuerpo serializado al reintentar requests firmados.
# Firma de solicitudes
Source: https://docs.cobrix.co/api-guides/request-signing
HMAC-SHA256 para la API de integraciones
Además del Bearer, cada request a `/integrations/v1` debe incluir una firma HMAC-SHA256 calculada con la misma llave API.
## Headers
```http theme={null}
Cobrix-Timestamp: 1784044800
Cobrix-Signature: v1=HEXADECIMAL_HMAC_SHA256
```
`Cobrix-Timestamp` usa segundos Unix y debe estar dentro de una ventana de cinco minutos.
## Cadena firmada
```text theme={null}
{timestamp}.{METHOD}.{path_with_query}.{raw_body}
```
* `METHOD` en mayúsculas.
* `path_with_query` comienza en `/integrations/v1` e incluye el query string en su orden original.
* `raw_body` es el cuerpo exacto enviado. En `GET` es una cadena vacía.
* La firma se envía como `v1={hex}`.
```javascript Node.js theme={null}
import crypto from 'node:crypto'
function signRequest({ secret, timestamp, method, path, rawBody = '' }) {
const payload = `${timestamp}.${method.toUpperCase()}.${path}.${rawBody}`
const signature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
return `v1=${signature}`
}
```
```python Python theme={null}
import hashlib, hmac
def sign_request(secret, timestamp, method, path, raw_body=''):
payload = f'{timestamp}.{method.upper()}.{path}.{raw_body}'
digest = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()
return f'v1={digest}'
```
## Errores de firma
| Código | Causa |
| ---------------------------- | ---------------------------------------------- |
| `missing_timestamp` | No se envió `Cobrix-Timestamp`. |
| `timestamp_out_of_tolerance` | El timestamp está fuera de cinco minutos. |
| `missing_signature` | No se envió una firma `v1`. |
| `invalid_signature` | El método, ruta, cuerpo o secreto no coincide. |
Firma el JSON antes de enviarlo y usa ese mismo texto como body. Volver a serializarlo puede cambiar espacios u orden y producir una firma inválida.
# Reporte de WhatsApp
Source: https://docs.cobrix.co/api-guides/whatsapp-daily
Ejemplos por semana, mes y rango de fechas; tarjetas, gráfico y confirmaciones con una sola llamada
Usa **`GET /api/v1/whatsapp/events`** con la llave de la empresa y el permiso `whatsapp_events:read`. Esta única respuesta contiene el reporte completo y su detalle paginado. Cobrix obtiene la empresa de la llave; no necesitas un token de Meta ni enviar `companyId`.
## Primera consulta
```bash theme={null}
curl --get 'https://api.cobrix.co/api/v1/whatsapp/events' \
--header "Authorization: Bearer $COBRIX_API_KEY" \
--data-urlencode 'dateFrom=2026-09-01T00:00:00-04:00' \
--data-urlencode 'dateTo=2026-09-10T23:59:59.999-04:00' \
--data-urlencode 'page=1' \
--data-urlencode 'limit=20'
```
## Construye el tablero
* **Tarjetas:** `report.summary.sent`, `delivered`, `read` y `failed`.
* **Gráfico y tabla diaria:** `report.daily`, ordenado por fecha ascendente.
* **Detalle de confirmaciones:** `events`, con `page`, `limit` y `totalPages`.
El reporte incluye las estadísticas importadas de Meta y las confirmaciones disponibles en una sola serie. No necesitas combinar fuentes ni consultar otro endpoint. `report.history` indica la disponibilidad y las cifras del histórico incluido, como respaldo del reporte.
### Ejemplo: tablero de una empresa con histórico
Para el período **14 de agosto a 10 de septiembre de 2026**, el siguiente ejemplo muestra 4.256 enviados y 4.198 entregados. Usa la llave de la empresa correspondiente; son cifras de ejemplo para ese período, no totales actuales de todas las empresas.
| Tarjeta | Valor | Campo |
| ---------- | ----- | -------------------------- |
| Enviados | 4.256 | `report.summary.sent` |
| Entregados | 4.198 | `report.summary.delivered` |
| Leídos | — | `report.summary.read` |
| Fallidos | — | `report.summary.failed` |
Respuesta completa del mismo endpoint:
```json theme={null}
{
"coverage": {
"status": "partial",
"unit": "events",
"attribution": "confirmed"
},
"events": [],
"summary": {
"read": 0,
"sent": 0,
"total": 0,
"failed": 0,
"delivered": 0
},
"report": {
"daily": [
{
"date": "2026-09-04",
"read": null,
"sent": 4,
"failed": null,
"source": "meta_analytics",
"delivered": 4
},
{
"date": "2026-09-06",
"read": null,
"sent": 1,
"failed": null,
"source": "meta_analytics",
"delivered": 1
},
{
"date": "2026-09-07",
"read": null,
"sent": 2863,
"failed": null,
"source": "meta_analytics",
"delivered": 2814
},
{
"date": "2026-09-08",
"read": null,
"sent": 13,
"failed": null,
"source": "meta_analytics",
"delivered": 26
},
{
"date": "2026-09-09",
"read": null,
"sent": 0,
"failed": null,
"source": "meta_analytics",
"delivered": 2
},
{
"date": "2026-09-10",
"read": null,
"sent": 1375,
"failed": null,
"source": "meta_analytics",
"delivered": 1351
}
],
"history": {
"sent": 4256,
"delivered": 4198,
"availability": "available"
},
"summary": {
"read": null,
"sent": 4256,
"failed": null,
"delivered": 4198
},
"timezone": "America/Caracas"
},
"page": 1,
"limit": 20,
"totalPages": 0
}
```
**`events: []` no contradice las tarjetas.** En este ejemplo hay estadísticas históricas agregadas, pero no confirmaciones individuales recuperadas para ese período. El `summary` original cuenta ese detalle y permanece en cero; las tarjetas usan **`report.summary`**. No sumes `summary` ni `report.history` a `report.summary`: el reporte ya está combinado.
## Contrato y significado de las cifras
El `summary` original sigue contando **eventos almacenados**, incluidos callbacks repetidos. Paginar no cambia sus totales. `report.summary` cuenta una observación por `messageId` y estado dentro del filtro, más el histórico que corresponda. Un mensaje puede tener varios estados: no sumes enviados y entregados como mensajes distintos.
Para evitar duplicar cifras, un día importado sustituye las observaciones de envío y entrega del **mismo número emisor y empresa**. Se utiliza la fecha del estado informada por Meta para detectar la superposición, o la recepción si falta esa fecha. Las observaciones de otros emisores o empresas se conservan. Una estadística histórica no crea destinatarios, `messageId` ni eventos ficticios.
Los días observados se agrupan por recepción en Cobrix. Los importados corresponden al día estadístico de Meta. Ambos se muestran en `America/Caracas`; `source` identifica `events`, `meta_analytics` o `mixed`. La serie contiene días con datos; un día ausente no prueba que no hubo envíos.
`null` significa información no disponible. Si el histórico no incluye lecturas o fallos, esos totales permanecen `null`; no se presentan como cero. Las entregas diarias pueden superar los envíos por entregas de mensajes anteriores. La diferencia entre ambas cifras no demuestra fallos.
## Esta semana, este mes o un rango de fechas
La API recibe **`dateFrom` y `dateTo`**. Los botones «Esta semana» y «Este mes» son opciones del tablero: tu aplicación calcula las fechas y las envía. No existen parámetros `week`, `month` ni `period`.
Por ejemplo, si hoy fuera **12 de septiembre de 2026**, con semanas de lunes a domingo y calendario de `America/Caracas`:
| Opción del tablero | `dateFrom` | `dateTo` |
| ---------------------------- | --------------------------- | ------------------------------- |
| Hoy | `2026-09-12T00:00:00-04:00` | `2026-09-12T23:59:59.999-04:00` |
| Esta semana | `2026-09-07T00:00:00-04:00` | `2026-09-13T23:59:59.999-04:00` |
| Este mes | `2026-09-01T00:00:00-04:00` | `2026-09-30T23:59:59.999-04:00` |
| Rango del ejemplo histórico | `2026-08-14T00:00:00-04:00` | `2026-09-10T23:59:59.999-04:00` |
| Todo el histórico disponible | Omitir | Omitir |
El final de semana o mes puede ser posterior a hoy: la respuesta sólo contiene datos disponibles al consultar. Para un período **hasta hoy**, usa el final del día actual; para cortar en este instante, usa su fecha y hora exactas, teniendo en cuenta la exclusión de días históricos parciales.
```bash theme={null}
# Esta semana en el ejemplo: lunes 7 a domingo 13 de septiembre.
curl --get 'https://api.cobrix.co/api/v1/whatsapp/events' \
--header "Authorization: Bearer $COBRIX_API_KEY" \
--data-urlencode 'dateFrom=2026-09-07T00:00:00-04:00' \
--data-urlencode 'dateTo=2026-09-13T23:59:59.999-04:00' \
--data-urlencode 'limit=20'
```
Para consultar el mes, reemplaza ambas fechas por las de «Este mes». Para un rango personalizado, usa las fechas del selector. Se admite enviar sólo uno de los límites; el extremo omitido queda sin restricción. Usa `--data-urlencode` o `URLSearchParams` para codificar correctamente las fechas y teléfonos.
## Filtros
| Parámetro | Uso |
| -------------------- | --------------------------------------------------------------------------------------------------- |
| `dateFrom`, `dateTo` | Fechas ISO 8601 con segundos y zona horaria, límites inclusivos. Un rango invertido devuelve `422`. |
| `status` | `sent`, `delivered`, `read` o `failed`. Omitir para todos. |
| `phone` | Coincidencia parcial del teléfono, hasta 64 caracteres. |
| `page` | Página del detalle, desde 1. |
| `limit` | Eventos por página: 20 por defecto, máximo 100. |
Conserva los [filtros y errores originales](/api-reference/categories/whatsapp): `dateFrom`, `dateTo`, `phone`, `status`, `page` y `limit`. Las fechas requieren zona horaria y los límites son inclusivos sobre la recepción de los eventos. Sin fechas, consulta el histórico disponible. La página sólo afecta al detalle; el reporte cubre todo el resultado.
El histórico sólo permite días completos y estados enviados o entregados. Con `phone`, `read` o `failed`, el reporte utiliza las confirmaciones individuales disponibles y marca `report.history.availability: "unsupported_filter"`. Un estado seleccionado deja los demás contadores del reporte en cero.
Para incluir un día histórico completo, consulta desde `00:00:00-04:00` hasta `23:59:59.999-04:00`. Los días históricos parciales se omiten y se indica `partial_days_excluded`; las confirmaciones individuales dentro del intervalo permanecen disponibles. `no_data` indica que no hay histórico importado para ese filtro.
La página, los totales y el reporte se obtienen de la misma instantánea de lectura. El límite sigue siendo **60 solicitudes por minuto por llave**; respeta `Retry-After` ante `429`.
Las confirmaciones se distinguen de la [entrega de webhooks de Cobrix al integrador](/guides/webhooks/delivery). Ninguna cifra de este reporte representa pagos recibidos.
## Cómo mostrar lecturas y fallos
* **`null` → «—» o «No disponible»:** el histórico incluido no proporciona esa métrica. No conviertas `null` a cero.
* **`0` → «0»:** no hay confirmaciones de ese estado en el resultado disponible; no garantiza que se hayan recibido todas las confirmaciones de Meta.
* **Número positivo:** conteo disponible para el filtro seleccionado.
Si un día histórico tiene lecturas o fallos desconocidos, el total de esa métrica también queda en `null`, aunque haya confirmaciones recientes. La tabla diaria permite ver cuáles días sí tienen el dato. Con un filtro de estado, los otros estados se ponen en cero porque están excluidos del resultado.
Desde que los envíos estén asociados a la empresa y sus confirmaciones lleguen a Cobrix, un período nuevo sin histórico incompleto permite contar enviados, entregados, leídos y fallidos. Una confirmación puede llegar después del envío. No leer un mensaje, no recibir una lectura o no tener confirmación de entrega no equivale a un fallo.
## Ejemplo de integración del tablero
Este ejemplo de **JavaScript en el servidor** recibe las fechas del selector, realiza una llamada y prepara los campos del tablero. Guarda `COBRIX_API_KEY` en el servidor y resuelve la llave desde la empresa autorizada en tu aplicación; no la incluyas en JavaScript público ni en la URL.
```javascript theme={null}
async function consultarTablero({ desde, hasta, status, phone, page = 1 }) {
const apiKey = process.env.COBRIX_API_KEY;
if (!apiKey) throw new Error('Falta configurar COBRIX_API_KEY');
const url = new URL('https://api.cobrix.co/api/v1/whatsapp/events');
// Desde y hasta son fechas YYYY-MM-DD del selector en Caracas.
if (desde) url.searchParams.set('dateFrom', `${desde}T00:00:00-04:00`);
if (hasta) url.searchParams.set('dateTo', `${hasta}T23:59:59.999-04:00`);
if (status) url.searchParams.set('status', status);
if (phone) url.searchParams.set('phone', phone);
url.searchParams.set('page', String(page));
url.searchParams.set('limit', '20');
const response = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
cache: 'no-store',
signal: AbortSignal.timeout(15000),
});
if (!response.ok) {
const error = new Error(`Cobrix respondió HTTP ${response.status}`);
error.status = response.status;
error.retryAfter = response.headers.get('Retry-After');
throw error;
}
const data = await response.json();
if (!data.report) throw new Error('Reporte no disponible en la respuesta');
return {
tarjetas: data.report.summary,
dias: data.report.daily,
eventos: data.events,
paginacion: { page: data.page, limit: data.limit, totalPages: data.totalPages },
};
}
const tablero = await consultarTablero({ desde: '2026-09-01', hasta: '2026-09-30' });
const mostrarConteo = (valor) => valor === null ? '—' : valor.toLocaleString('es-VE');
console.log(mostrarConteo(tablero.tarjetas.sent));
console.log(mostrarConteo(tablero.tarjetas.read));
// Grafica tablero.dias por date, con las series sent y delivered.
// La tabla de detalle usa tablero.eventos.
```
Al cambiar fechas, empresa, estado o teléfono, vuelve a `page=1` y consulta de nuevo. Cancela o descarta respuestas anteriores para que una consulta lenta no reemplace el filtro actual. No sustituyas un error HTTP por tarjetas en cero.
Para actualización periódica, una consulta por minuto mientras el tablero está visible es suficiente como punto de partida. Coordina las consultas que compartan la misma llave, evita solicitudes superpuestas y ante `429` espera los segundos de `Retry-After` antes de reintentar. El ejemplo realiza una sola consulta; no crea un temporizador automáticamente.
Los datos cambian cuando llegan nuevas confirmaciones o se incorpora evidencia. Para seguimiento de detalle, deduplica por `id` y vuelve a consultar fechas recientes: la paginación entre llamadas no congela el conjunto de datos. No se garantiza la reconstrucción de confirmaciones históricas no recibidas.
# Catálogo de capacidades
Source: https://docs.cobrix.co/api-reference/catalog
Todos los endpoints organizados como en el drawer de permisos
Mapa de la API
Encuentra el endpoint desde su permiso.
La navegación replica las categorías de Configuración → Integraciones → Llaves API. Así puedes pasar del permiso seleccionado al endpoint, payload, respuesta y error asociado sin traducir conceptos.
2endpoints de clientes
9operaciones de cobro y pago
6endpoints de documentos públicos
## Categorías del drawer
`customers:read` · `customers:write`
`public_invoices:read` · `public_invoices:write`
`collection_documents:read` · `collection_documents:write`
`collection_document_checkouts:write`
`verified_payments:write` · `payments:read` · `certified_rates:write`
`integration_logs:read` controla la consulta desde el producto; no agrega un endpoint público.
`whatsapp_events:read` · un endpoint para tarjetas, actividad diaria e histórico de Meta; filtros por semana, mes o fechas mediante `dateFrom` y `dateTo`.
## Mapa permiso → operación
| Categoría | Scope | Operaciones habilitadas |
| ---------------------------------- | --------------------------------------------------------------------- | ----------------------: |
| Clientes | `customers:read` / `customers:write` | 2 |
| API pública de documentos de cobro | `public_invoices:read` / `public_invoices:write` | 6 |
| Documentos de cobro | `collection_documents:read` / `collection_documents:write` | 4 |
| Links de cobro | `collection_document_checkouts:write` | 1 |
| Pagos | `verified_payments:write` / `payments:read` / `certified_rates:write` | 4 |
| WhatsApp | `whatsapp_events:read` | 1 |
| Auditoría | `integration_logs:read` | Superficie UI |
El catálogo suma 18 operaciones públicas. Auditoría aparece porque forma parte del drawer de permisos, pero su acceso actual es una experiencia del panel de Cobrix, no una ruta para integradores.
# Auditoría
Source: https://docs.cobrix.co/api-reference/categories/audit
Investiga solicitudes recientes sin exponer credenciales ni secretos
La categoría de soporte del drawer no representa un endpoint adicional.
`integration_logs:read` habilita la consulta de actividad desde el producto Cobrix. Los integradores siguen usando los 18 endpoints públicos documentados en las demás categorías.
integration\_logs:read
## Qué puedes investigar
Método, ruta, ambiente, timestamp, partner, llave identificada por prefijo y payload sanitizado.
Código HTTP, duración, `requestId`, código de error y respuesta sanitizada.
Clave protegida, repetición compatible o conflicto de payload y resultado reproducido.
Evento, intento, destino, código HTTP, latencia y próximo reintento sin revelar el secreto.
## Flujo de diagnóstico
Todas las respuestas de error de la API de integraciones incluyen `error.requestId`. En documentos públicos, conserva también fecha, método e identificador público.
Entra a **Configuración → Integraciones**, abre el partner o llave correspondiente y consulta su actividad reciente.
Revisa scope, headers, firma, idempotencia, tipos, campos obligatorios y unidades monetarias antes de reenviar.
Comparte `requestId`, ambiente, método, ruta y hora. Nunca envíes la API key completa, la firma ni el secreto del webhook.
Abre el detalle sanitizado y revisa el campo señalado. Confirma especialmente fechas ISO 8601, enteros `Minor`, moneda, source, identificadores externos y suma de líneas.
Una llave válida aún puede carecer del scope de la operación, pertenecer a otra empresa o estar asociada a otro `source`.
Primero identifica si el conflicto proviene de idempotencia, referencia duplicada, estado financiero o una operación en recuperación. Reintenta con la misma clave solo si el cuerpo es idéntico.
Bearer tokens completos, secretos de webhooks y material criptográfico se ocultan. Los payloads sensibles deben aparecer sanitizados según el rol autorizado.
Para soporte, el prefijo visible de la llave y el `requestId` son suficientes para correlacionar una petición sin compartir la credencial completa.
# Links de cobro
Source: https://docs.cobrix.co/api-reference/categories/checkout-links
Crea sesiones de checkout sobre documentos abiertos
Convierte uno o varios documentos abiertos en una experiencia de pago.
La sesión reúne documentos compatibles y devuelve un `checkoutUrl` listo para entregar al cliente final.
collection\_document\_checkouts:write
## Operación disponible
| Permiso del drawer | Método y ruta |
| ------------------ | -------------------------------------------------------------------------- |
| Crear links | `POST /integrations/v1/{companyId}/collection-documents/checkout-sessions` |
Todos deben pertenecer al mismo cliente, `source` y moneda, y conservar saldo pendiente.
`expiresInHours` acepta de 1 a 720 horas. Si lo omites, Cobrix utiliza 72 horas.
Conserva `sessionId`, `token`, `checkoutUrl` y `amountMinor` para soporte y trazabilidad.
Usa webhooks generales para conocer el avance del checkout y del pago sin consultar en un bucle.
Cobrix devuelve `404` o `409` según el estado. Consulta primero el detalle del documento y usa el `requestId` para soporte.
Una sesión no puede mezclar carteras distintas. Separa los documentos en checkouts independientes.
Conserva el mismo `Idempotency-Key` solo cuando reenvíes exactamente el mismo cuerpo. Para otra selección crea una clave nueva.
Abre el playground con payload, respuesta y códigos HTTP.
Verifica firmas y procesa eventos de checkout y pago.
# Documentos de cobro
Source: https://docs.cobrix.co/api-reference/categories/collection-documents
Sincroniza cuentas por cobrar con importes en unidades menores
La cartera operativa del sistema externo dentro de Cobrix.
Cada documento pertenece a un `source`, un cliente y una moneda. Los campos terminados en `Minor` son enteros en unidades menores: `2000` representa USD 20,00.
collection\_documents:read
collection\_documents:write
## Operaciones
| Permiso del drawer | Scope | Método y ruta |
| ----------------------------- | ---------------------------- | ------------------------------------------------------------------------------------ |
| Listar y consultar documentos | `collection_documents:read` | `GET /integrations/v1/{companyId}/collection-documents` |
| Listar y consultar documentos | `collection_documents:read` | `GET /integrations/v1/{companyId}/collection-documents/{externalDocumentId}` |
| Crear, actualizar y anular | `collection_documents:write` | `POST /integrations/v1/{companyId}/collection-documents/upsert` |
| Crear, actualizar y anular | `collection_documents:write` | `POST /integrations/v1/{companyId}/collection-documents/{externalDocumentId}/cancel` |
Envía `source`, `externalDocumentId`, `customerExternalId`, datos del cliente, fechas, moneda y líneas. `totalMinor`, si se incluye, debe ser coherente con las líneas.
Filtra por estado, cliente, documento, source, moneda, saldo, rangos de emisión o vencimiento y `updatedSince`. Usa `cursor` para continuar.
Consulta saldos, líneas, aplicaciones y estado operativo usando el identificador externo del documento.
La anulación es auditada e idempotente. Si el documento tiene aplicaciones incompatibles, Cobrix responde conflicto para conservar el ledger.
## Orden recomendado de sincronización
Ejecuta primero el upsert de Clientes con la misma pareja `source` + `externalCustomerId`.
Conserva estable `externalDocumentId` y usa un `Idempotency-Key` único por intención de escritura.
Usa el detalle o `updatedSince` para confirmar saldo y evitar depender solo de la respuesta inicial.
El documento abierto puede alimentar las categorías Links de cobro y Pagos.
Revisa líneas, cliente embebido, fechas y validaciones monetarias.
Explora la paginación por cursor y todos los filtros soportados.
# Clientes
Source: https://docs.cobrix.co/api-reference/categories/customers
Sincroniza la identidad del cliente antes de crear documentos y pagos
La misma categoría que ves en el drawer de permisos.
Registra o actualiza clientes externos y consulta su estado dentro de la integración. La identidad estable es la combinación de `source` y `externalCustomerId`.
customers:read
customers:write
## Operaciones
| Permiso del drawer | Scope | Método y ruta |
| --------------------------- | ----------------- | ---------------------------------------------------- |
| Listar clientes | `customers:read` | `GET /integrations/v1/{companyId}/customers` |
| Crear y actualizar clientes | `customers:write` | `POST /integrations/v1/{companyId}/customers/upsert` |
Envía `source`, `externalCustomerId`, `type` y `name`. También puedes conservar `email`, `phone`, `taxId`, `customerCode` y `metadata`.
El upsert es seguro para sincronizaciones periódicas: la misma identidad actualiza el cliente existente. El `POST` requiere `Idempotency-Key`, firma del request y Bearer.
Filtra por `search`, `externalCustomerId`, `source`, `updatedSince` o `status`. La paginación usa `cursor` y `limit`; conserva el cursor devuelto para obtener la siguiente página.
## Identidad que no debe cambiar
Usa el mismo identificador configurado al crear el partner. No lo cambies entre sincronizaciones.
`externalCustomerId` debe seguir apuntando a la misma persona o empresa durante toda su vida útil.
Los documentos, links y pagos posteriores deben utilizar el mismo `customerExternalId`.
Verifica que la llave pertenezca al `companyId`, que conserve el `source` autorizado y que tenga `customers:read` o `customers:write` según la operación.
La identidad o la idempotencia entró en conflicto con una solicitud anterior. Busca el `requestId` en Auditoría y compara el payload enviado.
La referencia interactiva muestra cada campo, código HTTP y ejemplo ejecutable.
# API pública de documentos de cobro
Source: https://docs.cobrix.co/api-reference/categories/invoices
Crea, consulta, actualiza y cierra documentos con reglas financieras explícitas
Una fachada de cobro compacta para sistemas que ya controlan su cartera.
Los montos usan unidades mayores de la moneda configurada en la empresa. Por ejemplo, `amount: 20` representa USD 20 cuando la empresa opera en USD.
public\_invoices:read
public\_invoices:write
## Operaciones
| Permiso del drawer | Scope | Método y ruta | Resultado |
| ---------------------------- | ----------------------- | --------------------------------- | ----------------------------------------- |
| Consultar documentos | `public_invoices:read` | `GET /v1/invoices` | Lista, filtra y ordena |
| Consultar documentos | `public_invoices:read` | `GET /v1/invoices/{invoiceId}` | Detalle, estado y cobro vigente |
| Crear, actualizar y eliminar | `public_invoices:write` | `POST /v1/invoices` | Crea documento y checkout |
| Crear, actualizar y eliminar | `public_invoices:write` | `PUT /v1/invoices/{invoiceId}` | Actualiza según estado financiero |
| Crear, actualizar y eliminar | `public_invoices:write` | `DELETE /v1/invoices/{invoiceId}` | Anula o informa pago externo |
| Crear, actualizar y eliminar | `public_invoices:write` | `DELETE /v1/invoices` | Programa eliminación masiva de pendientes |
## Qué representa `reference`
`POST /v1/invoices` tiene un único contrato:
| Campo | Significado |
| --------------- | ----------------------------------------------------------------- |
| `reference` | Cédula o RIF del cliente |
| `provider_id` | Identidad estable del documento en el sistema de origen |
| `x-idempotency` | Identidad documental de respaldo cuando no se envía `provider_id` |
Cobrix busca o crea al cliente únicamente dentro de la empresa de la API key y guarda su identidad fiscal para que el portal pueda localizarlo. No hace falta llamar a un endpoint adicional de clientes.
```json theme={null}
{
"reference": "V-12345678",
"provider": "erp_acme",
"provider_id": "DOC-90871",
"amount": 25,
"name": "Servicio de internet"
}
```
Cobrix conserva el valor exacto de `reference` en la respuesta y en los webhooks. Solo normaliza una copia para resolver la identidad fiscal. Si esa identidad es ambigua dentro de la empresa, la creación devuelve `409` y no crea ni mueve el documento. Una referencia que no represente una cédula o RIF devuelve `422`.
Varios documentos pueden compartir la misma identidad del cliente:
```json theme={null}
[
{
"reference": "V-12345678",
"provider": "erp_acme",
"provider_id": "DOC-001",
"amount": 25,
"name": "Servicio de julio"
},
{
"reference": "V12345678",
"provider": "erp_acme",
"provider_id": "DOC-002",
"amount": 30,
"name": "Servicio de agosto"
}
]
```
Ambas quedan vinculadas al mismo cliente, pero conservan cobros, estados y cancelaciones independientes.
Sin pagos aplicados, el `PUT` puede cambiar datos informativos y monto. Si cambia el monto, Cobrix registra el ajuste financiero, invalida el checkout anterior y devuelve uno nuevo.
La actualización se rechaza con `409`, código `10009` y `errors.payment`. No se modifica el documento, checkout ni ledger.
`PAID`, `CONCILIATED` y `PAID_FROM_PROVIDER` aceptan únicamente cambios informativos. `amount` debe coincidir con el total liquidado.
`DELETE_FROM_PROVIDER` y `FAILED` no aceptan `PUT`. La respuesta es `409` con el detalle en `errors.status`.
## Reglas que protegen el ledger
### Nombre y correo
En creación y actualización, `name` admite entre **2 y 100 caracteres**.
`email` es opcional: puedes omitirlo, enviar `""` o solo espacios. Cobrix
recorta los espacios externos y valida el correo únicamente si queda contenido
(formato de correo válido y máximo 200 caracteres). No genera ni completa direcciones.
En una actualización, omitirlo o enviarlo vacío **conserva el correo existente**;
no lo borra. Un nombre de un carácter o un correo con contenido inválido devuelve
`422` con el detalle del campo, sin cambiar las reglas financieras.
| Entrada | Creación | Actualización |
| ----------------------------------------- | ------------------------------ | ------------------------------- |
| `name: "Al"` | Válido | Válido |
| `name: "A"` o más de 100 caracteres | `422`, error en `name` | `422`, error en `name` |
| Sin `email`, `email: ""` o `email: " "` | Aceptado; no inventa un correo | Conserva el correo existente |
| `email: " qa@example.test "` | Guarda `qa@example.test` | Actualiza a `qa@example.test` |
| `email: "correo-invalido"` | `422`, error en `email` | `422`, no modifica el documento |
Ejemplo de creación con nombre de dos caracteres y sin correo:
```json theme={null}
{
"reference": "V-12345678",
"provider": "erp_pruebas",
"provider_id": "QA-DOC-001",
"amount": 1,
"name": "Al"
}
```
Envía el ejemplo únicamente con una identidad sintética reservada en sandbox
y una clave `x-idempotency` nueva. `PUT` no es una actualización parcial:
conserva los campos obligatorios `reference`, `amount` y `name`.
Aceptar los datos de contacto no modifica las restricciones de documentos con pagos.
`provider` identifica el origen financiero y no puede cambiar después de crear el documento. Enviarlo con contenido en un `PUT` devuelve `422` con el detalle en `errors.provider`.
`provider_id` identifica el documento y no puede cambiar después de crearlo. Si no se envía, Cobrix deriva la identidad de `x-idempotency`. `reference` puede variar de formato únicamente si sigue representando la misma cédula o RIF.
Un documento pagado conserva su monto liquidado. Puedes corregir nombre, descripción, teléfono, email o vencimiento, pero no reabrir ni reescribir el pago.
Esta API espera el pago completo del documento. Las recargas de saldo o Wallet pertenecen a otro flujo y no deben modelarse como abonos parciales.
Informa que el proveedor eliminó el documento. Cobrix anula los cobros pendientes; si existe dinero aplicado, protege el ledger y rechaza la operación.
Informa un pago realizado fuera de Cobrix. Envía `reason: PAID_FROM_PROVIDER` y `provider_payment_id`; Cobrix aplica por la vía financiera oficial hasta el saldo abierto.
`POST /v1/invoices` requiere `x-idempotency`. Repetir la misma clave y el mismo cuerpo reproduce el resultado; reutilizarla con otro cuerpo devuelve conflicto.
Consulta el DTO `snake_case`, filtros, respuestas y errores exactos.
Procesa `invoice.created`, `invoice.paid` e `invoice.canceled`.
# Pagos
Source: https://docs.cobrix.co/api-reference/categories/payments
Reporta pagos verificados, consulta su aplicación y completa conversiones certificadas
Una entrada financiera controlada, no una simple actualización de estado.
Los montos usan unidades menores. Cobrix valida documentos, saldo, moneda e idempotencia antes de aplicar el pago al ledger.
verified\_payments:write
payments:read
certified\_rates:write
## Operaciones
| Permiso del drawer | Scope | Método y ruta |
| -------------------------- | ------------------------- | ------------------------------------------------------------------------------- |
| Listar y consultar pagos | `payments:read` | `GET /integrations/v1/{companyId}/payments` |
| Listar y consultar pagos | `payments:read` | `GET /integrations/v1/{companyId}/payments/{externalPaymentId}` |
| Reportar pagos verificados | `verified_payments:write` | `POST /integrations/v1/{companyId}/verified-payments` |
| Cargar tasas certificadas | `certified_rates:write` | `POST /integrations/v1/{companyId}/payments/{externalPaymentId}/certified-rate` |
Envía `source`, `externalPaymentId`, cliente, `amountMinor`, moneda, `verifiedAt` y los documentos a aplicar. El header `Idempotency-Key` es obligatorio.
Filtra por estado, estado operativo, pago externo, cliente, source, proveedor, moneda, rango de pago o `updatedSince`.
Si el pago queda en `needs_certified_rate`, envía moneda y monto de referencia, `exchangeRateUsed`, fecha efectiva y distribución entre documentos.
## Estados operativos
| Estado | Qué significa | Próxima acción |
| ---------------------- | ---------------------------------------- | ---------------------------------------- |
| `applied` | Pago aplicado completamente | Ninguna |
| `partially_applied` | Solo parte pudo aplicarse | Consulta el detalle y saldo restante |
| `credited` | Existe remanente registrado como crédito | Revisa `creditCreatedMinor` |
| `needs_certified_rate` | Falta una tasa aprobada | Envía la tasa certificada |
| `no_open_documents` | No había documentos aplicables | Corrige la selección antes de reintentar |
| `already_processed` | La intención ya fue procesada | Reutiliza la respuesta existente |
| `failed` | La aplicación no terminó | Busca `requestId` y detalle en Auditoría |
No inventes una tasa ni reenvíes el pago con otro identificador para superar un conflicto. Consulta primero el pago existente; duplicar la intención puede producir una doble aplicación.
Revisa distribución, moneda, timestamp y respuestas financieras.
Confirma el resultado operativo antes de ejecutar acciones posteriores.
# WhatsApp: confirmaciones y totales
Source: https://docs.cobrix.co/api-reference/categories/whatsapp
Consulta las confirmaciones de Meta de tu empresa con una sola llamada
Consulta `GET /api/v1/whatsapp/events` con tu llave habitual y el permiso **`whatsapp_events:read`**. Actívalo en **Configuración → Integraciones → Llaves API**, al crear o editar la llave. Las llaves existentes no lo reciben automáticamente.
La empresa se obtiene de la llave. El reporte incluye confirmaciones de todos sus orígenes: recordatorios automáticos, envíos desde Cobrix y otras integraciones, siempre que exista evidencia exacta de pertenencia. No necesitas enviar `companyId`, firma HMAC ni idempotencia.
## Primera consulta
```bash theme={null}
curl --get 'https://api.cobrix.co/api/v1/whatsapp/events' \
--header "Authorization: Bearer $COBRIX_API_KEY" \
--data-urlencode 'dateFrom=2026-09-08T00:00:00-04:00' \
--data-urlencode 'dateTo=2026-09-08T23:59:59.999-04:00' \
--data-urlencode 'limit=20'
```
En sandbox usa `https://sandbox-api.cobrix.co/api/v1/whatsapp/events`. Cada despliegue consulta su propia base de datos.
## Leer el resultado
```json theme={null}
{
"events": [
{
"id": "00000000-0000-4000-8000-000000000001",
"messageId": "wamid.example",
"status": "delivered",
"recipientPhone": "584121234567",
"receivedAt": "2026-09-08T14:30:00.000Z",
"errorCode": null,
"errorTitle": null
}
],
"summary": {
"total": 1,
"sent": 0,
"delivered": 1,
"read": 0,
"failed": 0
},
"page": 1,
"limit": 20,
"totalPages": 1,
"coverage": {
"status": "partial",
"unit": "events",
"attribution": "confirmed"
},
"report": {
"timezone": "America/Caracas",
"summary": {
"sent": 0,
"delivered": 1,
"read": 0,
"failed": 0
},
"daily": [
{
"date": "2026-09-08",
"sent": 0,
"delivered": 1,
"read": 0,
"failed": 0,
"source": "events"
}
],
"history": {
"availability": "no_data",
"sent": 0,
"delivered": 0
}
}
}
```
* `report.summary` alimenta las tarjetas y `report.daily` el gráfico y la tabla por día. El histórico y la actividad disponible ya están combinados.
* `events` contiene la página solicitada; el `summary` original cuenta los eventos almacenados de todo el resultado filtrado.
* `status`, `phone`, `dateFrom` y `dateTo` se aplican también a los totales. Al filtrar `delivered`, los demás estados quedan en cero.
* Los eventos se ordenan por recepción descendente y luego por identificador descendente. `page` empieza en 1; `limit` vale 20 por defecto y admite hasta 100.
* Una página fuera del resultado devuelve `events: []` y conserva los totales. Sin eventos individuales, el `summary` original y `totalPages` son cero; `report` puede seguir incluyendo histórico agregado.
* Las fechas filtran `receivedAt`, el instante en que Cobrix recibió la confirmación, con límites inclusivos. Incluye segundos y zona horaria; un rango invertido se rechaza. Sin fechas se consulta el histórico disponible.
* `phone` busca una coincidencia parcial y admite hasta 64 caracteres. Usa `--data-urlencode` para conservar signos como `+`.
Cada respuesta usa una misma instantánea para página, totales y reporte. Entre solicitudes pueden llegar eventos o incorporarse nueva evidencia; la paginación no es una exportación congelada del histórico. Para guardar registros, deduplica por `id` y vuelve a consultar períodos recientes.
## Semana, mes y fechas personalizadas
Usa `dateFrom` y `dateTo` para todas estas opciones; la API no recibe `period`, `week` ni `month`. Tu tablero calcula los límites en la zona horaria elegida. Para días completos de Caracas, usa `00:00:00-04:00` y `23:59:59.999-04:00`. Consulta los [ejemplos de semana, mes y rango](/api-guides/whatsapp-daily#esta-semana-este-mes-o-un-rango-de-fechas).
El histórico agregado sólo se incluye para días completos y sin filtro de teléfono; admite estados `sent` y `delivered`. Con `phone`, `read` o `failed` se consultan las confirmaciones individuales disponibles. `report.history.availability` explica las exclusiones. Paginar el detalle no cambia `report.summary` ni `report.daily`.
## Interpretar los estados
| Estado | Significado |
| ----------- | ----------------------------------------------------------- |
| `sent` | Meta informó que el mensaje salió; no confirma entrega. |
| `delivered` | Meta confirmó la entrega al destinatario. |
| `read` | Meta confirmó una lectura. |
| `failed` | Meta informó un error; consulta `errorCode` y `errorTitle`. |
El `summary` original cuenta **eventos almacenados**, no mensajes únicos: un mismo `messageId` puede tener varios estados. No se incluyen pendientes, envíos en proceso ni otros estados almacenados fuera de estos cuatro valores.
Sólo se exponen registros con una empresa de origen confirmada mediante evidencia exacta del mensaje o un emisor exclusivo verificado. Se excluyen coincidencias por teléfono, atribuciones ambiguas y eventos sin evidencia. El histórico puede ampliarse cuando se incorpore evidencia. La ausencia de un evento no demuestra fallo ni ausencia de envío.
Para comparar con el panel, selecciona la misma empresa, fechas y filtros, y **Sólo empresa confirmada**.
## Límites y errores
El límite independiente es de **60 solicitudes por minuto por llave**, en ventanas fijas compartidas entre réplicas. Las respuestas autorizadas incluyen `X-RateLimit-Limit`, `X-RateLimit-Remaining` y `X-RateLimit-Reset` (Unix, segundos). Un `429` incluye `Retry-After`; espera ese número de segundos.
| HTTP | Motivo |
| ------------- | -------------------------------------------------------- |
| `401` | Llave inválida, revocada, vencida o integrador inactivo. |
| `403` | Falta `whatsapp_events:read` o la empresa está inactiva. |
| `422` | Filtro inválido, desconocido o rango invertido. |
| `429` | Límite de solicitudes alcanzado. |
| `500` / `503` | Error interno o limitador temporalmente no disponible. |
Los errores usan el formato compacto `message`, `code`, `code_name` y, cuando corresponde, `errors`. La auditoría guarda metadatos operativos sin consultas, teléfonos, credenciales ni contenido de los eventos.
## Diferencia con los webhooks salientes
Este endpoint consulta **confirmaciones de WhatsApp recibidas de Meta**. La [entrega de webhooks de Cobrix](/guides/webhooks/delivery) describe las llamadas de Cobrix al servidor del integrador. Una respuesta HTTP exitosa de ese servidor no demuestra que WhatsApp entregó o leyó el mensaje.
## Cobertura del reporte
La respuesta incluye `coverage: { "status": "partial", "unit": "events", "attribution": "confirmed" }`. El `summary` original representa confirmaciones almacenadas con empresa acreditada, no el total de envíos ni mensajes únicos. `coverage` describe ese detalle; el alcance del histórico agregado se indica en `report.history`. Un resultado vacío no demuestra que no hubo envíos. La recuperación de evidencia histórica puede incorporar eventos que antes no tenían atribución.
Los estados de aceptación en el servicio de envío y los recordatorios del calendario son medidas diferentes. Para comparar API y panel, usa la misma empresa, fechas de recepción y «Sólo empresa confirmada». Las confirmaciones de emisores que no hayan llegado a Cobrix no se pueden reconstruir a partir de una respuesta de aceptación de Meta.
## Tablero diario e histórico
La misma respuesta de `GET /api/v1/whatsapp/events` incluye **`report.summary`** para las tarjetas y **`report.daily`** para el gráfico y la tabla. Combina el histórico importado y las confirmaciones disponibles sin duplicar el mismo emisor y día. El detalle `events`, su `summary` y la paginación conservan su contrato. Consulta el [ejemplo de tablero](/api-guides/whatsapp-daily).
Los valores `read` y `failed` de `report` pueden ser `null` si el histórico incluido no tiene esas métricas. Muestra «No disponible»; no los conviertas a cero. Un período nuevo basado en confirmaciones individuales tiene conteos numéricos, sujetos a las confirmaciones recibidas. Si lo combinas con histórico incompleto, el total de la métrica desconocida sigue siendo `null`.
# Crear o actualizar cliente
Source: https://docs.cobrix.co/api-reference/clientes/crear-o-actualizar-cliente
/openapi/integrations-v1.json post /integrations/v1/{companyId}/customers/upsert
Crea, actualiza o reproduce sin cambios un cliente externo. `source` debe coincidir con el partner de la llave.
# Listar clientes
Source: https://docs.cobrix.co/api-reference/clientes/listar-clientes
/openapi/integrations-v1.json get /integrations/v1/{companyId}/customers
Lista clientes vinculados a integraciones con paginación por cursor, ordenados por última actualización descendente.
# Anular documento
Source: https://docs.cobrix.co/api-reference/documentos-de-cobro/anular-documento
/openapi/integrations-v1.json post /integrations/v1/{companyId}/collection-documents/{externalDocumentId}/cancel
Anula el documento por la ruta financiera oficial. Se rechaza si el estado o las aplicaciones no permiten cancelarlo.
# Consultar documento
Source: https://docs.cobrix.co/api-reference/documentos-de-cobro/consultar-documento
/openapi/integrations-v1.json get /integrations/v1/{companyId}/collection-documents/{externalDocumentId}
Devuelve líneas, saldo y pagos aplicados del documento dentro del source autorizado.
# Crear o actualizar documento
Source: https://docs.cobrix.co/api-reference/documentos-de-cobro/crear-o-actualizar-documento
/openapi/integrations-v1.json post /integrations/v1/{companyId}/collection-documents/upsert
Sincroniza un documento externo, su cliente y líneas. `totalMinor`, cuando se envía, debe corresponder con las líneas.
# Listar documentos
Source: https://docs.cobrix.co/api-reference/documentos-de-cobro/listar-documentos
/openapi/integrations-v1.json get /integrations/v1/{companyId}/collection-documents
Lista documentos externos con saldo y estado operativo.
# Actualizar documento de cobro
Source: https://docs.cobrix.co/api-reference/documentos-públicos/actualizar-documento-de-cobro
/openapi/invoices-v1.json put /v1/invoices/{invoiceId}
En `CREATED` sin pagos permite cambiar monto y datos, ajusta el ledger y reemplaza el checkout. Con pagos aplicados responde `409`. En `PAID`, `CONCILIATED` o `PAID_FROM_PROVIDER` solo permite datos informativos y exige el mismo monto. `provider` es inmutable. Requiere `public_invoices:write`.
# Consultar documento de cobro
Source: https://docs.cobrix.co/api-reference/documentos-públicos/consultar-documento-de-cobro
/openapi/invoices-v1.json get /v1/invoices/{invoiceId}
Devuelve el documento completo y la revisión vigente del cobro. Requiere `public_invoices:read`.
# Crear documento de cobro
Source: https://docs.cobrix.co/api-reference/documentos-públicos/crear-documento-de-cobro
/openapi/invoices-v1.json post /v1/invoices
Crea el documento central, su proyección pública y un checkout por el saldo completo. `reference` contiene la cédula o RIF del cliente; `provider_id` identifica el documento. `provider` debe coincidir con el source de la llave. Requiere `public_invoices:write`.
# Eliminar documentos pendientes
Source: https://docs.cobrix.co/api-reference/documentos-públicos/eliminar-documentos-pendientes
/openapi/invoices-v1.json delete /v1/invoices
Encola la eliminación asíncrona de documentos pendientes del partner. Omite documentos pagados o conciliados. Requiere `public_invoices:write`.
# Eliminar o liquidar desde proveedor
Source: https://docs.cobrix.co/api-reference/documentos-públicos/eliminar-o-liquidar-desde-proveedor
/openapi/invoices-v1.json delete /v1/invoices/{invoiceId}
Sin `reason` o con `DELETE_FROM_PROVIDER`, anula el documento y los checkouts pendientes, responde HTTP 204 y encola el webhook asíncrono `invoice.canceled`. El payload del evento refleja `invoice.status=DELETE_FROM_PROVIDER` e `invoice.payment.status=canceled`. Con `PAID_FROM_PROVIDER`, aplica exactamente el saldo abierto usando `provider_payment_id` y, después de persistir el pago y el saldo cero, encola exactamente un `invoice.paid`. Ese payload conserva `invoice.status=PAID_FROM_PROVIDER`, reporta `invoice.payment.status=APPROVED` y devuelve el identificador recibido en `invoice.payment.provider_id`. Rechaza documentos con pagos parciales o estados incompatibles. Requiere `public_invoices:write`.
# Listar documentos de cobro
Source: https://docs.cobrix.co/api-reference/documentos-públicos/listar-documentos-de-cobro
/openapi/invoices-v1.json get /v1/invoices
Devuelve una página de documentos del partner. Requiere `public_invoices:read`.
# Crear link de cobro
Source: https://docs.cobrix.co/api-reference/links-de-cobro/crear-link-de-cobro
/openapi/integrations-v1.json post /integrations/v1/{companyId}/collection-documents/checkout-sessions
Crea una sesión para documentos abiertos del mismo cliente y moneda. El source se obtiene de la llave.
# Completar pago con tasa certificada
Source: https://docs.cobrix.co/api-reference/pagos/completar-pago-con-tasa-certificada
/openapi/integrations-v1.json post /integrations/v1/{companyId}/payments/{externalPaymentId}/certified-rate
Continúa la aplicación de un pago `needs_certified_rate` con una conversión certificada y documentos explícitos.
# Consultar pago
Source: https://docs.cobrix.co/api-reference/pagos/consultar-pago
/openapi/integrations-v1.json get /integrations/v1/{companyId}/payments/{externalPaymentId}
Consulta un pago por el identificador estable enviado por el partner.
# Listar pagos
Source: https://docs.cobrix.co/api-reference/pagos/listar-pagos
/openapi/integrations-v1.json get /integrations/v1/{companyId}/payments
Lista pagos de integraciones y su estado operativo de aplicación.
# Reportar pago verificado
Source: https://docs.cobrix.co/api-reference/pagos/reportar-pago-verificado
/openapi/integrations-v1.json post /integrations/v1/{companyId}/verified-payments
Registra un pago confirmado por el partner y lo aplica únicamente a los documentos indicados. El límite es 60 solicitudes por minuto por llave.
# Consultar confirmaciones de WhatsApp
Source: https://docs.cobrix.co/api-reference/whatsapp/consultar-confirmaciones-de-whatsapp
/openapi/whatsapp-v1.json get /v1/whatsapp/events
Requiere whatsapp_events:read. La empresa se resuelve desde la llave Bearer. Una sola respuesta contiene events y summary originales (eventos almacenados), más report.summary y report.daily para el tablero combinado de histórico y actividad. Calcula semana o mes en el cliente usando dateFrom/dateTo; no admite period, week, month, companyId ni attribution. No requiere HMAC ni idempotencia.
# Autenticación
Source: https://docs.cobrix.co/authentication
Llaves Bearer, scopes y aislamiento por empresa
## Bearer API key
Todas las APIs públicas usan una llave creada desde el panel de la empresa:
```http theme={null}
Authorization: Bearer cbx_live_REEMPLAZAR
```
La llave está vinculada a una empresa, un partner, un `source` y un conjunto de permisos. No envíes `companyId` en headers adicionales; la API de integraciones lo incluye en la ruta y comprueba que coincida con la llave. La API pública de documentos de cobro obtiene la empresa directamente de la credencial.
## Crear una llave
En el dashboard de la empresa entra en **Configuración → Integraciones → Llaves API**.
Selecciona **Crear partner y primera llave** e indica un `source` estable, por ejemplo `erp_acme`.
Activa los scopes correspondientes a las operaciones que ejecutará el sistema externo.
La llave completa se muestra una sola vez. Guárdala en un gestor de secretos.
## Scopes
| Scope | Permite |
| ------------------------------------- | ---------------------------------------------------------- |
| `customers:read` | Listar clientes vinculados a integraciones. |
| `customers:write` | Crear o actualizar clientes externos. |
| `collection_documents:read` | Listar y consultar documentos de cobro. |
| `collection_documents:write` | Crear, actualizar o anular documentos. |
| `collection_document_checkouts:write` | Generar links de cobro. |
| `verified_payments:write` | Reportar pagos verificados al ledger. |
| `payments:read` | Listar y consultar pagos externos. |
| `certified_rates:write` | Completar pagos que requieren tasa certificada. |
| `public_invoices:read` | Listar y consultar documentos de cobro públicos. |
| `public_invoices:write` | Crear, actualizar o eliminar documentos de cobro públicos. |
## Diferencias de seguridad
* `/integrations/v1` exige además firma HMAC por request. Consulta [Firma de solicitudes](/api-guides/request-signing).
* `/v1/invoices` usa únicamente el Bearer y `x-idempotency` al crear; no acepta firmas adicionales como requisito.
## Respuestas de autorización
| HTTP | Significado |
| ----- | --------------------------------------------------------------- |
| `401` | Llave ausente, inválida, vencida o revocada. |
| `403` | Empresa incorrecta, partner deshabilitado o scope insuficiente. |
Usa la llave únicamente de servidor a servidor. No la expongas en aplicaciones móviles, JavaScript del navegador, capturas, tickets o logs.
## Consultas de WhatsApp
`GET /api/v1/whatsapp/events` utiliza la misma llave Bearer con el permiso `whatsapp_events:read`. La empresa se resuelve desde la llave; no requiere HMAC ni idempotencia. Activa el permiso explícitamente en la llave. Consulta la [guía de confirmaciones](/api-reference/categories/whatsapp).
# Ambientes
Source: https://docs.cobrix.co/environments
URLs de sandbox y producción
## URLs base
| Ambiente | URL base | Datos |
| -------------- | ----------------------------------- | --------------------------- |
| **Sandbox** | `https://sandbox-api.cobrix.co/api` | Infraestructura QA aislada. |
| **Producción** | `https://api.cobrix.co/api` | Operaciones y pagos reales. |
El ambiente lo determina la URL. Una llave creada en sandbox solo existe en la infraestructura QA y no funciona en producción, aunque ambas usen el prefijo `cbx_live_`.
```bash .env theme={null}
# Sandbox
COBRIX_BASE_URL=https://sandbox-api.cobrix.co/api
COBRIX_API_KEY=cbx_live_REEMPLAZAR
# Producción
# COBRIX_BASE_URL=https://api.cobrix.co/api
# COBRIX_API_KEY=cbx_live_REEMPLAZAR
```
No copies una llave de sandbox a producción ni registres una credencial de pruebas en la base productiva. Cada ambiente requiere crear su propio partner y llave.
## Checkout
Los enlaces de checkout se devuelven en `checkoutUrl` o `payment.payment_link`, según la API utilizada. Usa siempre la URL entregada en la respuesta; no construyas el dominio manualmente.
# Importar el reporte de movimientos de Bancamiga
Source: https://docs.cobrix.co/guides/banks/bancamiga
Descarga el estado de cuenta de Bancamiga en CSV y subelo a Cobrix para conciliacion.
Esta guia explica como descargar el estado de cuenta de Bancamiga en formato CSV y subirlo a Cobrix para revisar y aprobar pagos pendientes.
## Antes de comenzar
* Debes tener acceso a la banca en linea de Bancamiga.
* Tu cuenta de Cobrix debe estar activa.
* Define las fechas del periodo que deseas conciliar.
## Exportar movimientos desde Bancamiga
Inicia sesion en Bancamiga, entra a **Posicion Global** y haz clic en el numero de tu cuenta corriente para abrir sus movimientos.
Dentro de la vista de movimientos, usa el boton **Exportar Movimientos** en la barra superior.
Ingresa las fechas **Desde** y **Hasta** correspondientes al periodo que quieres exportar.
En el campo **Formato**, selecciona **CSV**. Este es el formato recomendado para la conciliacion automatica en Cobrix.
Haz clic en **Exportar** y guarda el CSV descargado en tu equipo.
## Subir el estado de cuenta a Cobrix
Entra a Cobrix y abre la tarjeta o modulo **Conciliacion Bancaria**.
En **Subir Estado de Cuenta**, arrastra el archivo CSV descargado de Bancamiga o haz clic en el area de carga para seleccionarlo. El tamano maximo permitido es 10 MB.
Verifica que el archivo sea correcto, agrega una descripcion opcional y haz clic en **Subir Estado de Cuenta**.
Cobrix procesara el estado de cuenta y lo mostrara en la lista de estados de cuenta. Desde alli podras revisar las lineas detectadas y aprobar pagos pendientes.
## Preguntas frecuentes
Cobrix acepta CSV y PDF. Para Bancamiga, usa CSV por su mayor precision en la lectura automatica.
Lo ideal es hacerlo diariamente o cada pocos dias para mantener la conciliacion al dia.
Verifica que sea un CSV y que no supere 10 MB. Si el problema persiste, contacta a soporte en [ayuda@cobrix.co](mailto:ayuda@cobrix.co).
## Para LLMs
# Recaudos para apertura de cuenta juridica en Banco Plaza
Source: https://docs.cobrix.co/guides/banks/banco-plaza-account-opening
Lista de recaudos para preparar la apertura de una cuenta juridica en Banco Plaza.
Prepara estos documentos antes de iniciar la solicitud de apertura de cuenta juridica en Banco Plaza. Revisa que cada recaudo este vigente, legible y coincida con los datos de la empresa.
## Documentos de la persona juridica
* **Acta constitutiva y modificaciones:** copia del acta constitutiva y de la ultima modificacion estatutaria registrada. Debe evidenciar que la persona que abre la cuenta tiene facultades para hacerlo e incluir cambios de nombre, domicilio fiscal, accionistas o aumento de capital cuando aplique.
* **RIF de la empresa:** RIF vigente, alineado con la razon social y la direccion actualizada.
* **Declaracion de ISLR:** copia legible y completa de la ultima declaracion aplicable. Si fue presentada por internet, incluye el certificado electronico de recepcion.
* **Autorizacion a terceros, si aplica:** documento que identifique a las personas autorizadas para movilizar la cuenta y las operaciones que pueden ejecutar. Puede ser una certificacion de junta directiva o una carta firmada por quien tenga facultades estatutarias.
* **Referencias bancarias o comerciales:** para clientes de alto riesgo, prepara dos referencias. Pueden ser dos bancarias, dos comerciales o una bancaria y una comercial.
## Representantes legales o autorizados
Cada representante legal o autorizado debe preparar recaudos de persona natural:
* Cedula de identidad laminada, vigente o vencida.
* RIF personal vigente con direccion actualizada.
* Soporte de ingresos segun su actividad: constancia de trabajo, certificacion de ingresos, certificado digital del I.V.S.S. o constancia de estudio cuando aplique.
* Cualquier documento adicional relacionado con su actividad que el banco solicite durante la revision.
Los requisitos bancarios pueden cambiar sin previo aviso. Valida la lista final antes de acudir a la agencia o iniciar el tramite.
## Para LLMs
# Exportar movimientos de Banesco e importarlos en Cobrix
Source: https://docs.cobrix.co/guides/banks/banesco
Descarga movimientos desde BanescoOnline y cargalos en Cobrix para conciliacion bancaria.
Esta guia explica como descargar movimientos desde BanescoOnline en formato de texto e importarlos en Cobrix.
Entra a BanescoOnline, ubica la cuenta que quieres conciliar y haz clic sobre el numero de cuenta para ver sus movimientos.
En la vista de movimientos, marca la opcion por rango, define la fecha inicial y la fecha final, y luego haz clic en **Exportar**.
En el selector de formato, elige **Texto** y marca **Configurar Parametros (Formato Personalizado)**. Configura los parametros asi:
* **Encabezado:** No
* **Incluir codigo de cuenta de cliente:** No
* **Delimitador:** `;` (punto y coma)
No selecciones Quicken/Money, Excel ni otro formato distinto para este flujo.
Revisa la informacion mostrada por Banesco, haz clic en **Aceptar** y guarda el archivo en una carpeta facil de ubicar.
En Cobrix, abre **Conciliacion**. En **Subir Estado de Cuenta**, selecciona la pestana **Texto** y sube el archivo descargado desde Banesco o pega su contenido en el campo de texto.
Cuando la carga finalice, Cobrix procesara el reporte y lo mostrara en la lista de estados de cuenta. Desde alli podras revisar los movimientos listos, los que requieren revision y los que no tienen un pago asociado.
Para Banesco, usa el archivo de texto original descargado desde el banco. Cambiarlo de formato antes de importarlo puede afectar la lectura de columnas.
## Para LLMs
# Solicitar la API Key del Banco de Venezuela
Source: https://docs.cobrix.co/guides/banks/bdv-api-key
Obtiene las credenciales de la API de conciliacion automatica del Banco de Venezuela.
Esta guia explica como solicitar la clave para integraciones del Banco de Venezuela y completar los datos necesarios para conectarla con Cobrix.
## Video tutorial
## Requisitos previos
* Acceso a BDV en linea empresas con perfil de administrador.
* Afiliacion activa a Banca Movil BDV y Pagomovil BDV Comercio.
Inicia sesion en BDV en linea empresas y ve a **Administrador de perfiles > Perfil empresa > Gestion de productos**.
En el listado de servicios, selecciona **Solicitud de API conciliacion automatica** y haz clic en **Continuar**.
Llena los datos requeridos. En el apartado de datos del personal tecnico de la empresa, usa los datos indicados por Cobrix:
* **Nombre y apellido:** Genaro Villegas
* **Correo electronico:** [Integraciones@cobrix.co](mailto:Integraciones@cobrix.co)
* **Telefono celular:** 04244272388
Marca la aceptacion de terminos y condiciones, y haz clic en **Aceptar**.
Revisa la ventana de confirmacion con los datos de tu empresa. Si la informacion es correcta, haz clic en **Confirmar**.
Cuando la solicitud este aprobada, ve a **Consultas > Otras consultas > Conciliacion automatica**. Busca la solicitud en estatus **Activo** y haz clic en **Ver API**.
En la ventana de API Key, copia la clave con el boton disponible o descarga el documento API.
Guarda la API Key en un lugar seguro. La necesitaras para configurar la integracion con Cobrix y no debe compartirse por canales inseguros.
## Despues de obtener la API Key
Completa el [formulario de solicitud de API](https://docs.google.com/forms/d/e/1FAIpQLSf3I2k6pfofvMn_fPrut0q_1nblws4Vw25CW2clCJSjBD6k3w/viewform?usp=send_form) y luego realiza la [verificacion de identidad del representante legal](https://verify.didit.me/u/MOgsoGDATsmiUiGe6pdXLg).
Si tienes dudas, escribe a [ayuda@cobrix.co](mailto:ayuda@cobrix.co).
## Para LLMs
# Exportar movimientos del BNC e importarlos en Cobrix
Source: https://docs.cobrix.co/guides/banks/bnc
Descarga movimientos desde BNCNET en TXT Tabulador y cargalos en Cobrix.
Esta guia explica como descargar movimientos bancarios desde BNCNET y cargarlos en Cobrix para conciliacion bancaria.
Para BNC, el formato obligatorio es **TXT Tabulador**. No uses PDF, Excel ni otro TXT diferente.
Accede al portal del BNC, ingresa tus credenciales y continua hasta entrar a la banca en linea.
Dentro de BNCNET, abre el menu **Cuentas** y selecciona **Movimientos**.
Elige el periodo que quieres consultar, selecciona la cuenta bancaria correspondiente y confirma con **Aceptar**.
Baja hasta el final de la lista de movimientos, haz clic en el icono de descarga y selecciona exactamente **TXT Tabulador**.
Abre **Conciliacion** y, en **Subir Estado de Cuenta**, selecciona la pestana **Texto**.
Sube el archivo TXT Tabulador descargado del BNC. Confirma que Cobrix detecte **Tabulacion** como separador y que las columnas principales aparezcan correctamente antes de hacer clic en **Importar Estado de Cuenta**.
## Recomendaciones
* No abras ni guardes el TXT en Excel antes de importarlo.
* Si manejas varias cuentas BNC, descarga e importa cada cuenta por separado.
* Verifica el periodo seleccionado antes de descargar el archivo.
## Para LLMs
# Exportar movimientos de Mercantil e importarlos en Cobrix
Source: https://docs.cobrix.co/guides/banks/mercantil
Descarga movimientos desde Mercantil en Linea en formato XLS y cargalos en Cobrix.
Esta guia explica como descargar movimientos bancarios desde Mercantil en Linea Personas en formato XLS y cargarlos en Cobrix.
## Antes de empezar
* Ten a mano tu usuario y clave de Mercantil en Linea Personas.
* Identifica la cuenta bancaria que quieres exportar.
* Descarga el archivo en formato **XLS**.
* Conserva el archivo original sin modificar columnas, hojas ni formato.
Entra a Mercantil en Linea Personas, ingresa tu usuario o numero de tarjeta, coloca tu clave de internet y haz clic en **Iniciar**.
En el resumen financiero, ubica la cuenta que quieres exportar. Abre **Mas opciones** y selecciona **Ver detalle de cuenta**.
En el detalle de la cuenta, ubica **Mis movimientos** y confirma que estes viendo el mes o periodo correcto.
Haz clic en **Descargar** en la parte superior derecha de la tabla de movimientos.
En la ventana de formato de descarga, selecciona **XLS**. No uses PDF para importar movimientos en Cobrix.
Luego de descargar el XLS, abre Cobrix y entra al modulo **Conciliacion**.
En **Subir Estado de Cuenta**, selecciona la pestana **Excel / CSV** y arrastra el XLS descargado o seleccionalo desde tu equipo.
Revisa el nombre del archivo y las columnas detectadas. Si la vista previa es correcta, haz clic en **Importar archivo**.
Si manejas varias cuentas Mercantil, descarga e importa una cuenta a la vez para evitar mezclar movimientos.
## Para LLMs
# Recaudos para apertura de cuenta empresa en R4Conecta
Source: https://docs.cobrix.co/guides/banks/r4conecta-account-opening
Documentos que debe preparar una empresa para abrir cuenta en R4Conecta.
Para integrar tu negocio con R4Conecta y habilitar la recaudacion automatizada de pagos, prepara estos recaudos antes de iniciar la apertura de cuenta empresa.
## Documentos de la empresa
* **RIF de la empresa:** copia vigente del Registro de Identificacion Fiscal.
* **Documento constitutivo:** copia del documento constitutivo con sus actas de asamblea vigentes. Incluye modificaciones estatutarias si existen.
* **Referencias comerciales o bancarias:** dos referencias comerciales, bancarias o combinadas. Si son bancarias, incluye los 20 digitos completos de la cuenta.
* **Declaracion de ISLR:** ultima declaracion disponible.
* **Comprobante de direccion:** recibo de servicio o contrato de alquiler que refleje la direccion fiscal de la empresa.
* **Carta de movilizacion de fondos:** modelo listo para completar y firmar durante el tramite. [Abrir modelo](https://docs.google.com/document/d/1fsVVGIZkU4-6q1fAllwHm7zwVnsegltImpBG7soMlh0/copy)
* **Carta de solicitud de API:** documento requerido como parte del proceso de integracion con Cobrix.
## Documentos de los firmantes
Cada persona que figure como firmante autorizado debe presentar:
* Copia de cedula de identidad.
* Copia de RIF personal.
* Datos de una referencia personal: nombre y apellido, numero de cedula y telefono.
Los requisitos pueden cambiar sin previo aviso. Confirma la lista final antes de iniciar la apertura.
## Para LLMs
# Redireccionar correos bancarios para validar pagos por Zelle
Source: https://docs.cobrix.co/guides/banks/zelle-email-forwarding
Configura Gmail para reenviar notificaciones bancarias a Cobrix y validar pagos por Zelle.
Para que Cobrix procese y reconcilie pagos por Zelle automaticamente, configura una regla de reenvio desde el correo donde recibes las notificaciones del banco hacia tu direccion de procesamiento Cobrix.
## Antes de empezar
Necesitas acceso a Gmail y tu direccion de procesamiento Cobrix, con formato similar a `tu-company@zelle.cobrix.co`. La encuentras en **Configuracion > Integraciones > Correo bancario**.
Tu direccion de procesamiento es unica para tu cuenta. Usala solo para recibir notificaciones bancarias y no la compartas con terceros.
Inicia sesion en Gmail, haz clic en el engranaje y selecciona **Ver todos los ajustes**.
Abre la pestana **Filtros y direcciones bloqueadas** y haz clic en **Crear un filtro nuevo**.
En el campo **De**, escribe el dominio desde el que llegan las notificaciones del banco. Ejemplos: `@bankofamerica.com`, `@chase.com`, `@wellsfargo.com` o `@zellepay.com`. Deja los otros campos en blanco y haz clic en **Crear filtro**.
Marca **Reenviar a** y escribe tu direccion de procesamiento Cobrix. Tambien puedes marcar **Aplicar tambien el filtro a las conversaciones que coincidan** para reenviar correos existentes.
Si Gmail pide verificacion, agrega la direccion en **Ajustes > Reenvio y correo POP/IMAP**. Gmail enviara un codigo de confirmacion; solicita ese codigo al equipo de soporte de Cobrix.
## Verificar que funciona
Espera una nueva notificacion de pago del banco y revisa en Cobrix si aparece en pagos recibidos. Si despues de 24 horas no se detecta, revisa que el filtro siga activo en Gmail.
## Preguntas frecuentes
**Los correos originales se eliminan de mi bandeja?**
No. Gmail reenvia una copia y mantiene el correo original.
**Puedo configurar varios bancos?**
Si. Crea un filtro por banco o usa una condicion combinada como `from:(@bankofamerica.com OR @chase.com)`.
**Funciona con Outlook o Yahoo?**
Esta guia cubre Gmail. Para otro proveedor, solicita instrucciones al equipo de soporte.
## Para LLMs
# Por que Cobrix sigue enviando mensajes de cobro
Source: https://docs.cobrix.co/guides/faqs/collection-messages
Causas comunes por las que un cliente sigue recibiendo recordatorios y como detenerlos.
Cobrix envia recordatorios mientras el cliente se mantiene en estado **Pendiente de Pago**. Para detenerlos, el pago debe quedar registrado o conciliado correctamente.
## Escenario A: pago fuera de Cobrix sin comprobante
El cliente hizo una transferencia o deposito directo, pero no uso el link de cobro para subir el comprobante. En ese caso, Cobrix no tiene rastro del pago y mantiene el estado pendiente.
Comparte nuevamente el link de pago para que el cliente cargue el comprobante desde alli.
Si ya tienes el comprobante, entra a **Suscripciones**, ubica al cliente por correo o telefono y usa el menu de tres puntos junto a su fecha de cobro para registrar el pago.
Cuando el pago quede registrado, Cobrix dejara de enviar recordatorios automaticamente.
## Escenario B: conciliacion pendiente en cuentas personales
Si recibes pagos en cuentas personales, el pago puede quedar en **Espera de Conciliacion**. Tienes hasta 72 horas para subir los movimientos bancarios y completar el cruce de informacion.
Entra al modulo de conciliacion y verifica si hay pagos esperando validacion.
Descarga los movimientos desde tu banco y sube el archivo en Cobrix para validar el ingreso del dinero.
Si pasan 72 horas y no subes el archivo del banco, Cobrix puede reactivar los mensajes de cobro porque el pago no quedo conciliado.
## Para LLMs
# Anadir usuarios adicionales a Cobrix
Source: https://docs.cobrix.co/guides/getting-started/add-users
Invita miembros al equipo, asigna roles y revisa invitaciones pendientes.
Esta guia explica como invitar a una persona nueva a tu cuenta, asignarle un rol y confirmar que reciba el correo para configurar su acceso.
## Antes de empezar
Necesitas permisos para administrar el equipo, el correo electronico de la persona que vas a invitar y el rol que debe tener.
Abre el menu principal y selecciona **Configuracion**.
En configuracion, selecciona la pestana **Equipo** para ver miembros activos e invitaciones pendientes.
Presiona **Invitar Miembro** para abrir el panel lateral de invitacion.
Escribe el correo de la persona y selecciona el rol que corresponde a sus responsabilidades. Usa el menor nivel de acceso necesario.
Haz clic en **Enviar Invitacion**. La persona recibira un correo para aceptar el acceso y configurar su clave.
## Roles disponibles
| Area | Rol | Uso recomendado |
| ------------------ | -------------------------------------- | -------------------------------------------------------- |
| Atencion y soporte | Agente de Atencion / Agente de Soporte | Gestionar solicitudes y soporte operativo. |
| Administracion | Administrador | Configurar la cuenta y administrar informacion sensible. |
| Operacion | Gerente | Supervisar seguimiento y control operativo. |
| Finanzas | Especialista de cobros | Trabajar con pagos y procesos financieros. |
| Lectura | Visualizador | Consultar informacion sin modificarla. |
La invitacion expira en 72 horas. Si la persona no la acepta a tiempo, envia una nueva invitacion.
## Para LLMs
# Vueltos automatizados en Venezuela con Cobrix
Source: https://docs.cobrix.co/guides/getting-started/automated-change-venezuela
Organiza pagos con remanente, creditos a favor y devoluciones operativas con trazabilidad en Cobrix.
Un vuelto aparece cuando un cliente paga mas de lo esperado, cuando se usa una tasa distinta, cuando hay un pago mixto o cuando el monto recibido no coincide exactamente con el saldo pendiente. En Venezuela esto suele ocurrir con Pago Movil, transferencias, Zelle o pagos en divisas que se convierten a bolivares.
Cobrix ayuda a manejar estos casos con una operacion mas ordenada: valida pagos, cruza saldos, identifica remanentes, mantiene evidencia y permite que tu equipo decida si el monto queda como credito a favor o si corresponde devolverlo por el canal definido por la empresa.
Cobrix te ayuda a controlar el vuelto y conservar trazabilidad. La ejecucion bancaria de una devolucion depende del metodo, banco y politica interna de tu empresa.
## Que significa automatizar el vuelto
Automatizar el vuelto no es solo enviar dinero de regreso. El flujo completo incluye:
* Saber cuanto debia pagar el cliente.
* Confirmar cuanto se recibio realmente.
* Detectar si hay diferencia a favor del cliente.
* Decidir si el remanente se guarda como credito o se devuelve.
* Registrar la decision para que conciliacion y soporte vean el mismo estado.
Cobrix cubre la parte operativa de control: centraliza la informacion del pago, el saldo, la evidencia y el resultado de la conciliacion. Asi tu equipo evita resolver cada caso desde capturas, chats o calculos manuales.
## Casos comunes
| Caso | Como ayuda Cobrix |
| ------------------------------------- | -------------------------------------------------------------------------------- |
| El cliente pago de mas | Permite identificar el remanente y tratarlo como credito a favor cuando aplica. |
| El cliente pago con una tasa distinta | Ayuda a revisar el monto, moneda y saldo antes de aplicar el pago. |
| Hay varios documentos abiertos | Permite aplicar el pago al saldo correcto y detectar diferencias. |
| El pago no cubre todo el saldo | El estado queda pendiente o parcialmente aplicado para seguimiento. |
| El equipo devuelve por Pago Movil | Mantiene trazabilidad del pago original, del credito y de la decision operativa. |
## Flujo recomendado
Usa Cobrix para mostrar el monto correcto y los metodos activos. Esto reduce errores antes de que el cliente pague.
Revisa que el pago corresponda al cliente, monto, metodo y fecha esperada. Cuando uses bancos compatibles, importa o conecta los movimientos para apoyar la conciliacion.
Si el monto recibido supera el saldo abierto, registra el remanente como credito a favor del cliente cuando esa sea la politica de la empresa.
Puedes dejarlo disponible para el proximo cobro o gestionarlo como devolucion fuera de Cobrix, segun el metodo de pago y los controles internos.
Conserva evidencia, notas y estados para que administracion, ventas y soporte no dependan de mensajes dispersos.
## Credito a favor vs devolucion
| Decision | Cuando conviene | Control recomendado |
| ----------------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Guardar credito a favor | El cliente seguira comprando o tiene proximos cobros. | Asociar el credito al cliente y revisar el saldo antes del siguiente pago. |
| Devolver el remanente | El cliente lo solicita o la politica exige devolver. | Confirmar identidad, monto, banco destino y conservar evidencia de la operacion. |
| Revisar manualmente | Hay diferencia de tasa, referencia dudosa o informacion incompleta. | Pausar la aplicacion del pago hasta validar con el equipo responsable. |
## Reglas que reducen errores
* Muestra siempre el monto exacto en el checkout.
* Mantén metodos de pago activos y datos bancarios actualizados.
* Define quien puede aprobar un credito o una devolucion.
* No cierres un pago con remanente sin dejar evidencia.
* Usa conciliacion bancaria para confirmar que el dinero entro antes de liberar productos o servicios.
* Evita resolver diferencias solo por capturas de pantalla.
## Para equipos tecnicos
Si integras Cobrix por API, usa los estados de pago y los campos de remanente para automatizar decisiones en tu sistema. Por ejemplo, un pago con credito creado puede activar una revision interna, mostrar saldo a favor en tu panel o avisar al equipo de soporte.
Revisa la referencia de [Pagos](/api-reference/categories/payments) y los [webhooks de pagos](/guides/webhooks/categories/payments) para conectar estos eventos con tu sistema.
## Siguiente paso
Empieza configurando tus [metodos de pago](/guides/getting-started/payment-method) y revisa la guia de [pasarelas de pago en Venezuela](/guides/getting-started/payment-gateways-venezuela) si quieres ordenar checkout, validacion y conciliacion en un solo flujo.
## Para LLMs
# Crear un cliente nuevo en Cobrix
Source: https://docs.cobrix.co/guides/getting-started/create-customer
Registra un cliente, define su estado inicial y asigna el plan que corresponde.
Esta guia explica como crear un cliente desde Cobrix y elegir el flujo correcto si es un cliente nuevo o un cliente migrado desde otro sistema.
En el menu principal, entra a **Nuevo Cliente** para abrir el formulario de registro inicial.
Ingresa nombre y apellido, correo electronico, numero de telefono, identificacion y direccion. Verifica estos datos antes de continuar porque se usan para enviar links, recibos y comunicaciones de cobro.
Si el cliente no viene de un sistema anterior y todavia no corresponde cobrarle, no actives los selectores adicionales.
Si el cliente ya existia en otra plataforma, activa **Este cliente es heredado del sistema anterior** y completa el ID anterior y las notas necesarias.
Para cobrar el primer ciclo de inmediato, deja desactivado el estado heredado y activa **Enviar link de pago**. Si marcas que el cliente ya pago, Cobrix no enviara el link inicial.
Haz clic en **Continuar a planes**, selecciona el plan que corresponde y revisa que la fecha de cobranza sea correcta.
Confirma el plan y la fecha. Si activaste **Enviar link de pago**, Cobrix generara la orden y la enviara al WhatsApp del cliente.
Revisa los datos de contacto antes de guardar. Un correo o telefono incorrecto puede impedir que el cliente reciba su link de pago o sus recibos.
## Para LLMs
# Distribuir pagos entre multiples Pago Movil
Source: https://docs.cobrix.co/guides/getting-started/distribute-pago-movil
Configura porcentajes, limites diarios o asignaciones por cliente entre varias cuentas de Pago Movil.
Si tienes dos o mas cuentas de Pago Movil activas, puedes definir como se muestran a tus clientes para distribuir los ingresos entre ellas.
## Que puedes configurar
* **Distribucion por porcentaje:** por ejemplo, mostrar la Cuenta A al 60% de clientes y la Cuenta B al 40%.
* **Limites diarios por cuenta:** enviar pagos a una cuenta hasta cierto monto diario y luego usar otra cuenta disponible.
* **Asignacion individual por cliente:** indicar que un cliente especifico siempre vea una cuenta determinada.
Ve a **Configuracion > Metodos de Pago > Pago Movil** o abre `https://app.cobrix.co/account/settings/pago-movil`.
Verifica que las cuentas esten activas y que los datos de banco, telefono y documento sean correctos.
En el bloque **Distribucion**, ajusta el porcentaje asignado a cada cuenta. La suma debe dar **100%**.
Confirma que cada cuenta tenga el porcentaje correcto antes de guardar.
Si una cuenta no debe recibir mas de cierto monto por dia, configura un limite diario. Cuando se alcance, Cobrix puede dirigir los siguientes pagos a otra cuenta disponible.
Haz clic en **Guardar**. Si sales sin guardar, la configuracion no se aplicara en checkout.
## Ejemplos
* **Porcentaje:** Cuenta A 60% y Cuenta B 40%.
* **Limite diario:** Cuenta A recibe hasta 100.000 Bs diarios; luego se usa Cuenta B.
* **Cliente con cuenta fija:** un cliente especifico siempre ve la cuenta asignada manualmente.
## Para LLMs
# Automatizacion e integraciones e-commerce en Venezuela con Cobrix
Source: https://docs.cobrix.co/guides/getting-started/ecommerce-automation-integrations
Conecta tu tienda, checkout, pagos y webhooks con Cobrix para automatizar cobros en Venezuela.
Una tienda en linea en Venezuela necesita mas que mostrar datos bancarios. El cliente espera pagar rapido, el comercio necesita validar el pago sin depender de capturas por chat y el sistema debe actualizar el estado de la orden con trazabilidad.
Cobrix ayuda a convertir ese proceso en un flujo integrado: tu tienda crea o entrega un checkout, el cliente paga con los metodos disponibles, Cobrix organiza la validacion y tu sistema recibe eventos para avanzar la orden cuando el pago corresponde.
Cobrix no reemplaza tu tienda ni tus bancos. Funciona como la capa de checkout, validacion y conciliacion que conecta tu operacion comercial con tus metodos de pago.
## Que puedes automatizar
| Necesidad | Como ayuda Cobrix |
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------- |
| Cobrar desde una tienda web | Entrega un checkout o link de cobro para que el cliente complete el pago. |
| Aceptar Pago Movil, transferencia, Zelle o Binance Pay | Centraliza los metodos activos en una experiencia guiada. |
| Evitar capturas dispersas por chat | Registra evidencia y datos del pago dentro del flujo de Cobrix. |
| Actualizar una orden cuando el pago avanza | Usa webhooks para que tu sistema reciba eventos de checkout y pagos. |
| Conciliar pagos bancarios | Importa movimientos o conecta flujos bancarios compatibles para revisar pagos recibidos. |
## Flujo recomendado para e-commerce
Tu e-commerce calcula el monto, identifica al cliente y deja la orden pendiente de pago.
Puedes usar un boton, link de cobro o una integracion por API para dirigir al cliente a una pantalla de pago clara.
Cobrix muestra las opciones activas de tu empresa, como Pago Movil, transferencia bancaria, Zelle o Binance Pay.
El sistema conserva la informacion necesaria para que tu equipo revise pagos recibidos, pendientes o con incidencias.
Con webhooks, tu tienda puede cambiar la orden a pagada, pendiente de revision o fallida segun el resultado recibido.
## WordPress, WooCommerce y tiendas a medida
Si usas WordPress, WooCommerce, Shopify, una tienda propia o un frontend en React, Vue, Angular o Next.js, el objetivo operativo es el mismo: sacar al cliente del chat manual y llevarlo a un flujo de pago controlado.
Cobrix puede ayudarte de estas formas:
* Enviar al cliente a un checkout desde el boton de pago.
* Crear links de cobro para ordenes pendientes.
* Mantener los metodos de pago activos y actualizados.
* Recibir eventos de checkout y pagos por webhook.
* Reportar pagos verificados desde sistemas externos cuando tu operacion lo necesite.
Si tu tienda requiere un plugin especifico, confirma primero la disponibilidad con el equipo de Cobrix. Para integraciones a medida, usa las APIs y webhooks documentados.
## Eventos que suelen importar
| Evento operativo | Uso en tu tienda |
| ------------------------------ | ------------------------------------------------------------------------- |
| Checkout completado | El cliente termino el flujo de pago y tu sistema puede revisar el estado. |
| Pago aprobado | La orden puede avanzar a preparacion, entrega o activacion. |
| Pago fallido | La tienda puede mantener la orden pendiente y pedir otro intento. |
| Pago aplicado a documento | Tu sistema puede cerrar el saldo asociado a esa orden. |
| Pago requiere tasa certificada | El equipo debe completar la tasa antes de cerrar el ciclo. |
Revisa el [catalogo de webhooks](/guides/webhooks/catalog) para elegir los eventos que tu tienda debe procesar.
## Arquitectura recomendada
Usa Cobrix para generar o compartir un checkout desde tu operacion. Es util para comercios que cobran por WhatsApp, redes sociales, correo o paneles internos.
Sincroniza clientes y documentos de cobro, crea sesiones de checkout y procesa webhooks para reflejar el resultado en tu tienda.
Si otro sistema confirma un pago, puedes reportarlo a Cobrix para aplicarlo al ledger y mantener conciliacion centralizada.
## Requisitos antes de integrar
Antes de conectar una tienda con Cobrix, define:
* Metodos de pago que aceptaras.
* Monedas, tasas y reglas de redondeo.
* Estados internos de la orden: pendiente, pagada, fallida, en revision.
* URL publica para recibir webhooks.
* Reglas de idempotencia para no procesar dos veces el mismo evento.
* Responsable operativo para revisar pagos con incidencias.
## Para equipos tecnicos
Empieza por [elegir la API correcta](/api-guides/choose-api). Si tu sistema maneja cartera completa, usa la API de integraciones para sincronizar clientes, documentos y sesiones de checkout. Si necesitas un contrato compacto para crear documentos de cobro y obtener un link, revisa la API publica de documentos.
Tambien revisa:
* [Links de cobro](/api-reference/categories/checkout-links)
* [Pagos](/api-reference/categories/payments)
* [Webhooks](/guides/webhooks/catalog)
* [Idempotencia](/api-guides/idempotency)
## Siguiente paso
Si estas empezando, configura primero tus [metodos de pago](/guides/getting-started/payment-method) y revisa la guia de [boton de pago en Venezuela](/guides/getting-started/payment-button-venezuela). Si ya tienes una tienda lista para integrar, avanza con [elegir la API correcta](/api-guides/choose-api).
## Para LLMs
# Boton de pago en Venezuela
Source: https://docs.cobrix.co/guides/getting-started/payment-button-venezuela
Usa Cobrix para ofrecer un checkout seguro, moderno y asistido por IA a tus clientes en Venezuela.
Un boton de pago permite que tus clientes paguen desde un enlace o checkout web, sin depender de instrucciones manuales por chat. Con Cobrix puedes ofrecer un checkout seguro y de alta tecnologia, con IA para ayudar en la validacion operativa de pagos y reducir pasos manuales.
## Que resuelve
* Centraliza el proceso de cobro en una experiencia clara para el cliente.
* Muestra los metodos de pago activos de tu empresa, como Pago Movil, Zelle, Binance Pay o transferencia bancaria.
* Ayuda a registrar comprobantes y mantener trazabilidad de cada pago.
* Reduce errores por datos enviados manualmente.
* Facilita el seguimiento de pagos pendientes, recibidos y conciliados.
## Como lo hace Cobrix
Cobrix le da a tu empresa un checkout seguro donde el cliente puede ver el monto, elegir el metodo disponible y completar el pago desde una experiencia guiada. El sistema organiza la informacion del pago, guarda evidencia y permite que tu equipo haga seguimiento desde el panel.
La capa de IA ayuda a mejorar la operacion alrededor del pago: lectura de informacion, asistencia en validaciones y soporte para procesos de conciliacion segun la configuracion de tu cuenta.
El boton de pago no reemplaza tus cuentas bancarias ni tus metodos actuales. Los organiza en un checkout para que el cliente pague con menos friccion y tu equipo tenga mejor control.
## Cuando usarlo
Usa un boton de pago si tu empresa:
* Cobra por WhatsApp, correo, redes sociales o un sitio web.
* Necesita enviar links de pago a clientes.
* Recibe pagos por varios metodos y quiere ordenarlos en un solo flujo.
* Quiere disminuir errores al compartir datos bancarios manualmente.
* Necesita confirmar pagos con mayor trazabilidad.
## Flujo recomendado
Agrega y activa los metodos que quieres mostrar en checkout. Puedes revisar la guia de [metodos de pago](/guides/getting-started/payment-method).
Puedes usar el checkout como link de pago para compartirlo con clientes o integrarlo dentro de tu flujo comercial.
El cliente abre el checkout, revisa la informacion y paga usando uno de los metodos disponibles.
Desde el panel puedes revisar pagos recibidos, pagos pendientes y casos que requieren validacion o conciliacion.
## Que necesita tu empresa
Antes de activar el boton de pago, prepara:
* Los metodos de pago que quieres aceptar.
* Los datos correctos de cada cuenta o canal de recepcion.
* La politica interna para revisar pagos pendientes.
* La forma en que compartiras el checkout con tus clientes.
## Siguiente paso
Si quieres activar un boton de pago para tu empresa en Venezuela, escribe a [ayuda@cobrix.co](mailto:ayuda@cobrix.co) o entra al [Dashboard](https://app.cobrix.co) para revisar la configuracion disponible en tu cuenta.
## Para LLMs
# Pasarelas de pago en Venezuela con Cobrix
Source: https://docs.cobrix.co/guides/getting-started/payment-gateways-venezuela
Entiende como Cobrix organiza checkout, metodos de pago, validacion con IA y conciliacion para cobrar en Venezuela.
Una pasarela de pago en Venezuela no es solo un formulario para pagar. En la practica, una empresa necesita combinar metodos locales, transferencias, canales internacionales, comprobantes, validacion y conciliacion. Cobrix une esas piezas en un checkout seguro, moderno y asistido por IA para que el cliente pague con menos friccion y tu equipo tenga control operativo.
## Que es una pasarela de pago
Una pasarela de pago es la capa que conecta al cliente con los metodos de pago de tu empresa. En Cobrix, esa capa se entrega como un checkout donde el cliente ve el monto, elige una opcion disponible y completa el proceso con instrucciones claras.
Cobrix no reemplaza tus bancos ni tus cuentas. Los organiza en una experiencia de pago y ayuda a tu equipo a validar, registrar y conciliar los pagos.
## Metodos que puedes organizar con Cobrix
Cobrix permite configurar los canales de pago que tu empresa acepta y mostrarlos de forma ordenada en el checkout.
| Metodo | Como ayuda Cobrix |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Pago Movil | Muestra los datos correctos, permite distribuir pagos entre varias cuentas y ayuda al seguimiento operativo. |
| Transferencia bancaria | Presenta la informacion de la cuenta y mantiene trazabilidad del pago reportado. |
| Zelle | Permite usar correos bancarios redirigidos para apoyar la validacion de pagos recibidos. |
| Binance Pay | Centraliza la opcion dentro del checkout junto con los demas metodos disponibles. |
| Banco de Venezuela | Permite guiar el proceso de solicitud de credenciales y conectar flujos de validacion segun la configuracion de la cuenta. |
## Diferencia entre boton de pago, checkout y conciliacion
* **Boton de pago:** enlace o boton que envias al cliente para abrir el checkout.
* **Checkout:** pantalla segura donde el cliente revisa el monto, elige metodo y sigue las instrucciones de pago.
* **Validacion:** revision de datos, comprobantes o notificaciones para determinar si el pago corresponde.
* **Conciliacion:** cruce entre pagos recibidos y movimientos bancarios para dejar el estado correcto en Cobrix.
## Por que Cobrix es util en Venezuela
El mercado venezolano suele mezclar bancos, Pago Movil, cuentas en bolivares, canales en dolares y confirmaciones por comprobante. Cobrix ayuda a convertir esa operacion en un flujo mas claro:
* El cliente recibe una sola experiencia de pago.
* Tu empresa mantiene metodos activos y datos actualizados.
* Los pagos quedan asociados a clientes, documentos o suscripciones.
* La IA puede apoyar la lectura y validacion operativa segun el flujo configurado.
* El equipo puede revisar pagos pendientes, recibidos, conciliados o con incidencias.
## Funcionalidades clave
Cobrix entrega una pantalla de pago clara, con el monto y las opciones activas de tu empresa. Esto evita enviar datos sueltos por chat y reduce errores de captura.
Puedes activar Pago Movil, Zelle, Binance Pay o transferencia bancaria segun tu operacion. Revisa la guia de [metodos de pago](/guides/getting-started/payment-method).
Si tienes varias cuentas, puedes repartir pagos por porcentaje, limites diarios o asignacion por cliente. Revisa [distribuir pagos entre multiples Pago Movil](/guides/getting-started/distribute-pago-movil).
Cobrix ayuda a registrar evidencia, revisar pagos recibidos y cruzar movimientos bancarios cuando aplica. Tambien puedes importar reportes de bancos como Banesco, BNC, Mercantil o Bancamiga.
Para Banco de Venezuela, Cobrix documenta como solicitar la credencial necesaria para activar flujos de validacion. Revisa [solicitar la API Key del BDV](/guides/banks/bdv-api-key).
## Como elegir el flujo correcto
| Si necesitas | Usa Cobrix para |
| --------------------------- | --------------------------------------------------------- |
| Cobrar por WhatsApp o redes | Enviar un link de checkout al cliente. |
| Cobrar desde un sitio web | Usar el boton de pago para llevar al cliente al checkout. |
| Aceptar varios metodos | Mostrar solo las opciones activas y correctas. |
| Recibir muchos Pago Movil | Distribuir cuentas y revisar limites. |
| Validar Zelle | Redirigir correos bancarios hacia Cobrix. |
| Conciliar bancos | Importar movimientos y cruzar informacion. |
## Requisitos para empezar
Antes de activar una pasarela o boton de pago con Cobrix, define:
* Metodos de pago que aceptara tu empresa.
* Cuentas o canales de recepcion activos.
* Politica interna para pagos pendientes y comprobantes.
* Equipo responsable de revisar incidencias.
* Si usaras links manuales, integracion web o API.
## Siguiente paso
Empieza por configurar tus [metodos de pago](/guides/getting-started/payment-method). Si tu empresa necesita un checkout con boton de pago, IA y conciliacion para Venezuela, escribe a [ayuda@cobrix.co](mailto:ayuda@cobrix.co) o entra al [Dashboard](https://app.cobrix.co).
## Para LLMs
# Anadir o editar un metodo de pago en Cobrix
Source: https://docs.cobrix.co/guides/getting-started/payment-method
Configura Pago Movil, Zelle, Binance Pay o transferencia bancaria para mostrarlos en el checkout.
Configura los metodos de pago que veran tus clientes en el checkout. Puedes activar uno o varios, segun las opciones que quieras aceptar.
## Metodos disponibles
* **Pago Movil:** permite registrar multiples cuentas.
* **Zelle:** usa el correo y titular que recibiran los pagos.
* **Binance Pay:** registra los datos de recepcion solicitados por la plataforma.
* **Transferencia bancaria:** muestra los datos de la cuenta bancaria al cliente.
Abre el menu principal y selecciona **Configuracion**.
En la pantalla de configuracion, entra a la pestana **Metodos de Pago**. Alli veras cada metodo y su estado actual.
Haz clic en el metodo que quieres configurar y completa todos los campos requeridos. Cada metodo puede pedir datos distintos.
Cuando los datos esten completos, haz clic en **Guardar** y activa el interruptor del metodo para que quede disponible en checkout.
## Recomendaciones
* Verifica correos, titulares, telefonos, documentos y datos bancarios antes de activar un metodo.
* Mantén activos solo los metodos disponibles para evitar pagos fallidos o retrasos.
* Si agregas multiples Pago Movil, usa datos consistentes para que el equipo identifique cada cuenta sin confusion.
## Para LLMs
# Validacion de pagos en Venezuela con Cobrix
Source: https://docs.cobrix.co/guides/getting-started/payment-validation-venezuela
Reduce capturas falsas, referencias duplicadas y errores manuales al validar pagos con Cobrix.
Validar pagos en Venezuela requiere mas que recibir una captura por WhatsApp. Un comprobante puede estar editado, repetido, tener una referencia incompleta o corresponder a otro monto. Si el equipo aprueba pagos solo por mensajes, aumenta el riesgo de entregar productos o servicios sin confirmar que el dinero entro.
Cobrix ayuda a ordenar la validacion: centraliza el pago, conserva evidencia, cruza movimientos cuando aplica y permite que tu equipo vea si el pago esta pendiente, recibido, aplicado, fallido o con una incidencia por resolver.
Cobrix no reemplaza tus bancos ni retiene fondos. Ayuda a validar, registrar y conciliar pagos con trazabilidad operativa.
## Riesgos de validar solo con capturas
| Riesgo | Que puede pasar | Como ayuda Cobrix |
| ------------------------ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Captura editada | El cliente muestra un comprobante que no corresponde a un pago real. | El equipo puede contrastar evidencia, referencia, monto y movimientos recibidos. |
| Referencia repetida | Una misma referencia se intenta usar para mas de una orden. | La trazabilidad del pago ayuda a detectar doble uso y revisar el historial. |
| Monto incorrecto | El pago no cubre el saldo o genera remanente. | Cobrix permite comparar el monto recibido contra el saldo abierto. |
| Banco o fecha incorrecta | El pago no aparece donde el equipo espera buscarlo. | La informacion queda organizada por metodo, fecha y cliente. |
| Revision dispersa | Varios empleados aprueban desde chats distintos. | El estado queda centralizado para ventas, soporte y administracion. |
## Flujo recomendado
Usa Cobrix para que el cliente vea el monto correcto, los metodos activos y las instrucciones de pago en un solo lugar.
Registra datos como metodo, referencia, monto, fecha y evidencia disponible. Evita aprobar solo por una imagen aislada.
Importa movimientos bancarios o usa los flujos disponibles para revisar si el pago aparece en el canal correcto.
Confirma que el cliente, monto y documento coincidan antes de cerrar el cobro. Si hay diferencia, deja el caso en revision.
Mantén cada pago como pendiente, recibido, aplicado, fallido o con incidencia para que el equipo no dependa de conversaciones separadas.
## Que datos conviene revisar
* Monto recibido.
* Moneda y tasa usada cuando aplique.
* Referencia o identificador del pago.
* Banco o metodo de origen.
* Fecha y hora aproximada.
* Cliente asociado.
* Orden o documento que se quiere cerrar.
* Evidencia del comprobante, correo o movimiento bancario.
## Validacion por metodo
| Metodo | Control recomendado |
| ---------------------- | ----------------------------------------------------------------------------------------------- |
| Pago Movil | Revisa referencia, monto, telefono o datos disponibles y fecha del pago. |
| Transferencia bancaria | Cruza el movimiento con el banco, monto, titular o referencia disponible. |
| Zelle | Redirige correos bancarios hacia Cobrix para apoyar la validacion de pagos recibidos. |
| Binance Pay | Mantén el metodo centralizado en checkout y revisa la evidencia asociada al pago. |
| Banco de Venezuela | Usa la configuracion disponible para conectar flujos de validacion cuando tu cuenta lo permita. |
## Como detectar doble uso
Un pago puede ser valido y aun asi no debe aprobarse dos veces. Para reducir ese riesgo:
* No aceptes la misma referencia para dos ordenes sin revision.
* Busca pagos previos del mismo cliente antes de aplicar uno nuevo.
* Mantén una sola fuente de estado en Cobrix.
* Define permisos para que no cualquier usuario pueda cerrar incidencias.
* Usa webhooks o reportes para que tu sistema externo no procese el mismo evento dos veces.
## Para equipos de soporte y caja
Cuando un pago no coincide, no lo marques como aprobado de inmediato. Primero revisa:
1. Si el monto cubre el saldo.
2. Si la referencia ya fue usada.
3. Si el banco o metodo coincide.
4. Si la fecha esta dentro del rango esperado.
5. Si el cliente corresponde a la orden.
Si falta informacion, mantén el caso en revision y pide los datos necesarios. Esto protege la operacion y evita que ventas, caja y administracion trabajen con estados distintos.
## Para equipos tecnicos
Si integras Cobrix con tu tienda, ERP o sistema interno, procesa pagos y webhooks de forma idempotente. Un mismo evento puede reenviarse y tu sistema debe reconocer si ya lo aplico.
Revisa:
* [Pagos](/api-reference/categories/payments)
* [Webhooks de pagos](/guides/webhooks/categories/payments)
* [Links de cobro](/api-reference/categories/checkout-links)
* [Idempotencia](/api-guides/idempotency)
## Siguiente paso
Configura tus [metodos de pago](/guides/getting-started/payment-method) y revisa la guia de [pasarelas de pago en Venezuela](/guides/getting-started/payment-gateways-venezuela) para ordenar checkout, validacion y conciliacion en un solo flujo.
## Para LLMs
# Catálogo de webhooks
Source: https://docs.cobrix.co/guides/webhooks/catalog
Todos los eventos salientes organizados por dominio y protocolo
Eventos salientes
Del evento al código que lo procesa.
Explora qué dispara cada webhook, qué JSON recibe tu servidor, cómo verificar su firma y qué respuesta debe devolver. Una sola administración distingue los canales por protocolo para evitar mezclar eventos con nombres parecidos.
18eventos generales
3eventos de documentos públicos
2protocolos de firma
## Empieza por aquí
Crea un endpoint, conserva el cuerpo crudo, verifica la firma y responde correctamente.
Aprende las dos fórmulas HMAC-SHA256 con ejemplos para Node.js, Python y PHP.
Deduplica eventos, responde rápido y diagnostica respuestas `4xx`, `5xx` y timeouts.
Reutiliza las definiciones de cliente, pago, método, conversión y documento.
## Categorías
En el panel, **Webhook general** y **API de documentos** aparecen dentro de Endpoints. El segundo se identifica con `cobrix_invoice_v1` y obtiene su catálogo directamente del backend.
Sesión completada, checkout de documentos y links de cobro enviados.
Confirmación, fallo, aplicación y solicitud de tasa certificada.
Creación, actualización, anulación y pago total.
Avisos antes, durante y después del vencimiento.
Activación, renovación y cancelación.
Evento manual para verificar conectividad, firma y respuesta.
Creación, pago y anulación con el protocolo dedicado.
## Protocolos y seguridad
Los eventos generales y los eventos de documentos públicos usan headers, payloads y fórmulas de firma diferentes. Selecciona el protocolo antes de copiar código.
# Checkout y links
Source: https://docs.cobrix.co/guides/webhooks/categories/checkout
Sesiones completadas y enlaces de cobro generados
Estos eventos describen la interacción con el checkout, no todos confirman dinero.
Usa el tipo del evento para distinguir una sesión enviada, una sesión completada y la aplicación financiera posterior.
## Eventos
| Evento | Qué ocurrió | Acción recomendada |
| ------------------------------------------------ | ---------------------------------------------------------- | --------------------------------------------------------------------- |
| `checkout.session.completed` | El cliente completó el flujo de checkout. | Registra actividad; espera `payment.succeeded` para confirmar dinero. |
| `checkout.collection_document_session.completed` | El pago del checkout fue aplicado a documentos. | Actualiza documentos y correlaciona el pago. |
| `checkout.collection_document_link.sent` | Cobrix creó el link e intentó entregarlo. | Guarda URL, expiración y resultado de email. |
| `collection_document.checkout_link_sent` | El flujo de cobranza preparó un link para entrega externa. | Usa `delivery.metaTemplate` para WhatsApp/Meta. |
`checkout.session.completed` y `payment.succeeded` no son equivalentes. El primero confirma que Cobrix aceptó la evidencia y creó un pago pendiente; el segundo solo llega después de una aprobación financiera real.
## Secuencia financiera
1. Cobrix acepta el comprobante únicamente si el monto OCR certificado coincide exactamente con el monto elegido.
2. Emite `checkout.session.completed` con `status: "pending"`, `appliedAmountMinor: 0` y el intento de verificación en `verification`.
3. Intenta verificar automáticamente el pago. Encontrar una transacción no basta si el receptor, la moneda, la referencia o las reglas antifraude no quedan confirmadas.
4. Cuando el pago se aprueba, emite `payment.succeeded` usando el mismo monto recibido.
5. Si el pago se aplica a documentos, emite `payment.applied_to_collection_document`; solo los documentos cuyo saldo llega a cero generan `collection_document.paid`.
En pagos cross-currency, `amountMinor` usa la moneda del comprobante y `appliedAmountMinor` usa `documentCurrency`. Consulta [Modelos compartidos](/guides/webhooks/data-models#estado-financiero-en-eventos-de-checkout-y-pago).
# Documentos de cobro
Source: https://docs.cobrix.co/guides/webhooks/categories/collection-documents
Ciclo de vida y liquidación de documentos sincronizados
Eventos del documento dentro de la API de integraciones.
Usa `source` + `externalDocumentId` como correlación externa y `invoiceId` como identificador técnico de Cobrix.
## Eventos
| Evento | Estado observado |
| ------------------------------- | ------------------------------------------------------ |
| `collection_document.created` | Se creó un documento externo. |
| `collection_document.updated` | Se actualizó monto, fechas, líneas o estado permitido. |
| `collection_document.cancelled` | El documento fue anulado. |
| `collection_document.paid` | Su saldo llegó a cero mediante una aplicación. |
Este es el canal **Webhook general**. Si integras `POST /api/v1/invoices`, consulta [Documentos públicos](/guides/webhooks/categories/public-documents): su anulación emite `invoice.canceled`, no `collection_document.cancelled`.
El nombre técnico `invoiceId` forma parte del contrato JSON. No lo traduzcas ni lo sustituyas al deserializar.
# Pagos
Source: https://docs.cobrix.co/guides/webhooks/categories/payments
Confirmación, fallo, aplicación y conversión de pagos
La categoría financiera principal.
Los eventos separan la confirmación del pago, su fallo, su aplicación a saldos y los casos donde falta una tasa certificada.
## Eventos
| Evento | Qué ocurrió | Acción recomendada |
| ---------------------------------------- | --------------------------------------------------- | --------------------------------------------------------- |
| `payment.succeeded` | El pago quedó confirmado. | Marca el pago externo como confirmado usando `paymentId`. |
| `payment.failed` | El proveedor o la validación rechazó el pago. | Muestra `reason` y permite otro intento. |
| `payment.applied_to_collection_document` | El pago redujo uno o más saldos. | Actualiza cada documento con el saldo recibido. |
| `payment.requires_certified_rate` | No pudo aplicarse por falta de conversión aprobada. | Envía la tasa mediante la API de integraciones. |
Los objetos `customer`, `payment`, `paymentMethod` y `exchange` están documentados en [Modelos compartidos](/guides/webhooks/data-models).
# Documentos públicos
Source: https://docs.cobrix.co/guides/webhooks/categories/public-documents
Eventos del protocolo dedicado de la API pública
Canal API de documentos · `cobrix_invoice_v1`.
Se administra en la misma vista que los endpoints generales, dentro de una sección identificada por partner y ambiente. Conserva su contrato: payload `{invoice, event}`, firma del cuerpo crudo y HTTP `200` exacto.
| Evento | Qué representa |
| ------------------ | --------------------------------------------------------------------------------------------------- |
| `invoice.created` | Documento y cobro creados correctamente. |
| `invoice.paid` | El documento quedó financieramente pagado, ya sea mediante Cobrix o por confirmación del proveedor. |
| `invoice.canceled` | El documento fue anulado mediante la API pública. |
`invoice.canceled` no es un alias de `collection_document.cancelled`. El primero pertenece a `cobrix_invoice_v1`; el segundo usa el webhook general.
## Ciclo de administración
Cobrix mantiene un endpoint de documentos por cada combinación de partner y ambiente. Usa **Configurar endpoint público** en la parte superior de la sección para elegir un partner disponible y registrar su URL y secreto. Una vez configurado, desde su fila puedes editar la URL, activarlo o desactivarlo y eliminarlo.
Los eventos no se seleccionan manualmente: Cobrix agrega los eventos `invoice.*` compatibles actuales y futuros al contrato. Por eso este endpoint funciona distinto a uno general, aunque ambos se administren juntos.
Eliminar el endpoint detiene las entregas futuras de este contrato y retira su fila de la tabla, pero no elimina el partner, sus llaves API ni los documentos. El partner vuelve a estar disponible en **Configurar endpoint público**. Para volver a recibir eventos debes configurar el endpoint otra vez y guardar un secreto nuevo.
`PAID_FROM_PROVIDER` también emite exactamente un `invoice.paid`. El estado se conserva en el payload para identificar el origen del pago, mientras `invoice.payment.status` se reporta como `APPROVED`.
# Recordatorios
Source: https://docs.cobrix.co/guides/webhooks/categories/reminders
Avisos de cobro antes, durante y después del vencimiento
Payloads listos para automatizaciones de comunicación.
Incluyen cliente, empresa, checkout, documentos, montos y la plantilla Meta recomendada para cada momento del vencimiento.
| Evento | Momento | Campo diferencial |
| ------------------------------------------ | ----------------------- | ---------------------------------------- |
| `collection_document.reminder_before_due` | Antes del vencimiento | `daysUntilDue` |
| `collection_document.reminder_on_due_date` | Día de vencimiento | Fecha más próxima igual al día operativo |
| `collection_document.reminder_after_due` | Después del vencimiento | `daysOverdue` |
`delivery.metaTemplate` contiene la clave, idioma y variables para un despachador externo de WhatsApp. Tu receptor decide si envía el mensaje y debe evitar duplicados.
# Suscripciones
Source: https://docs.cobrix.co/guides/webhooks/categories/subscriptions
Activación, renovación y cancelación de servicios recurrentes
Sincroniza el acceso del cliente con el ciclo recurrente.
Los eventos incluyen cliente, plan, periodo y la operación que provocó la transición.
| Evento | Cuándo se emite | Acción típica |
| ------------------------ | ------------------------------------------------------------- | --------------------------------------------- |
| `subscription.activated` | Se activa o renueva la suscripción. | Habilitar o extender el servicio. |
| `subscription.cancelled` | Se cancela por usuario, administrador, rechazo o vencimiento. | Programar o ejecutar la baja según los flags. |
# Sistema
Source: https://docs.cobrix.co/guides/webhooks/categories/system
Evento de prueba para certificar tu endpoint
Prueba la infraestructura antes de procesar movimientos reales.
`webhook.test` usa el protocolo general completo: envelope, firma con timestamp, timeout y registro de entrega.
Envíalo desde el panel para validar URL, TLS, secreto, cuerpo crudo y respuesta HTTP.
# Entrega, reintentos y deduplicación
Source: https://docs.cobrix.co/guides/webhooks/delivery
Cómo responder rápido y procesar eventos sin duplicar acciones
Cobrix entrega webhooks con semántica **al menos una vez**. Una caída de red puede ocurrir después de que tu servidor procese el evento pero antes de que Cobrix reciba la respuesta; por eso debes aceptar que el mismo evento llegue nuevamente.
## Qué respuesta confirma la entrega
| Protocolo | Éxito | Timeout |
| ------------------- | -------------------- | ----------- |
| General | Cualquier HTTP `2xx` | 30 segundos |
| Documentos públicos | HTTP `200` exacto | 30 segundos |
No necesitas devolver el objeto procesado. Una respuesta pequeña es suficiente:
```http theme={null}
HTTP/1.1 200 OK
Content-Type: application/json
{"received":true}
```
## Patrón recomendado
Si falla, responde `401` y no guardes ni proceses el contenido.
Para eventos generales usa `payload.id`. Si la inserción choca con la restricción única, ya fue recibido.
Conserva el JSON, tipo, fecha de recepción y estado de procesamiento para auditoría.
Publica una tarea interna que procese el evento fuera del request HTTP.
Devuelve `200` antes de llamar APIs lentas, enviar mensajes o ejecutar conciliaciones.
## Reintentos
### Pendientes de envío
En los webhooks generales configurados por empresa, Cobrix guarda el evento antes
de iniciar HTTP. Si no hay un cupo disponible o se prepara un lote de recordatorios,
el resultado puede ser **En cola** (`queued`): Cobrix conserva el evento para
enviarlo, pero todavía no hay confirmación de recepción del destino.
Las respuestas que exponen el despacho incluyen la cantidad `queued` y, por
destino, `eventLogId` y `nextRetryAt` cuando están disponibles. Conserva esa
referencia para consultar su avance; no generes otro evento para reemplazarlo.
Cada destino mantiene su resultado independiente. El correo y el webhook también
son independientes: un correo enviado no confirma el envío de WhatsApp.
### Cómo interpretar cada resultado
| Evidencia | Qué significa | Qué no demuestra |
| ---------------------------------------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `queued` / En cola | Cobrix guardó el evento; aún no confirma recepción del destino | No es omitido ni enviado a WhatsApp |
| `sent` en el resultado del despacho / `delivered` en el log del evento | El receptor respondió con el HTTP de éxito de su protocolo | No confirma que n8n terminara el flujo ni que Meta entregara el mensaje |
| Intento fallido con `nextRetryAt` | Hubo un error y el evento tiene otro intento programado | No es lo mismo que esperar cupo sin haber intentado HTTP |
| Fallido sin próximo reintento | No tiene recuperación automática programada | No debe reenviarse sin revisar el motivo y posibles duplicados |
El estado persistido de un pendiente nuevo puede ser `retry` con `attempts: 0`:
en ese caso aún no se realizó una solicitud HTTP. Consulta también `attempts`,
`lastResponseStatus`, `lastError` y `nextRetryAt`; `retry` por sí solo no distingue
un evento esperando su primer envío de uno que ya tuvo un error.
Si el receptor es n8n, una respuesta HTTP exitosa confirma su aceptación HTTP,
no el resultado completo del flujo. Para afirmar «entregado» o «leído» por
WhatsApp necesitas la confirmación de Meta vinculada al mensaje exacto.
### Capacidad y tiempos
El recuperador revisa eventos elegibles cada cinco segundos, en lotes de hasta 50,
compartiendo los cupos HTTP con los envíos inmediatos. Esperar cupo no consume
intentos. No existe un descarte fijo al llegar a 60 despachos por minuto.
La fecha de elegibilidad no garantiza el instante exacto del envío ni su entrega
por un proveedor final como Meta.
Este comportamiento no cambia el protocolo específico de documentos públicos
ni activa automáticamente eventos históricos que no eran elegibles.
La capacidad se configura en el backend mediante `WEBHOOK_DISPATCH_CONCURRENCY`:
entero de **1 a 50**, predeterminado **10 por proceso**. No es un límite por minuto
ni una opción del panel de empresa. Los procesos no comparten un regulador global.
La cantidad que sale por minuto depende de la latencia y capacidad del receptor.
No hay un tiempo garantizado para completar un lote. El productor de suscripciones
conserva su pausa de correo de 600 ms por destinatario cuando ese canal está
habilitado; el recorrido sólo webhook no la aplica. Las rutas predeterminadas
fuera de este dispatcher conservan su comportamiento. Esta mejora no añade una
separación global de 60 segundos entre mensajes al mismo teléfono.
### Después de un error HTTP
Los eventos generales realizan hasta cinco intentos totales. Después del intento inicial, las ventanas de reintento vigentes son aproximadamente 5 minutos, 30 minutos, 2 horas y 24 horas; el worker se ejecuta periódicamente, por lo que la hora exacta puede desplazarse.
Los eventos de documentos públicos realizan hasta cinco intentos totales: el inicial y reintentos aproximadamente después de 1 minuto, 5 minutos, 30 minutos y 2 horas.
Un reenvío manual puede producir un nuevo intento HTTP. En documentos públicos, deduplica por `X-Cobrix-Event-Id`: Cobrix conserva el mismo valor en todos los intentos del evento.
## Diagnóstico por código HTTP
| Resultado | Qué interpreta Cobrix | Qué revisar |
| ---------------------------------------- | --------------------------------- | ----------------------------------------------------- |
| `200–299` general | Entregado | Nada; conserva el registro |
| `200` documentos públicos | Entregado | Nada; conserva el registro |
| `201`, `202` o `204` documentos públicos | No entregado; se reintentará | Responder `200` exacto después de persistir el evento |
| `400` | Tu receptor rechazó el payload | Parser, campos obligatorios y versión |
| `401/403` | Tu receptor rechazó autenticación | Secreto, cuerpo crudo y fórmula usada |
| `404` | La ruta configurada no existe | URL y despliegue del receptor |
| `409` | El receptor reportó conflicto | Idempotencia o estado interno |
| `429` | El receptor está limitado | Capacidad y política de reintentos |
| `500–599` | El receptor falló | Logs internos correlacionados por evento |
| Timeout | No hubo respuesta antes de 30 s | Responder antes y procesar asíncronamente |
## Qué guardar para soporte
* En eventos generales, `payload.id` y `payload.event`.
* En documentos públicos, `X-Cobrix-Event-Id` y `X-Cobrix-Event-Type`.
* Fecha de recepción y duración.
* Resultado de firma sin guardar el secreto.
* Código y cuerpo de respuesta enviados.
* Estado del trabajo asíncrono y último error interno.
Que Cobrix haya iniciado el despacho no demuestra que el endpoint lo recibió correctamente.
Una respuesta exitosa registrada es evidencia de recepción HTTP, no de entrega al cliente final.
## Activación sin reproducción histórica
El endpoint de documentos comienza a suscribirse cuando se crea activo o cuando pasa de inactivo a activo. La recuperación automática no genera eventos ocurridos antes de ese momento. Cambiar la URL o rotar el secreto mientras el endpoint continúa activo conserva el inicio de la suscripción.
Los eventos que ya estaban pendientes mientras el endpoint estaba activo mantienen sus reintentos.
## Confirmaciones de WhatsApp
Para consultar entrega y lectura informadas por Meta, usa la [API de confirmaciones de WhatsApp](/api-reference/categories/whatsapp). La entrega HTTP de un webhook al integrador y la entrega del mensaje de WhatsApp son evidencias distintas.
# Link de documentos enviado
Source: https://docs.cobrix.co/guides/webhooks/events/checkout-collection-document-link-sent
Cobrix creó un link e intentó entregarlo por email
checkout.collection\_document\_link.sent
## Qué significa
Cobrix creó una sesión para documentos seleccionados y ejecutó el intento de entrega administrado por Cobrix. No significa que el cliente abrió el link ni que pagó.
## Payload completo
```json theme={null}
{
"id": "evt_d1da6843-38a0-42ec-a53c-bba407f43639",
"event": "checkout.collection_document_link.sent",
"created_at": "2026-07-14T15:40:00.000Z",
"api_version": "2025-01-21",
"data": {
"checkoutSessionId": "cs_5e52b98d",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": [],
"status": "active",
"customFieldsData": null,
"type": "individual",
"address": null
},
"checkoutUrl": "https://pay.cobrix.co/c/cs_5e52b98d",
"token": "checkout_public_token",
"expiresAt": "2026-07-15T15:40:00.000Z",
"amountMinor": "2000",
"currency": "USD",
"documents": [
{
"invoiceId": "inv_d64d7b11",
"number": "DOC-1001",
"externalDocumentId": "erp-1001",
"amountMinor": "2000",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"delivery": {
"email": {
"status": "sent",
"recipient": "ana@example.com",
"providerId": "mail_8172"
}
}
}
}
```
## Lee correctamente `delivery.email.status`
| Estado | Significado |
| --------- | ------------------------------------------------------------------------ |
| `sent` | El proveedor aceptó el mensaje para entrega. |
| `failed` | El intento falló; revisa `reason`. |
| `skipped` | No se intentó, normalmente por ausencia de destinatario o configuración. |
El token y la URL son sensibles operacionalmente. No los publiques en logs abiertos ni herramientas de analítica del cliente.
`documents[].metadata` conserva la metadata pública de cada documento incluido en el link. El objeto puede estar vacío y admite propiedades adicionales.
# Checkout de documentos completado
Source: https://docs.cobrix.co/guides/webhooks/events/checkout-collection-document-session-completed
El checkout aplicó el pago a documentos de cobro
checkout.collection\_document\_session.completed
## Qué significa
La sesión de checkout de documentos terminó y el pago fue relacionado con los documentos seleccionados. El arreglo `documents` identifica los saldos involucrados.
## Payload completo
```json theme={null}
{
"id": "evt_4a7f0873-c657-4e04-930d-160af7701262",
"event": "checkout.collection_document_session.completed",
"created_at": "2026-07-14T16:10:00.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_842f7712",
"checkoutSessionId": "cs_5e52b98d",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"documents": [
{
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"externalInvoiceId": "erp-1001",
"source": "erp_acme",
"currency": "USD",
"appliedAmountMinor": "2000",
"remainingBalanceMinor": "0",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"payment": {
"id": "pay_842f7712",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_5e52b98d",
"subscriptionId": null,
"status": "succeeded",
"reconciliationStatus": "reconciled",
"amount": 20,
"amountMinor": 2000,
"currency": "USD",
"referenceAmountMinor": null,
"referenceCurrency": null,
"provider": "checkout",
"providerChargeId": "charge_9001",
"hasPaymentReference": true,
"paymentReference": "PAY-9001",
"paymentReferenceMasked": "****9001",
"hasProof": false,
"paidAt": "2026-07-14T16:10:00.000Z",
"valueDate": null,
"createdAt": "2026-07-14T16:09:00.000Z",
"updatedAt": "2026-07-14T16:10:00.000Z",
"exchange": null
},
"paymentMethod": {
"kind": "card",
"method": "card",
"label": "Tarjeta",
"channel": "automatic",
"provider": "checkout",
"isManual": false,
"requiresReconciliation": false,
"receiver": null,
"receiverCheck": null,
"submitted": null,
"review": {
"requiresReview": false,
"reasons": [],
"ocrVerdict": null,
"ocrConfidence": null
}
}
}
}
```
## Cómo procesarlo
No repitas aplicaciones si el evento vuelve a llegar.
Usa `paymentId` y `checkoutSessionId`.
Lee `appliedAmountMinor` y `remainingBalanceMinor` como strings enteros en `documents[].currency`.
Usa `documents[].metadata` sin asumir un esquema fijo y tolera propiedades nuevas.
Procesa tareas pesadas fuera del request.
Este evento se genera después de aplicar el pago. No sustituye `checkout.session.completed`, que se emite al aceptar la evidencia, ni `payment.succeeded`, que confirma financieramente el pago.
# Checkout completado
Source: https://docs.cobrix.co/guides/webhooks/events/checkout-session-completed
El cliente terminó el flujo de checkout
checkout.session.completed
## Qué significa
El cliente completó la interacción con una sesión de checkout y Cobrix aceptó la evidencia del pago. El evento se emite una sola vez aunque la verificación automática siga en cola, no encuentre la transacción o requiera revisión manual.
No habilites un servicio ni marques dinero como confirmado usando únicamente este evento. Espera `payment.succeeded`, que representa la confirmación financiera.
## Payload completo
```json theme={null}
{
"id": "evt_53a7e421-2ed4-4a57-ae28-51ed39437db2",
"event": "checkout.session.completed",
"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": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": [],
"status": "active",
"customFieldsData": null,
"type": "individual",
"address": null
},
"amount": 12.5,
"amountMinor": 1250,
"amountSource": "ocr",
"documentAmountDue": 25,
"documentAmountDueMinor": 2500,
"documentCurrency": "USD",
"expectedAmount": 12.5,
"expectedAmountMinor": 1250,
"isPartialPayment": false,
"appliedAmount": 0,
"appliedAmountMinor": 0,
"remainingBalance": 25,
"remainingBalanceMinor": 2500,
"verification": {
"status": "queued",
"attemptCount": 0,
"automaticApproval": false,
"provider": null,
"lastOutcome": null
},
"currency": "VES",
"method": "pagoMovil",
"payment": {
"id": "pay_842f7712",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_5e52b98d",
"subscriptionId": null,
"status": "pending",
"reconciliationStatus": "unmatched",
"amount": 12.5,
"amountMinor": 1250,
"currency": "VES",
"referenceAmountMinor": 2500,
"referenceCurrency": "USD",
"provider": null,
"providerChargeId": null,
"hasPaymentReference": true,
"paymentReference": "000123456",
"paymentReferenceMasked": "*****3456",
"hasProof": true,
"paidAt": null,
"valueDate": "2026-07-14T00:00:00.000Z",
"createdAt": "2026-07-14T15:59:40.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": true,
"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": "2500",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"paymentReference": "000123456",
"status": "pending",
"subscriptionId": null,
"paidAt": null,
"exchange": {
"targetCurrency": "USD",
"rate": 0.5,
"rateDate": "2026-07-18T02:14:48.521Z",
"rateSource": "manual",
"convertedAmount": 25,
"convertedAmountMinor": 2500
},
"reconciledAt": null,
"requiresReview": false,
"reviewReasons": []
}
}
```
## Campos que debes usar
| Campo | Uso recomendado |
| ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `data.checkoutSessionId` | Correlacionar la sesión mostrada al cliente. |
| `data.paymentId` | Vincular eventos posteriores del mismo pago. |
| `data.customer` | Identificar al cliente dentro de la empresa. |
| `data.payment.status` | Mostrar el estado persistido, no decidir confirmación final. |
| `data.amountMinor`, `data.currency` | Registrar el dinero detectado en el comprobante. Cuando `amountSource` es `ocr`, estos campos nunca representan el total de la deuda como fallback. |
| `data.expectedAmountMinor` | Auditar el monto que el cliente eligió y que el OCR debía confirmar exactamente. |
| `data.documentAmountDueMinor`, `data.documentCurrency` | Conservar la deuda congelada al enviar el checkout, en la moneda del documento. |
| `data.appliedAmountMinor`, `data.remainingBalanceMinor` | Mostrar `0` aplicado y el saldo intacto mientras el pago siga pendiente. Ambos están en `documentCurrency`. |
| `data.verification` | Observar si el intento está en cola, fue ejecutado o requiere revisión; no equivale por sí solo a confirmación financiera. |
| `data.documents[].metadata` | Recuperar la metadata pública almacenada en cada documento relacionado. |
| `data.paymentMethod.review` | Detectar si el comprobante requiere revisión. |
Consulta todos los campos en [Modelos compartidos](/guides/webhooks/data-models).
## Respuesta
Después de verificar y guardar el evento, devuelve cualquier `2xx`, preferiblemente `200`.
# Documento anulado
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-cancelled
Se anuló un documento externo
collection\_document.cancelled
## Qué significa
Cobrix aceptó la anulación del documento. No implica que se haya revertido un pago; las anulaciones incompatibles con aplicaciones financieras son rechazadas antes de emitir este evento.
## Payload completo
```json theme={null}
{
"id": "evt_52bed55a-2cf3-4457-ad90-da077337ba92",
"event": "collection_document.cancelled",
"created_at": "2026-07-14T14:30:00.000Z",
"api_version": "2025-01-21",
"data": {
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"customerExternalId": "customer-1001",
"document": {
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"status": "cancelled",
"currency": "USD",
"totalMinor": 2000,
"balanceMinor": 0,
"issueDate": "2026-07-01",
"dueDate": "2026-07-15",
"cutDate": "2026-07-20",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
},
"lines": [
{
"description": "Servicio mensual",
"quantity": 1,
"unitAmountMinor": 2000,
"amountMinor": 2000,
"periodStart": "2026-07-01",
"periodEnd": "2026-07-31"
}
]
},
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"customerId": "cus_e3cd39b1",
"externalCustomerId": "customer-1001",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"status": "cancelled",
"cancelledAt": "2026-07-14T14:30:00.000Z"
}
}
```
## Acción recomendada
Marca el documento externo como anulado y deshabilita acciones de cobro pendientes. Si tu sistema ya lo tenía anulado, responde `200` sin repetir efectos. `document.metadata` conserva el contexto público del documento aun después de la anulación.
# Link para cobranza automatizada
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-checkout-link-sent
El flujo de cobranza preparó un link para entrega externa
collection\_document.checkout\_link\_sent
## Qué significa
Cobrix preparó un link y un contrato de entrega para que un sistema externo, por ejemplo un workflow de Meta WhatsApp, envíe el mensaje de cobranza automatizada. Dentro de `data`, `delivery.metaTemplate` indica la plantilla y variables.
## Payload completo
```json theme={null}
{
"id": "evt_0a1d994e-f82c-420c-ab8d-a2fe9c23e69e",
"event": "collection_document.checkout_link_sent",
"created_at": "2026-07-14T15:45:00.000Z",
"api_version": "2025-01-21",
"data": {
"event": "collection_document.checkout_link_sent",
"version": "2026-05-18",
"timestamp": "2026-07-14T15:45:00.000Z",
"trigger": "manual",
"subjectType": "collection_document",
"customer": {
"id": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"company": {
"id": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"name": "Empresa de ejemplo",
"supportPhone": "+584120001111"
},
"checkout": {
"sessionId": "cs_5e52b98d",
"token": "checkout_public_token",
"url": "https://pay.cobrix.co/c/cs_5e52b98d",
"expiresAt": "2026-07-15T15:45:00.000Z"
},
"amount": {
"minor": "2000",
"major": "20.00",
"currency": "USD"
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"number": "DOC-1001",
"externalDocumentId": "erp-1001",
"issuedAt": "2026-07-01",
"dueDate": "2026-07-15",
"amountMinor": "2000",
"amountMajor": "20.00",
"balanceMinor": "2000",
"currency": "USD",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"dunningDetails": {
"reminderType": "MANUAL_SEND",
"documentCount": 1,
"nearestDueDate": "2026-07-15"
},
"references": {
"checkoutType": "collection_documents",
"source": "erp_acme",
"idempotencyKey": "send-doc-1001-20260714"
},
"delivery": {
"requestedChannels": ["email", "whatsapp"],
"email": {
"provider": "cobrix",
"status": "sent",
"recipient": "ana@example.com",
"providerId": "mail_8172"
},
"whatsapp": {
"provider": "meta",
"recipient": "+584120000000",
"metaTemplate": {
"key": "collection_document_checkout_link_v2",
"name": "collection_document_checkout_link_v2",
"language": "es",
"version": "v2",
"variables": {
"customer_name": "Ana Pérez",
"amount": "20.00",
"currency": "USD",
"checkout_url": "https://pay.cobrix.co/c/cs_5e52b98d"
}
}
}
}
}
}
```
## Qué debe hacer tu workflow
1. Deduplicar por `data.references.idempotencyKey` y `payload.id`.
2. Validar que `delivery.requestedChannels` incluya `whatsapp`.
3. Mapear `metaTemplate.name`, `language` y `variables` a la API de Meta.
4. Registrar el identificador devuelto por Meta.
5. Responder `200` sin esperar confirmaciones posteriores de entrega.
`documents[].metadata` contiene la metadata pública enriquecida desde el documento almacenado. No la uses como clave idempotente y acepta propiedades nuevas.
# Documento creado
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-created
Se creó un documento externo en Cobrix
collection\_document.created
## Qué significa
Una integración pública ejecutó el upsert y creó un documento nuevo. El evento conserva la correlación `source`, `externalDocumentId` y `customerExternalId`.
## Payload completo
```json theme={null}
{
"id": "evt_979bba4d-927a-4416-a172-71b328841a06",
"event": "collection_document.created",
"created_at": "2026-07-14T14:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"customerExternalId": "customer-1001",
"document": {
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"status": "open",
"currency": "USD",
"totalMinor": 2000,
"balanceMinor": 2000,
"issueDate": "2026-07-01",
"dueDate": "2026-07-15",
"cutDate": "2026-07-20",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
},
"lines": [
{
"description": "Servicio mensual",
"quantity": 1,
"unitAmountMinor": 2000,
"amountMinor": 2000,
"periodStart": "2026-07-01",
"periodEnd": "2026-07-31"
}
]
},
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"customerId": "cus_e3cd39b1",
"externalCustomerId": "customer-1001",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"status": "open",
"createdAt": "2026-07-14T14:00:00.000Z"
}
}
```
## Qué guardar
Guarda `document.invoiceId` como identificador técnico y conserva `source` + `externalDocumentId` como clave del sistema externo. Los montos `totalMinor` y `balanceMinor` están en unidades menores. `document.metadata` contiene la metadata pública normalizada; recibe `{}` cuando no hay valores públicos.
# Documento pagado
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-paid
El saldo del documento llegó a cero
collection\_document.paid
## Qué significa
Una aplicación de pago dejó el documento sin saldo. El payload incluye el documento compacto y el pago que produjo la transición.
## Payload completo
```json theme={null}
{
"id": "evt_86b62951-f4da-4880-a744-59d60fd2785c",
"event": "collection_document.paid",
"created_at": "2026-07-14T16:10:02.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_842f7712",
"checkoutSessionId": "cs_5e52b98d",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"document": {
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"externalInvoiceId": "erp-1001",
"source": "erp_acme",
"currency": "USD",
"appliedAmountMinor": "2000",
"remainingBalanceMinor": "0",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
},
"payment": {
"id": "pay_842f7712",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_5e52b98d",
"subscriptionId": null,
"status": "succeeded",
"reconciliationStatus": "reconciled",
"amount": 20,
"amountMinor": 2000,
"currency": "USD",
"referenceAmountMinor": null,
"referenceCurrency": null,
"provider": "checkout",
"providerChargeId": "charge_9001",
"hasPaymentReference": true,
"paymentReference": "PAY-9001",
"paymentReferenceMasked": "****9001",
"hasProof": false,
"paidAt": "2026-07-14T16:10:00.000Z",
"valueDate": null,
"createdAt": "2026-07-14T16:09:00.000Z",
"updatedAt": "2026-07-14T16:10:00.000Z",
"exchange": null
},
"paymentMethod": {
"kind": "card",
"method": "card",
"label": "Tarjeta",
"channel": "automatic",
"provider": "checkout",
"isManual": false,
"requiresReconciliation": false,
"receiver": null,
"receiverCheck": null,
"submitted": null,
"review": {
"requiresReview": false,
"reasons": [],
"ocrVerdict": null,
"ocrConfidence": null
}
}
}
}
```
Si varios documentos se pagaron con una sesión, recibirás un evento de documento pagado por cada documento que llegó a saldo cero.
`document.metadata` contiene la metadata pública persistida en ese documento. Cobrix envía `{}` cuando no hay valores públicos. Este evento no se emite para un pago parcial que deje `remainingBalanceMinor` por encima de `"0"`.
# Recordatorio posterior al vencimiento
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-reminder-after-due
Recordatorio posterior al vencimiento
collection\_document.reminder\_after\_due
## Qué significa
El documento continúa con saldo después de su vencimiento. El campo `daysOverdue` ya fue calculado con la fecha operativa de la empresa.
## Payload completo
```json theme={null}
{
"id": "evt_4a7fea72-0358-4cc2-9d5c-b5afd91a3203",
"event": "collection_document.reminder_after_due",
"created_at": "2026-07-18T13:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"event": "collection_document.reminder_after_due",
"version": "2026-05-18",
"timestamp": "2026-07-18T13:00:00.000Z",
"trigger": "automatic",
"subjectType": "collection_document",
"customer": {
"id": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"company": {
"id": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"name": "Empresa de ejemplo",
"supportPhone": "+584120001111"
},
"checkout": {
"sessionId": "cs_06d9691c",
"token": "checkout_public_token_overdue",
"url": "https://pay.cobrix.co/c/cs_06d9691c",
"expiresAt": "2026-07-19T13:00:00.000Z"
},
"amount": {
"minor": "2000",
"major": "20.00",
"currency": "USD"
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"number": "DOC-1001",
"externalDocumentId": "erp-1001",
"issuedAt": "2026-07-01",
"dueDate": "2026-07-15",
"amountMinor": "2000",
"amountMajor": "20.00",
"balanceMinor": "2000",
"currency": "USD",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"dunningDetails": {
"reminderType": "AFTER_DUE",
"documentCount": 1,
"nearestDueDate": "2026-07-15",
"daysOverdue": 3
},
"references": {
"checkoutType": "collection_documents",
"source": "erp_acme",
"idempotencyKey": "reminder-after-erp-1001-20260718"
},
"delivery": {
"requestedChannels": ["whatsapp"],
"whatsapp": {
"provider": "meta",
"recipient": "+584120000000",
"metaTemplate": {
"key": "collection_document_reminder_after_due_v2",
"name": "collection_document_reminder_after_due_v2",
"language": "es",
"version": "v2",
"variables": {
"customer_name": "Ana Pérez",
"amount": "20.00",
"currency": "USD",
"days_overdue": 3,
"checkout_url": "https://pay.cobrix.co/c/cs_06d9691c"
}
}
}
}
}
}
```
Este evento solicita una comunicación; no autoriza suspender automáticamente el servicio. La suspensión debe obedecer las reglas operativas y contractuales de tu empresa.
`documents[].metadata` conserva la metadata pública del documento vencido y puede incluir propiedades adicionales definidas por la integración de origen.
# Recordatorio antes del vencimiento
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-reminder-before-due
Recordatorio antes del vencimiento
collection\_document.reminder\_before\_due
## Qué significa
El programador de cobranza generó un recordatorio antes de la fecha de vencimiento. El receptor externo puede usar la plantilla incluida para entregar WhatsApp.
## Payload completo
```json theme={null}
{
"id": "evt_c388ae9d-a84b-4cf7-a674-dbb6c2938a16",
"event": "collection_document.reminder_before_due",
"created_at": "2026-07-12T13:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"event": "collection_document.reminder_before_due",
"version": "2026-05-18",
"timestamp": "2026-07-12T13:00:00.000Z",
"trigger": "automatic",
"subjectType": "collection_document",
"customer": {
"id": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"company": {
"id": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"name": "Empresa de ejemplo",
"supportPhone": "+584120001111"
},
"checkout": {
"sessionId": "cs_5e52b98d",
"token": "checkout_public_token",
"url": "https://pay.cobrix.co/c/cs_5e52b98d",
"expiresAt": "2026-07-15T13:00:00.000Z"
},
"amount": {
"minor": "2000",
"major": "20.00",
"currency": "USD"
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"number": "DOC-1001",
"externalDocumentId": "erp-1001",
"issuedAt": "2026-07-01",
"dueDate": "2026-07-15",
"amountMinor": "2000",
"amountMajor": "20.00",
"balanceMinor": "2000",
"currency": "USD",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"dunningDetails": {
"reminderType": "BEFORE_DUE",
"documentCount": 1,
"nearestDueDate": "2026-07-15",
"daysUntilDue": 3
},
"references": {
"checkoutType": "collection_documents",
"source": "erp_acme",
"idempotencyKey": "reminder-before-erp-1001-20260712"
},
"delivery": {
"requestedChannels": ["whatsapp"],
"whatsapp": {
"provider": "meta",
"recipient": "+584120000000",
"metaTemplate": {
"key": "collection_document_reminder_before_due_v2",
"name": "collection_document_reminder_before_due_v2",
"language": "es",
"version": "v2",
"variables": {
"customer_name": "Ana Pérez",
"amount": "20.00",
"currency": "USD",
"due_date": "2026-07-15",
"checkout_url": "https://pay.cobrix.co/c/cs_5e52b98d"
}
}
}
}
}
}
```
## Campo clave
`documents[].metadata` conserva el contexto público del documento usado para construir el recordatorio. Acepta `{}` y propiedades nuevas.
`data.dunningDetails.daysUntilDue` expresa cuántos días faltan. No lo recalcules usando la zona horaria del servidor receptor.
# Recordatorio del vencimiento
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-reminder-on-due-date
Recordatorio del día de vencimiento
collection\_document.reminder\_on\_due\_date
## Qué significa
El documento vence en la fecha operativa de la empresa. El link incluido cobra el saldo vigente al momento de crear la sesión.
## Payload completo
```json theme={null}
{
"id": "evt_5e1a56df-4264-4918-8f0a-0c94f355034b",
"event": "collection_document.reminder_on_due_date",
"created_at": "2026-07-15T13:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"event": "collection_document.reminder_on_due_date",
"version": "2026-05-18",
"timestamp": "2026-07-15T13:00:00.000Z",
"trigger": "automatic",
"subjectType": "collection_document",
"customer": {
"id": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"company": {
"id": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"name": "Empresa de ejemplo",
"supportPhone": "+584120001111"
},
"checkout": {
"sessionId": "cs_aed1194d",
"token": "checkout_public_token_due",
"url": "https://pay.cobrix.co/c/cs_aed1194d",
"expiresAt": "2026-07-16T13:00:00.000Z"
},
"amount": {
"minor": "2000",
"major": "20.00",
"currency": "USD"
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"number": "DOC-1001",
"externalDocumentId": "erp-1001",
"issuedAt": "2026-07-01",
"dueDate": "2026-07-15",
"amountMinor": "2000",
"amountMajor": "20.00",
"balanceMinor": "2000",
"currency": "USD",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"dunningDetails": {
"reminderType": "ON_DUE_DATE",
"documentCount": 1,
"nearestDueDate": "2026-07-15"
},
"references": {
"checkoutType": "collection_documents",
"source": "erp_acme",
"idempotencyKey": "reminder-due-erp-1001-20260715"
},
"delivery": {
"requestedChannels": ["whatsapp"],
"whatsapp": {
"provider": "meta",
"recipient": "+584120000000",
"metaTemplate": {
"key": "collection_document_reminder_on_due_date_v2",
"name": "collection_document_reminder_on_due_date_v2",
"language": "es",
"version": "v2",
"variables": {
"customer_name": "Ana Pérez",
"amount": "20.00",
"currency": "USD",
"due_date": "2026-07-15",
"checkout_url": "https://pay.cobrix.co/c/cs_aed1194d"
}
}
}
}
}
}
```
Deduplica usando `data.references.idempotencyKey`. La fecha de vencimiento es una fecha calendario; evita convertirla a UTC para decidir si el aviso corresponde al día actual.
`documents[].metadata` conserva la metadata pública del documento al momento de preparar el recordatorio.
# Documento actualizado
Source: https://docs.cobrix.co/guides/webhooks/events/collection-document-updated
Se actualizó un documento externo
collection\_document.updated
## Qué significa
El upsert encontró el documento existente y aplicó cambios permitidos. El payload contiene la proyección completa posterior a la actualización, no solo los campos modificados.
## Payload completo
```json theme={null}
{
"id": "evt_149b301b-e41d-48a8-88db-f8cfb7bca1c7",
"event": "collection_document.updated",
"created_at": "2026-07-14T14:20:00.000Z",
"api_version": "2025-01-21",
"data": {
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"customerExternalId": "customer-1001",
"document": {
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"source": "erp_acme",
"externalDocumentId": "erp-1001",
"status": "open",
"currency": "USD",
"totalMinor": 2500,
"balanceMinor": 2500,
"issueDate": "2026-07-01",
"dueDate": "2026-07-18",
"cutDate": "2026-07-23",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 300 Mbps"
},
"lines": [
{
"description": "Servicio mensual actualizado",
"quantity": 1,
"unitAmountMinor": 2500,
"amountMinor": 2500,
"periodStart": "2026-07-01",
"periodEnd": "2026-07-31"
}
]
},
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"customerId": "cus_e3cd39b1",
"externalCustomerId": "customer-1001",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"customerCode": "C-1001"
},
"status": "open",
"updatedAt": "2026-07-14T14:20:00.000Z"
}
}
```
## Cómo procesarlo
Reemplaza tu proyección por los valores de `data.document`, incluida `document.metadata`. No calcules diferencias a partir del evento anterior: un evento puede llegar después de un reintento o reenvío manual. Trata la metadata como un objeto abierto y tolera propiedades nuevas.
# Documento público anulado
Source: https://docs.cobrix.co/guides/webhooks/events/invoice-canceled
El documento público fue anulado
invoice.canceled
## Qué significa
La API pública anuló el documento y detuvo los cobros pendientes compatibles. Ocurre cuando `DELETE /api/v1/invoices/{invoiceId}` se procesa sin `reason` o con `reason: "DELETE_FROM_PROVIDER"`.
El endpoint responde HTTP `204` sin cuerpo. El webhook se entrega de forma asíncrona y contiene la última proyección del cobro: `invoice.status` queda en `DELETE_FROM_PROVIDER` y `invoice.payment.status` queda en `canceled`.
El siguiente ejemplo fue validado en sandbox y sus identificadores, datos de cliente, teléfono y token fueron sanitizados para su publicación.
## Payload completo
```json theme={null}
{
"invoice": {
"id": "e1be8db1-b1af-4496-8647-a4144601dcaa",
"name": "Plan mensual de internet - CU000002",
"amount": 20,
"provider": "api-test-muestra",
"provider_id": "CON-EXAMPLE-002",
"reference": "DOC-EXT-002",
"status": "DELETE_FROM_PROVIDER",
"remarks": null,
"metadata": {
"id_empresa": "sandbox-example",
"id_contrato": "CON-EXAMPLE-002"
},
"due_date": null,
"created_at": "2026-07-18T15:56:46.704000Z",
"updated_at": "2026-07-18T16:00:48.600000Z",
"payment_id": "5bcc3e83-620e-4503-abea-563b4fee1cbb",
"is_test": true,
"payment": {
"id": "5bcc3e83-620e-4503-abea-563b4fee1cbb",
"source": "Plan mensual de internet - CU000002",
"currency": "USD",
"amount": 20,
"amount_label": "$ 20",
"title": "Plan mensual de internet - CU000002",
"description": "Plan mensual de internet - CU000002",
"phone": "+584120000000",
"expiration_at": null,
"due_date": null,
"document_link": null,
"external_id": "CON-EXAMPLE-002",
"allows": {
"accounts": true,
"cards": true,
"card_extra": false,
"realtime": false
},
"status": "canceled",
"is_test": true,
"created_at": "2026-07-18T15:56:47.434000Z",
"paid_at": null,
"payment_link": "https://sandbox.cobrix.co/checkout/collection-documents/cdoc_example_cancelled",
"redirect_url": null,
"provider_id": null,
"metadata": null,
"customer": null,
"method": null,
"splits": [],
"company": null,
"commission": null
}
},
"event": {
"type": "invoice.canceled",
"timestamp": 1784747521,
"environment": "test",
"company_id": "7d355d52-ac74-49f5-b31c-ce29b4680752"
}
}
```
## Correlación e idempotencia
Usa `event.type` + `invoice.id` como clave de deduplicación. Repetir el mismo `DELETE` sobre un documento ya anulado devuelve HTTP `204` y no crea un segundo evento de ciclo de vida. Aun así, la entrega es al menos una vez: Cobrix puede reenviar el mismo evento si no recibe la confirmación esperada.
## Respuesta
Verifica `x-cobrix-signature`, guarda el evento y devuelve HTTP `200` exacto. Un `202` o `204` provoca reintento en este protocolo.
# Documento público creado
Source: https://docs.cobrix.co/guides/webhooks/events/invoice-created
Documento público y cobro creados
invoice.created
## Protocolo
Este evento no usa el envelope general. El header es `x-cobrix-signature`, la firma cubre únicamente el cuerpo crudo y la confirmación exige HTTP `200`.
## Payload completo
```json theme={null}
{
"invoice": {
"id": "1c981ecd-9a91-407c-944c-b3e7953e6185",
"name": "Plan mensual de internet",
"amount": 20,
"provider": "erp_acme",
"provider_id": "1001",
"reference": "DOC-EXT-1001",
"status": "CREATED",
"remarks": null,
"metadata": {},
"due_date": "2026-08-15T00:00:00.000000Z",
"created_at": "2026-07-14T16:00:00.000000Z",
"updated_at": "2026-07-14T16:00:00.000000Z",
"payment_id": "e849e271-34fb-4d16-a07e-fecbf97b2b4e",
"is_test": true
},
"event": {
"type": "invoice.created",
"timestamp": 1784044800,
"environment": "test",
"company_id": "7d355d52-ac74-49f5-b31c-ce29b4680752"
}
}
```
## Particularidad
`invoice.created` no incluye el objeto `invoice.payment`. Conserva `payment_id` para correlacionar eventos posteriores. `reference` mantiene exactamente la cédula o RIF recibida y `provider_id` identifica el documento.
# Documento público pagado
Source: https://docs.cobrix.co/guides/webhooks/events/invoice-paid
El documento público quedó financieramente pagado
invoice.paid
## Qué significa
El documento quedó completamente pagado y su saldo pendiente llegó a cero. Cobrix produce exactamente un `invoice.paid` tanto cuando el pago termina en Cobrix como cuando el proveedor confirma un pago mediante `PAID_FROM_PROVIDER`.
Cuando el pago se originó en Cobrix, `invoice.status` puede ser `PAID` y luego avanzar a `CONCILIATED`. Cuando fue confirmado por el proveedor, permanece como `PAID_FROM_PROVIDER` para conservar el origen de la operación.
## Payload completo
```json theme={null}
{
"invoice": {
"id": "1c981ecd-9a91-407c-944c-b3e7953e6185",
"name": "Plan mensual de internet",
"amount": 20,
"provider": "erp_acme",
"provider_id": "1001",
"reference": "DOC-EXT-1001",
"status": "PAID_FROM_PROVIDER",
"remarks": null,
"metadata": {},
"due_date": "2026-08-15T00:00:00.000000Z",
"created_at": "2026-07-14T16:00:00.000000Z",
"updated_at": "2026-07-14T16:10:00.000000Z",
"payment_id": "e849e271-34fb-4d16-a07e-fecbf97b2b4e",
"is_test": true,
"payment": {
"id": "e849e271-34fb-4d16-a07e-fecbf97b2b4e",
"source": "Plan mensual de internet",
"currency": "USD",
"amount": 20,
"amount_label": "$ 20",
"title": "Plan mensual de internet",
"description": "Plan mensual de internet",
"phone": "+584120000000",
"expiration_at": null,
"due_date": "2026-08-15T00:00:00.000000Z",
"document_link": null,
"external_id": "1001",
"allows": {
"accounts": true,
"cards": true,
"card_extra": false,
"realtime": false
},
"status": "APPROVED",
"is_test": true,
"created_at": "2026-07-14T16:00:00.000000Z",
"paid_at": "2026-07-14T16:10:00.000000Z",
"payment_link": "https://pay.cobrix.co/c/e849e271",
"redirect_url": null,
"provider_id": "provider-payment-5001",
"metadata": null,
"customer": null,
"method": null,
"splits": [],
"company": null,
"commission": null
}
},
"event": {
"type": "invoice.paid",
"timestamp": 1784045400,
"environment": "test",
"company_id": "7d355d52-ac74-49f5-b31c-ce29b4680752"
}
}
```
## Procesamiento seguro
Deduplica por `X-Cobrix-Event-Id`: el valor se conserva durante todos los reintentos y reenvíos del mismo evento. Como defensa adicional, guarda también `event.type` e `invoice.id`.
Antes de aplicar una acción irreversible, confirma:
* `invoice.status` es `PAID`, `CONCILIATED` o `PAID_FROM_PROVIDER`.
* `payment.status` es `APPROVED`.
* `payment.paid_at` contiene la fecha real del pago aplicado.
* Para `PAID_FROM_PROVIDER`, `payment.provider_id` coincide con el identificador público enviado al confirmar el pago.
Cobrix crea el evento después de persistir el pago, su aplicación financiera y el saldo cero. La respuesta de la operación pública no espera a que tu receptor acepte el webhook.
# Pago aplicado a documentos
Source: https://docs.cobrix.co/guides/webhooks/events/payment-applied-to-collection-document
El pago redujo saldos de documentos de cobro
payment.applied\_to\_collection\_document
## Qué significa
Cobrix aplicó un pago confirmado a uno o varios documentos. Este evento explica la distribución; `payment.succeeded` explica la confirmación del pago.
## Payload completo
```json theme={null}
{
"id": "evt_fd29354d-5357-4ecf-a79f-984baf3bc868",
"event": "payment.applied_to_collection_document",
"created_at": "2026-07-14T16:10:01.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_842f7712",
"checkoutSessionId": "cs_5e52b98d",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"appliedAmountByCurrency": {
"USD": "2000"
},
"documents": [
{
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"externalInvoiceId": "erp-1001",
"source": "erp_acme",
"currency": "USD",
"appliedAmountMinor": "2000",
"remainingBalanceMinor": "0",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"payment": {
"id": "pay_842f7712",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_5e52b98d",
"subscriptionId": null,
"status": "succeeded",
"reconciliationStatus": "reconciled",
"amount": 20,
"amountMinor": 2000,
"currency": "USD",
"referenceAmountMinor": null,
"referenceCurrency": null,
"provider": "checkout",
"providerChargeId": "charge_9001",
"hasPaymentReference": true,
"paymentReference": "PAY-9001",
"paymentReferenceMasked": "****9001",
"hasProof": false,
"paidAt": "2026-07-14T16:10:00.000Z",
"valueDate": null,
"createdAt": "2026-07-14T16:09:00.000Z",
"updatedAt": "2026-07-14T16:10:00.000Z",
"exchange": null
},
"paymentMethod": {
"kind": "card",
"method": "card",
"label": "Tarjeta",
"channel": "automatic",
"provider": "checkout",
"isManual": false,
"requiresReconciliation": false,
"receiver": null,
"receiverCheck": null,
"submitted": null,
"review": {
"requiresReview": false,
"reasons": [],
"ocrVerdict": null,
"ocrConfidence": null
}
}
}
}
```
## Regla monetaria
Todos los valores `*Minor` son enteros en unidades menores aunque algunos se serialicen como string. Para USD, `"2000"` representa USD 20,00. No uses números de punto flotante para reconstruir saldos.
`appliedAmountByCurrency`, `documents[].appliedAmountMinor` y `documents[].remainingBalanceMinor` están expresados en la moneda de cada documento. El objeto `payment` conserva por separado el monto y la moneda realmente recibidos.
## Metadata del documento
`documents[].metadata` contiene la metadata pública persistida en el documento de cobro. El campo siempre es un objeto; si el documento no tiene metadata pública, Cobrix envía `{}`. Tu integración debe aceptar propiedades nuevas dentro de este objeto.
# Pago fallido
Source: https://docs.cobrix.co/guides/webhooks/events/payment-failed
El pago fue rechazado o falló
payment.failed
## Qué significa
El proveedor, el banco o el flujo de validación no pudo confirmar el pago. El campo `reason` contiene la explicación operativa y `failedAt` indica cuándo se produjo el fallo.
## Payload completo
```json theme={null}
{
"id": "evt_e2dfd047-d75d-453a-aeed-924f13b10e25",
"event": "payment.failed",
"created_at": "2026-07-14T16:05:00.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_bf42a90e",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"checkoutSessionId": "cs_45c2c66f",
"companyCustomerId": "cc_8aa37fd1",
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": [],
"status": "active",
"customFieldsData": null,
"type": "individual",
"address": null
},
"amount": 20,
"amountMinor": 2000,
"currency": "USD",
"method": "debito_inmediato",
"payment": {
"id": "pay_bf42a90e",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"checkoutSessionId": "cs_45c2c66f",
"subscriptionId": null,
"status": "failed",
"reconciliationStatus": "failed",
"amount": 20,
"amountMinor": 2000,
"currency": "USD",
"referenceAmountMinor": null,
"referenceCurrency": null,
"provider": "bank",
"providerChargeId": "bank_tx_102",
"hasPaymentReference": false,
"paymentReference": null,
"paymentReferenceMasked": null,
"hasProof": false,
"paidAt": null,
"valueDate": null,
"createdAt": "2026-07-14T16:04:30.000Z",
"updatedAt": "2026-07-14T16:05:00.000Z",
"exchange": null
},
"paymentMethod": {
"kind": "debito_inmediato",
"method": "debitoInmediato",
"label": "Débito inmediato",
"channel": "automatic",
"provider": "bank",
"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": "2000",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"paymentReference": null,
"status": "failed",
"subscriptionId": null,
"reason": "Pago rechazado por el banco",
"exchange": null,
"failedAt": "2026-07-14T16:05:00.000Z"
}
}
```
## Qué hacer
* Mostrar `reason` al operador o cliente sin revelar información sensible.
* Mantener el intento fallido para auditoría.
* Permitir un nuevo intento con un identificador nuevo.
* No marcar el documento como pagado ni modificar saldos.
`documents[].metadata` permite correlacionar el intento fallido con el contexto público del documento sin alterar su saldo.
# Pago pendiente de tasa certificada
Source: https://docs.cobrix.co/guides/webhooks/events/payment-requires-certified-rate
El pago espera una tasa aprobada para ser aplicado
payment.requires\_certified\_rate
## Qué significa
El pago y los documentos usan monedas diferentes y Cobrix no encontró una tasa certificada válida. El pago existe, pero la aplicación financiera queda pendiente.
## Payload completo
```json theme={null}
{
"id": "evt_63d1a772-0ae8-4b47-aa2c-da08762d1cb3",
"event": "payment.requires_certified_rate",
"created_at": "2026-07-14T16:20:00.000Z",
"api_version": "2025-01-21",
"data": {
"paymentId": "pay_ef30ed18",
"checkoutSessionId": "cs_a089d714",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"companyCustomerId": "cc_8aa37fd1",
"paymentCurrency": "VES",
"applicationCurrency": "USD",
"invoiceIds": ["inv_d64d7b11"],
"documents": [
{
"invoiceId": "inv_d64d7b11",
"invoiceNumber": "DOC-1001",
"externalInvoiceId": "erp-1001",
"source": "erp_acme",
"currency": "USD",
"remainingBalanceMinor": "2000",
"metadata": {
"serviceId": "svc-1001",
"plan": "Internet 200 Mbps"
}
}
],
"reason": "certified_rate_required"
}
}
```
## Cómo resolverlo
Obtén su estado mediante la API de integraciones.
No inventes ni reutilices una tasa fuera de su fecha efectiva.
Usa `POST /integrations/v1/{companyId}/payments/{externalPaymentId}/certified-rate`.
Confirma aplicación, distribución y saldo.
Recibir este evento no autoriza a marcar documentos como pagados. Espera la aplicación efectiva y los eventos posteriores.
`documents[].metadata` conserva el contexto público de los documentos cuya aplicación quedó detenida.
# Pago confirmado
Source: https://docs.cobrix.co/guides/webhooks/events/payment-succeeded
El pago quedó confirmado
payment.succeeded
## 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
```json theme={null}
{
"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": "ana@example.com",
"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
Usa `data.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`.
# Suscripción activada
Source: https://docs.cobrix.co/guides/webhooks/events/subscription-activated
Una suscripción se activó o renovó
subscription.activated
## Payload completo
```json theme={null}
{
"id": "evt_f8204976-b132-442e-9fb3-636f7d75eb41",
"event": "subscription.activated",
"created_at": "2026-07-14T16:11:00.000Z",
"api_version": "2025-01-21",
"data": {
"subscriptionId": "sub_41fb04eb",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": ["internet"],
"status": "active",
"customFieldsData": null,
"type": "individual",
"address": null
},
"plan": {
"planId": "plan_600mb",
"name": "Internet 600 Mbps",
"billingPeriod": "month",
"intervalCount": 1
},
"status": "active",
"currentPeriodStart": "2026-07-14T16:11:00.000Z",
"currentPeriodEnd": "2026-08-14T16:11:00.000Z",
"activatedByPaymentId": "pay_842f7712",
"activatedBySessionId": "cs_5e52b98d"
}
}
```
## Cómo usarlo
Actualiza el periodo del servicio con `currentPeriodStart` y `currentPeriodEnd`. Si `activatedByPaymentId` es `null`, la activación pudo ser administrativa; no inventes un pago relacionado.
# Suscripción cancelada
Source: https://docs.cobrix.co/guides/webhooks/events/subscription-cancelled
Una suscripción fue cancelada
subscription.cancelled
## Payload completo
```json theme={null}
{
"id": "evt_98028b14-9d37-45f9-a854-3e4851a54f02",
"event": "subscription.cancelled",
"created_at": "2026-07-14T17:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"subscriptionId": "sub_41fb04eb",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"customer": {
"companyCustomerId": "cc_8aa37fd1",
"name": "Ana Pérez",
"email": "ana@example.com",
"phone": "+584120000000",
"taxId": "V12345678",
"externalRef": "customer-1001",
"metadata": null,
"customerCode": "C-1001",
"labels": ["internet"],
"status": "inactive",
"customFieldsData": null,
"type": "individual",
"address": null
},
"plan": {
"planId": "plan_600mb",
"name": "Internet 600 Mbps",
"billingPeriod": "month",
"intervalCount": 1
},
"status": "canceled",
"cancellationReason": "user_requested",
"cancelledAt": "2026-07-14T17:00:00.000Z",
"immediate": false,
"cancelAtPeriodEnd": true,
"currentPeriodEnd": "2026-08-14T16:11:00.000Z",
"cancelledByPaymentId": null
}
}
```
## Decide cuándo suspender
| Condición | Acción |
| -------------------------------- | --------------------------------------------------- |
| `immediate: true` | Ejecuta la baja según tus reglas operativas. |
| `cancelAtPeriodEnd: true` | Programa la baja para `currentPeriodEnd`. |
| `cancelledByPaymentId` con valor | Correlaciona la causa financiera. |
| `cancelledByPaymentId: null` | La cancelación no se atribuye a un pago específico. |
# Probar el webhook
Source: https://docs.cobrix.co/guides/webhooks/events/webhook-test
Prueba la conexión y la firma sin movimientos reales
webhook.test
## Cuándo se emite
Un usuario autorizado pulsa la acción de prueba del webhook. El envío ignora el filtro de eventos suscritos para probar directamente la configuración seleccionada.
## Payload completo
```json theme={null}
{
"id": "evt_816b69dc-16c1-4a80-bf21-4a1ca8176332",
"event": "webhook.test",
"created_at": "2026-07-14T18:00:00.000Z",
"api_version": "2025-01-21",
"data": {
"message": "This is a test webhook from Cobrix. If you receive this, your webhook endpoint is working correctly.",
"companyId": "7d355d52-ac74-49f5-b31c-ce29b4680752",
"webhookConfigId": "whcfg_54e6cdd1",
"timestamp": "2026-07-14T18:00:00.000Z"
}
}
```
## Lista de comprobación
La petición llegó a la URL correcta por HTTPS.
El cuerpo crudo produjo una firma válida.
El timestamp está dentro de cinco minutos.
El evento se guardó una sola vez.
Tu endpoint respondió `200` antes de 30 segundos.
Superar esta prueba valida transporte y seguridad, pero no sustituye pruebas de payload para los eventos de negocio que vas a consumir.
# Centro de ayuda Cobrix
Source: https://docs.cobrix.co/introduction
Guías y respuestas para gestionar tus cobros con Cobrix.
# Quickstart
Source: https://docs.cobrix.co/quickstart
Primera integración firmada y primer documento de cobro público
## Requisitos
Una empresa activa en sandbox
Un partner con `source` estable
Una llave `cbx_live_…` con los scopes necesarios
Un cliente HTTP capaz de conservar el cuerpo JSON exacto
## Opción A: API de integraciones
Esta API exige Bearer, timestamp, firma HMAC e idempotencia en `POST`.
```javascript Node.js theme={null}
import crypto from 'node:crypto'
const baseUrl = 'https://sandbox-api.cobrix.co/api'
const companyId = process.env.COBRIX_COMPANY_ID
const secret = process.env.COBRIX_API_KEY
const path = `/integrations/v1/${companyId}/customers/upsert`
const body = JSON.stringify({
source: 'erp_acme',
externalCustomerId: 'customer-1001',
type: 'individual',
name: 'Cliente de prueba',
email: 'cliente@example.com'
})
const timestamp = Math.floor(Date.now() / 1000).toString()
const signed = `${timestamp}.POST.${path}.${body}`
const signature = crypto.createHmac('sha256', secret).update(signed).digest('hex')
const response = await fetch(`${baseUrl}${path}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${secret}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
'Cobrix-Timestamp': timestamp,
'Cobrix-Signature': `v1=${signature}`
},
body
})
console.log(response.status, await response.json())
```
## Opción B: API pública de documentos de cobro
```bash cURL theme={null}
curl --request POST "https://sandbox-api.cobrix.co/api/v1/invoices" \
--header "Authorization: Bearer $COBRIX_API_KEY" \
--header "Content-Type: application/json" \
--header "x-idempotency: $(uuidgen)" \
--data '{
"reference": "V-12345678",
"provider": "erp_acme",
"provider_id": "DOC-1001",
"amount": 20.25,
"name": "Plan mensual de internet",
"email": "cliente@example.com",
"due_date": "2026-08-15"
}'
```
Una creación correcta responde `201` y devuelve `payment.payment_link`. `reference` identifica al cliente por su cédula o RIF y `provider_id` identifica el documento. Repetir el mismo cuerpo con la misma clave de idempotencia reproduce el resultado original.
## Siguiente paso
Configura webhooks para confirmar pagos y cambios de estado sin consultar continuamente la API. Consulta [Webhooks](/guides/webhooks/overview).
# Ejemplos de código
Source: https://docs.cobrix.co/resources/code-examples
Clientes mínimos para integraciones y documentos de cobro
## Cliente firmado para `/integrations/v1`
```javascript Node.js theme={null}
import crypto from 'node:crypto'
export async function cobrixIntegrationRequest({ baseUrl, apiKey, method, path, body }) {
const rawBody = body === undefined ? '' : JSON.stringify(body)
const timestamp = Math.floor(Date.now() / 1000).toString()
const signedPayload = `${timestamp}.${method.toUpperCase()}.${path}.${rawBody}`
const digest = crypto.createHmac('sha256', apiKey).update(signedPayload).digest('hex')
return fetch(`${baseUrl}${path}`, {
method,
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
'Cobrix-Timestamp': timestamp,
'Cobrix-Signature': `v1=${digest}`,
...(method.toUpperCase() === 'POST'
? { 'Idempotency-Key': crypto.randomUUID() }
: {})
},
body: rawBody || undefined
})
}
```
```python Python theme={null}
import hashlib, hmac, json, time, uuid, requests
def cobrix_integration_request(base_url, api_key, method, path, body=None):
raw_body = '' if body is None else json.dumps(body, separators=(',', ':'))
timestamp = str(int(time.time()))
signed = f'{timestamp}.{method.upper()}.{path}.{raw_body}'
digest = hmac.new(api_key.encode(), signed.encode(), hashlib.sha256).hexdigest()
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
'Cobrix-Timestamp': timestamp,
'Cobrix-Signature': f'v1={digest}',
}
if method.upper() == 'POST':
headers['Idempotency-Key'] = str(uuid.uuid4())
return requests.request(method, base_url + path, headers=headers, data=raw_body or None)
```
## Cliente para documentos de cobro
```javascript Node.js theme={null}
import crypto from 'node:crypto'
export async function createInvoice(baseUrl, apiKey, invoice) {
return fetch(`${baseUrl}/v1/invoices`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
'x-idempotency': crypto.randomUUID()
},
body: JSON.stringify(invoice)
})
}
```
```bash cURL theme={null}
curl --request GET \
"https://sandbox-api.cobrix.co/api/v1/invoices?filter[status]=CREATED&sort=-created_at" \
--header "Authorization: Bearer $COBRIX_API_KEY"
```
En shell, usa `curl --globoff` si tu versión interpreta los corchetes de `filter[status]` como un rango.
# Errores y rate limits
Source: https://docs.cobrix.co/resources/errors
Envelopes, códigos y estrategia de reintentos
Cada API usa un envelope distinto. Conserva `requestId` y los headers de rate limit al registrar un incidente.
## API de integraciones
```json theme={null}
{
"error": {
"code": "invalid_signature",
"message": "The request signature is invalid.",
"requestId": "req-1001"
}
}
```
| HTTP | Códigos frecuentes | Acción |
| ----- | ------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `400` | `missing_idempotency_key` | Agrega `Idempotency-Key` a todo `POST`. |
| `401` | `invalid_api_key`, `revoked_api_key`, `expired_api_key` | Comprueba o rota la llave. |
| `401` | `missing_signature`, `missing_timestamp`, `invalid_signature`, `timestamp_out_of_tolerance` | Reconstruye la firma con el cuerpo exacto. |
| `403` | `company_mismatch`, `insufficient_scope` | Corrige empresa o scopes. |
| `404` | Recurso externo no encontrado | Verifica `source` e identificador externo. |
| `409` | Conflicto de idempotencia o estado | No repitas con otro payload; consulta el recurso. |
| `422` | Regla financiera o selección inválida | Corrige moneda, cliente o documentos. |
| `429` | `rate_limited` | Aplica backoff. |
El límite normal es 120 solicitudes por minuto por llave y ruta. `verified-payments` usa 60 por minuto.
## API pública de documentos de cobro
```json theme={null}
{
"message": "La solicitud contiene errores de validación.",
"code": 10001,
"code_name": "validation_error",
"errors": {
"amount": ["El monto debe ser al menos 0.01."]
}
}
```
| HTTP | `code_name` | Uso |
| ----- | ---------------------- | ----------------------------------------------------------------------- |
| `401` | `authentication_error` | Bearer ausente o inválido. |
| `403` | `forbidden` | Scope faltante o compañía no habilitada. |
| `404` | `not_found` | Documento inexistente o de otra empresa. |
| `409` | `idempotency_error` | Clave ausente o reutilizada con otro cuerpo. |
| `409` | `conflict` | Pago aplicado, monto pagado, estado terminal o actualización pendiente. |
| `422` | `validation_error` | Campo inválido, ausente o no permitido. |
| `429` | `rate_limit_error` | Límite distribuido excedido. |
| `500` | `INTERNAL_ERROR` | Error interno sanitizado; contacta soporte. |
| `503` | `service_unavailable` | Ledger o configuración financiera no disponible. |
La API incluye `X-RateLimit-Limit`, `X-RateLimit-Remaining` y `X-RateLimit-Reset`. En `429`, respeta `Retry-After`.
## Estrategia de reintento
* Reintenta timeouts, `429` y `5xx` con backoff exponencial y jitter.
* Conserva la misma clave de idempotencia y el mismo payload.
* No reintentes automáticamente `401`, `403`, `404` o `422` sin corregir la causa.
* Ante un `409`, consulta el recurso antes de iniciar una operación nueva.
* Registra método, ruta, status, `requestId`, código y clave de idempotencia; nunca registres el Bearer o firmas.
# Pruebas en sandbox
Source: https://docs.cobrix.co/resources/testing
Matriz de pruebas sin afectar producción
## Preparación
1. Usa `https://sandbox-api.cobrix.co/api`.
2. Crea el partner y la llave dentro de la empresa QA.
3. Usa referencias únicas por ejecución.
4. Configura un webhook exclusivo de pruebas.
5. No uses emails o teléfonos de clientes reales.
## API de integraciones
| Caso | Resultado esperado |
| ----------------------------------------- | ---------------------------------------- |
| Bearer inválido | `401 invalid_api_key` |
| Firma alterada | `401 invalid_signature` |
| Timestamp vencido | `401 timestamp_out_of_tolerance` |
| `POST` sin idempotencia | `400 missing_idempotency_key` |
| Replay idéntico | Misma respuesta, sin duplicados |
| Cliente y documento upsert | `created`, luego `unchanged` o `updated` |
| Link con documentos de clientes distintos | `422` |
| Pago verificado repetido | `already_processed` o replay original |
| Pago multimoneda sin tasa | `needs_certified_rate` |
## Documentos de cobro públicos
| Caso | Resultado esperado |
| ------------------------------------------------------------ | ---------------------------------------- |
| Crear USD 20,25 | `201`, `amount: 20.25` y link de pago |
| Crear con nombre de 2 caracteres | Aceptado si los demás campos son válidos |
| Crear o actualizar con nombre de 1 o 101 caracteres | `422`, error en `name` |
| Crear sin correo, con vacío o solo espacios | Aceptado; no genera un correo |
| Crear o actualizar con correo inválido no vacío | `422`, error en `email`, sin cambios |
| Crear o actualizar con espacios externos en un correo válido | Guarda el correo recortado |
| Actualizar omitiendo correo o enviando vacío/espacios | Conserva el correo existente |
| Replay idéntico | Mismo `id` y `payment_id` |
| Misma clave, otro cuerpo | `409 idempotency_error` |
| Actualizar pendiente 20 → 25 → 18 | Checkout reemplazado y ledger balanceado |
| Cambiar `provider` | `422 errors.provider` |
| Actualizar con pago aplicado | `409 errors.payment` |
| Cambiar monto pagado | `409 errors.amount` |
| Anular pendiente | `204` y estado `DELETE_FROM_PROVIDER` |
| Actualizar anulada | `409 errors.status` |
| Eliminación masiva | `202` con JSON `null` |
## Webhooks
El receptor de pruebas debe registrar identificadores, firma válida, hora y HTTP,
sin ejecutar pagos ni contactar personas. Usa datos sintéticos y desactiva cualquier
salida hacia correo, WhatsApp, bancos o sistemas de clientes.
El botón de prueba emite `webhook.test` por un recorrido de conectividad propio.
Un ping exitoso no certifica el nuevo dispatcher, su concurrencia ni la recuperación
de recordatorios. Para esos casos usa un productor de negocio afectado dentro de
una empresa QA aislada y un receptor exclusivo de pruebas.
| Caso | Evidencia esperada |
| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| Ping `webhook.test` | El receptor recibe y verifica la firma; Cobrix registra su HTTP |
| Lote acotado de 61 eventos generales preparados en un mismo minuto por el circuito corregido | Los 61 quedan persistidos; ninguno se omite por el antiguo límite de 60/minuto |
| Saturación controlada del receptor de sandbox | Los excedentes quedan pendientes con su identificador, sin consumir intentos antes de HTTP |
| Recuperación de esos pendientes | Avanza el mismo evento, sin crear uno de reemplazo; conserva su payload |
| Un `500` temporal, luego receptor operativo | Captura el fallo antes del reintento; después verifica el mismo `eventLogId`, HTTP exitoso y aumento de `attempts` |
| Repetición del mismo evento | El receptor deduplica por su identidad y no repite acciones |
| Respuesta `2xx` al protocolo general | Cobrix registra entrega HTTP; no implica entrega Meta |
| Respuesta al protocolo de documentos públicos | Sólo `200` confirma entrega HTTP |
No fuerces saturación, caídas de receptores, reintentos globales ni reinicios en
producción para probar estos casos. Un ensayo de 61 eventos no certifica el tiempo
de un lote de 10.000 ni la entrega a WhatsApp.
## Registro de resultados
Anota ambiente, versión desplegada, fecha, número de eventos preparados, pendientes,
aceptados por HTTP y fallidos. Conserva los identificadores de seguimiento en una
evidencia privada, junto con el HTTP observado y los intentos de cada evento.
Informa por separado lo observado en el receptor y lo registrado en Cobrix.
El log del evento refleja el último resultado: al entregar correctamente,
`lastError` se limpia y `lastResponseStatus` cambia. No lo uses como historial
completo de todos los intentos; conserva las observaciones del ensayo por separado.
Si sólo se ejecutaron pruebas locales o un ping, indícalo expresamente; no lo
presentes como una validación de recuperación o capacidad en producción.
## Limpieza
Desactiva el endpoint exclusivo de prueba cuando termines y revisa que no queden
eventos de ese ensayo pendientes. Conserva la auditoría. Anula sólo los documentos
sintéticos pendientes creados por el ensayo; comprueba antes los efectos de sus
webhooks de anulación. Identifica expresamente cualquier documento liquidado desde
proveedor, porque no debe revertirse fuera del flujo financiero oficial.