API pública · versión 1
Guía de integración
Conecte su sistema contable con Certeza. Usted nos envía sus clientes, sus obligaciones y los pagos que recibe; Certeza gestiona el cobro y usted consulta saldos y estados cuando los necesite.
- URL base
https://api.certeza.app/api/v1- Autenticación
Authorization: Bearer <API key>- Formato
- JSON en UTF-8
- Lotes
- Hasta 500 registros por solicitud
- Especificación OpenAPI
- SwaggerReDocopenapi.json
Antes de empezar
- Cree una API key. Un administrador de su organización entra a
https://certeza.app/es/platform/configuraciones/api-keys, pulsa «Nueva llave» y le da un nombre que diga dónde se usará, por ejemplo «ERP producción». La llave completa se muestra una sola vez: cópiela directamente a su gestor de secretos. - Defina cómo identifica cada registro. Cada cliente se identifica por su tipo y número de documento; cada obligación, por su número de factura (
reference_number); cada pago, por su número de recibo (reference). Estos datos no deben cambiar nunca: si cambian, Certeza crea un registro nuevo. Además, en el cliente envíe enexternal_idel mismo código que usa su sistema contable para ese cliente; así cruzar la información entre los dos sistemas es inmediato. - Verifique la llave con
GET /v1/(vea Autenticación). - Cargue y verifique sus datos antes de activar el Piloto automático (vea Cómo probar).
Cómo probar
Certeza no tiene un ambiente de pruebas separado: cada llave escribe en su organización real. Mientras su organización no tenga en el Piloto automático de la plataforma una segmentación activa con su política de cobro, Certeza no contacta a ningún cliente.
- Cargue primero sus clientes, obligaciones y pagos.
- Verifique que saldos, documentos, teléfonos y fechas coincidan con su sistema, consultando la API y revisando algunos clientes en la plataforma.
- Active el Piloto automático después. Desde que una segmentación y su política quedan activas, Certeza empieza a gestionar a los clientes con deuda abierta de ese segmento.
Si su organización ya tiene el Piloto automático activo, cada carga se gestiona desde que llega: verifique los datos antes de enviarlos y empiece con un grupo pequeño de clientes.
Autenticación
Cada solicitud lleva la API key en el encabezado Authorization con el esquema Bearer. Compruebe su llave con la raíz de la API:
curl https://api.certeza.app/api/v1/ \
-H "Authorization: Bearer $CERTEZA_API_KEY"{
"message": "Public API v1",
"tenant_id": "3f6c2a1e-8d4b-4c1a-9e57-2b8f0d6a41c3",
"key_name": "ERP producción"
}key_name es el nombre que le dio a la llave; así confirma cuál está usando. tenant_id es el identificador de su organización en Certeza y no necesita enviarlo en ninguna solicitud. Si la llave falta, es inválida, expiró o fue eliminada, la respuesta es 401 con error_code UNAUTHORIZED.
Clientes, obligaciones y pagos
- Cliente
customer - La persona o empresa que le debe a su organización. Se identifica por tipo y número de documento (
identifier_type+identifier_value). - Obligación
obligation - Una deuda concreta: una factura, una cuenta de cobro, una mensualidad de un crédito. Pertenece a un solo cliente y tiene su valor, su fecha de vencimiento y su saldo. Se identifica por
reference_number, único en su organización. - Pago
payment - Dinero que usted recibió de un cliente. Se aplica a una obligación, o queda a cuenta. Se identifica por
reference, el número de su recibo, dentro del cliente que pagó.
outstanding_balance). El recibo RC-871 pagó dos facturas y se envía como dos pagos; RC-905 quedó a cuenta y no baja ningún saldo.Crear y actualizar se hace con el mismo endpoint y con estos identificadores: si el registro no existe se crea, y si existe se actualiza. Su sistema no necesita guardar los identificadores de Certeza (id, obligation_id, payment_id), salvo para leer, modificar o eliminar un registro puntual.
Si vendió a crédito en 12 mensualidades, envíe 12 obligaciones, una por vencimiento, cada una con su reference_number y su due_date.
Flujos de integración
Carga inicial
El orden importa, porque cada paso usa registros del anterior:
- Clientes con
POST /v1/customer/batch. - Obligaciones con
POST /v1/obligations/batch: las que tienen saldo pendiente, con su valor original enamount. - Pagos con
POST /v1/payments/batch: los abonos que ya recibió sobre esas obligaciones, con su fecha real.
Envíe lotes de hasta 500 registros, uno a la vez, y revise failed en cada respuesta.
Sincronización periódica
- Envíe los cambios en el mismo orden: clientes, obligaciones, pagos.
- Le sugerimos enviar solo lo nuevo o lo que cambió: reenviar registros sin cambios no crea duplicados, pero hace que Certeza vuelva a evaluar a esos clientes.
- Envíe cada registro completo, tal como está en su sistema.
- Reporte los pagos tan frecuentemente como pueda. Mientras un pago no llegue a Certeza, el cliente que ya pagó puede seguir recibiendo gestión de cobro.
Reportar pagos
- Un recibo que paga una obligación: un pago con
obligation_reference_number. - Un recibo que paga varias obligaciones: un pago por obligación, con una referencia que combine el recibo y la obligación, por ejemplo
RC-871/FV-1001yRC-871/FV-1002. - Un pago que aún no sabe a qué obligación aplicar: envíelo con
customer_identifierycurrency; queda a cuenta y no baja ningún saldo. Indique la obligación siempre que la sepa.
{
"items": [
{ "reference": "RC-871/FV-1001", "amount": "500000.00",
"received_date": "2026-09-25", "obligation_reference_number": "FV-1001" },
{ "reference": "RC-871/FV-1002", "amount": "300000.00",
"received_date": "2026-09-25", "obligation_reference_number": "FV-1002" }
]
}Correcciones y anulaciones
| En su sistema | En Certeza |
|---|---|
| Un pago tenía un error (valor, fecha u obligación) | Elimínelo con DELETE /v1/payments/{payment_id} y envíelo de nuevo correcto. |
| Un pago se reversó (cheque devuelto, transferencia anulada) | Elimínelo. Los saldos se restablecen. |
| Una nota crédito baja el valor de una factura | Reenvíe la obligación con el nuevo amount. |
| Se anuló una factura sin pagos | DELETE /v1/obligations/{obligation_id}. |
| Castigó una deuda y deja de cobrarla | PATCH /v1/obligations/{obligation_id} con {"status": "WRITTEN_OFF"}, y deje de enviar esa obligación. La obligación sigue castigada mientras tenga saldo, aunque la vuelva a enviar o reciba abonos; solo el pago total la levanta. |
Consultar el estado
- Lo que debe un cliente:
GET /v1/obligationsfiltrando por su documento.outstanding_balancees el saldo de cada obligación ysummary.by_currency.*.owed_amountel total. - Pagos de un periodo:
GET /v1/payments?received_date_from=…&received_date_to=….
Formatos y límites
| Tema | Regla |
|---|---|
| Fechas | AAAA-MM-DD. |
| Montos | Mayores que cero. Recomendamos enviarlos como texto ("1250000.50") para evitar errores de redondeo. En obligaciones, los decimales después del segundo se truncan; en pagos, envíe como máximo 2. Las respuestas los devuelven como texto. |
| Monedas | ISO 4217 en mayúsculas (COP). Por defecto, en obligaciones, la moneda de su organización; en pagos, la moneda de la obligación que pagan. |
| Documentos | Un solo formato siempre; recomendamos solo dígitos, sin puntos ni guiones, y el NIT sin dígito de verificación (900123456). 900.123.456-7 y 900123456 serían dos clientes distintos. |
| Teléfonos | E.164, sin espacios: +57 seguido de los 10 dígitos del celular, por ejemplo +5730011XXXXX (reemplace las X por el número real). |
| Tamaño | Hasta 500 registros y 1 MB por solicitud. Una solicitud de más de 60 segundos se corta: si pasa, envíe lotes más pequeños. |
| Rastreo | Envíe un X-Request-Id propio en cada solicitud; la respuesta lo devuelve y nos ayuda a encontrarla. |
Lotes
Los endpoints /batch reciben {"items": [...]} con hasta 500 registros. Si la solicitud se entendió, responden 200 aunque algunos registros hayan fallado: revise failed.
{
"results": [
{ "index": 0, "key": "FV-1001", "outcome": "created",
"id": "0b8e7c52-4f3a-4d0e-9a61-6c2d95e1f7a4", "error": null },
{ "index": 1, "key": "FV-1002", "outcome": "failed", "id": null,
"error": {
"error_code": "CUSTOMER_NOT_FOUND",
"http_status": 422,
"message": "Customer with cedula='1020304050' not found",
"details": { "identifier_type": "cedula", "identifier_value": "1020304050" }
} }
],
"created": 1,
"updated": 0,
"failed": 1
}outcomeescreated,updatedofailed.keyes el identificador con el que se buscó el registro yindexsu posición en la lista (desde 0).- Un registro rechazado no se escribe y no detiene a los demás. Corríjalo y reenvíe solo ese.
- Si el JSON no cumple el esquema (falta un campo obligatorio, tipo incorrecto), se rechaza el lote completo con 422 y
details.validation_errorsindica el registro y el campo. - Ante un 500 o un corte de red, reenvíe el lote completo: no se duplica nada.
Errores
Los errores responden con error_code, http_status, message, details y trace_id. Decida según error_code; message es solo informativo. Una ruta que no existe responde 404 con {"detail": "Not Found"}.
| error_code | HTTP | Cuándo ocurre |
|---|---|---|
UNAUTHORIZED | 401 | API key ausente, inválida, expirada o eliminada. |
VALIDATION_FAILED | 422 | Un dato no es válido; details dice cuál. |
NOT_FOUND | 404 | El id de la ruta no existe. |
CUSTOMER_NOT_FOUND | 422 / 404 | Se nombra un cliente que no existe. |
INVALID_IDENTIFIER_TYPE | 422 | Tipo de documento no admitido, al crear o actualizar clientes. En obligaciones y pagos, un tipo no admitido responde VALIDATION_FAILED. |
INVALID_PHONE_NUMBER | 422 | Teléfono fuera del formato E.164. |
INVALID_EMAIL | 422 | Correo no válido. |
INVALID_COUNTRY_CODE | 422 | País no válido (use ISO alfa-3, COL). |
INVALID_CONTACT_CHANNELS | 422 | Canal de contacto no válido. |
INVALID_CLIENT_SOURCE | 422 | client_source distinto de api o manual. |
DUPLICATE_IDENTIFIER | 409 | El nuevo documento ya pertenece a otro cliente. |
DUPLICATE_REFERENCE_NUMBER | 409 | La obligación ya existe (POST /v1/obligations). Use el lote. |
OBLIGATION_CUSTOMER_MISMATCH | 409 | La obligación pertenece a otro cliente. |
DUE_DATE_BEFORE_ISSUE_DATE | 422 | due_date anterior a issue_date. |
OBLIGATION_UNDER_DISPUTE | 409 | No se puede cambiar el estado: el cliente tiene una disputa abierta. |
OBLIGATION_HAS_PAYMENT_ALLOCATIONS | 409 | No se puede eliminar: tiene pagos aplicados. |
OBLIGATION_NOT_FOUND | 422 | El pago nombra una obligación que no existe. |
OBLIGATION_FULLY_ALLOCATED | 409 | La obligación ya no tiene saldo. |
PAYMENT_RECEIVED_DATE_IMMUTABLE | 409 | La fecha de un pago no se puede cambiar: elimínelo y créelo de nuevo. |
PAYMENT_AMOUNT_LOCKED_BY_PROMISE | 409 | El pago ya cumplió un acuerdo de pago y su valor no se puede cambiar: elimínelo y créelo de nuevo. |
PAYMENT_AMOUNT_BELOW_ALLOCATED | 409 | El nuevo valor es menor que lo ya aplicado. |
LEDGER_HELD_EXTERNALLY | 409 | Su organización tiene configurado que estos registros los escribe su sistema contable por otra vía, así que la API no puede modificarlos. |
CANNOT_DELETE_SYSTEM_RECORD | 409 | El registro no se puede eliminar por la API. |
ORGANIZATION_SETTINGS_NOT_FOUND | 422 | Su organización aún no tiene configuración regional; escríbanos. |
INTERNAL_ERROR | 500 | Falla nuestra: reintente con espera creciente. |
Referencia
Rutas relativas a https://api.certeza.app/api; por ejemplo, /v1/customer es https://api.certeza.app/api/v1/customer. El detalle de cada campo está en Swagger (para probar endpoints) y en ReDoc (para leer la referencia completa).
Clientes
POST/v1/customer
Crea o actualiza un cliente, buscándolo por tipo y número de documento. También en lote: POST /v1/customer/batch.
| Campo | Descripción |
|---|---|
identifier_typeoblig. | cedula, nit, cedula_extranjeria o numero_propiedad. |
identifier_valueoblig. | Número de documento (hasta 50 caracteres). Junto con el tipo, identifica al cliente. |
customer_nameoblig. | Nombres o razón social. |
last_name | Apellidos. |
external_id | El código del cliente en su sistema contable. Recomendado. |
emails | Lista de correos. Reemplaza los guardados; [] los borra. |
mobiles | Lista de celulares en E.164. Reemplaza los guardados. Sirve para un solo celular; para registrar dos o más, o para agregar uno a un cliente que ya tiene celular, use contacts. |
landlines | Teléfonos fijos en E.164 (solo de referencia). |
contacts | Contactos con canales explícitos (whatsapp, sms, call). Un cliente puede tener hasta tres celulares, cada canal en uno solo. |
country | País del documento, ISO alfa-3. Por defecto COL. |
curl -X POST https://api.certeza.app/api/v1/customer \
-H "Authorization: Bearer $CERTEZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"identifier_type": "cedula",
"identifier_value": "1020304050",
"customer_name": "Ana María",
"last_name": "Pérez Gómez",
"external_id": "CLI-000123",
"emails": ["ana.perez@example.com"],
"mobiles": ["+5730011XXXXX"]
}'Responde 201 si lo creó y 200 si lo actualizó, con el cliente y su id. Un campo que no envía se conserva, salvo client_source, que vuelve a api. Un nombre de campo mal escrito se ignora sin error, así que revise que coincidan con esta tabla.
PATCH/v1/customer/{customer_id}
Cambia campos de un cliente por su id. Úselo para corregir un documento mal registrado.
Obligaciones
POST/v1/obligations/batch
Crea o actualiza hasta 500 obligaciones, buscándolas por reference_number.
| Campo | Descripción |
|---|---|
customer_identifieroblig. | {"type", "value"}: el documento del cliente, que debe existir. |
reference_numberoblig. | Su número de factura. Único en su organización y no se puede cambiar. El cliente lo ve en los mensajes. |
amountoblig. | Valor de la obligación. |
due_dateoblig. | Fecha de vencimiento. |
issue_date | Fecha de emisión. |
currency | Moneda. Envíela siempre: si la omite al actualizar, vuelve a la moneda por defecto. |
external_reference | Un segundo número suyo (pedido, contrato). Envíelo siempre: si lo omite al actualizar, se borra. |
description | Qué se cobra, dicho para el cliente: los agentes lo usan para explicarle la deuda. |
notes | Notas internas; el cliente no las ve. |
tags | Etiquetas para filtrar consultas. |
line_items | Desglose de conceptos; sus total deben sumar amount. |
curl -X POST https://api.certeza.app/api/v1/obligations/batch \
-H "Authorization: Bearer $CERTEZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"customer_identifier": { "type": "cedula", "value": "1020304050" },
"reference_number": "FV-1001",
"amount": "1000000.00",
"currency": "COP",
"issue_date": "2026-09-01",
"due_date": "2026-09-30",
"description": "Servicio de internet hogar, septiembre de 2026"
}
]
}'GET/v1/obligations
Lista obligaciones. Filtros: customer_identifier_type + customer_identifier_value, status, tags, limit (hasta 500) y offset.
Cada obligación trae amount, outstanding_balance y status: OPEN, PARTIALLY_PAID, PAID, OVERPAID, DISPUTED (el cliente la disputa) o WRITTEN_OFF (castigada). count es el total que cumple el filtro.
GETPATCHDELETE/v1/obligations/{obligation_id}
Lee, modifica o elimina una obligación. DELETE no es posible si tiene pagos aplicados.
Pagos
POST/v1/payments/batch
Registra o actualiza hasta 500 pagos. También de a uno: POST /v1/payments.
| Campo | Descripción |
|---|---|
referenceoblig. | Su número de recibo, único por cliente. |
amountoblig. | Valor aplicado a la obligación (o total del pago, si queda a cuenta). |
received_dateoblig. | Fecha real en que recibió el dinero. No se puede cambiar después. |
obligation_reference_number | La obligación que paga. Envíelo siempre que lo sepa. |
customer_identifier | El cliente que pagó. Obligatorio solo si no indica obligación. |
currency | Obligatoria solo si no indica obligación. |
curl -X POST https://api.certeza.app/api/v1/payments/batch \
-H "Authorization: Bearer $CERTEZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"reference": "RC-871",
"amount": "500000.00",
"received_date": "2026-09-25",
"obligation_reference_number": "FV-1001"
}
]
}'GET/v1/payments
Lista pagos. Filtros: party_id, received_date_from, received_date_to, limit y offset.
GETDELETE/v1/payments/{payment_id}
Lee un pago con sus aplicaciones, o lo elimina.
Soporte
Para dudas de integración o para reportar un error, escriba a su contacto en Certeza. Incluya el endpoint, la hora aproximada, su X-Request-Id y el trace_id de la respuesta. No incluya su API key.
API pública de Certeza, versión 1. Actualizada el 28 de septiembre de 2026. El contrato técnico completo está en openapi.json.