Saltar al contenido principal
Contenido

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
Su sistema contableERP · facturación · carterala fuente de verdadAPI de Certeza/api/v1con su API keyGestión de cobrodecide a quién, cuándoy por qué canalSus clientesWhatsApp · llamadaSMS · correoenvía datosrespondea sus consultasregistracontactaresponde
Su sistema envía los datos y consulta el estado; Certeza gestiona el cobro con sus clientes.

Antes de empezar

  1. 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.
  2. 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 en external_id el mismo código que usa su sistema contable para ese cliente; así cruzar la información entre los dos sistemas es inmediato.
  3. Verifique la llave con GET /v1/ (vea Autenticación).
  4. 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.

  1. Cargue primero sus clientes, obligaciones y pagos.
  2. Verifique que saldos, documentos, teléfonos y fechas coincidan con su sistema, consultando la API y revisando algunos clientes en la plataforma.
  3. 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:

Solicitud
curl https://api.certeza.app/api/v1/ \
  -H "Authorization: Bearer $CERTEZA_API_KEY"
Respuesta · 200
{
  "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ó.
PAGOSOBLIGACIONESCLIENTERC-871/FV-1001$ 500.000recibo RC-871, parte 1RC-871/FV-1002$ 300.000recibo RC-871, parte 2RC-905$ 200.000a cuenta, sin aplicarObligación FV-1001valor $ 1.000.000saldo $ 500.000Obligación FV-1002valor $ 300.000saldo $ 0Clientecedula1020304050aplicaaplicade
Solo lo aplicado a una obligación baja su saldo (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:

  1. Clientes con POST /v1/customer/batch.
  2. Obligaciones con POST /v1/obligations/batch: las que tienen saldo pendiente, con su valor original en amount.
  3. 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-1001 y RC-871/FV-1002.
  • Un pago que aún no sabe a qué obligación aplicar: envíelo con customer_identifier y currency; queda a cuenta y no baja ningún saldo. Indique la obligación siempre que la sepa.
El recibo RC-871 pagó FV-1001 y FV-1002
{
  "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 sistemaEn 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 facturaReenvíe la obligación con el nuevo amount.
Se anuló una factura sin pagosDELETE /v1/obligations/{obligation_id}.
Castigó una deuda y deja de cobrarlaPATCH /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/obligations filtrando por su documento. outstanding_balance es el saldo de cada obligación y summary.by_currency.*.owed_amount el total.
  • Pagos de un periodo: GET /v1/payments?received_date_from=…&received_date_to=….

Formatos y límites

TemaRegla
FechasAAAA-MM-DD.
MontosMayores 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.
MonedasISO 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.
DocumentosUn 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éfonosE.164, sin espacios: +57 seguido de los 10 dígitos del celular, por ejemplo +5730011XXXXX (reemplace las X por el número real).
TamañoHasta 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.
RastreoEnví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.

Respuesta · 200
{
  "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
}
  • outcome es created, updated o failed. key es el identificador con el que se buscó el registro y index su 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_errors indica 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_codeHTTPCuándo ocurre
UNAUTHORIZED401API key ausente, inválida, expirada o eliminada.
VALIDATION_FAILED422Un dato no es válido; details dice cuál.
NOT_FOUND404El id de la ruta no existe.
CUSTOMER_NOT_FOUND422 / 404Se nombra un cliente que no existe.
INVALID_IDENTIFIER_TYPE422Tipo de documento no admitido, al crear o actualizar clientes. En obligaciones y pagos, un tipo no admitido responde VALIDATION_FAILED.
INVALID_PHONE_NUMBER422Teléfono fuera del formato E.164.
INVALID_EMAIL422Correo no válido.
INVALID_COUNTRY_CODE422País no válido (use ISO alfa-3, COL).
INVALID_CONTACT_CHANNELS422Canal de contacto no válido.
INVALID_CLIENT_SOURCE422client_source distinto de api o manual.
DUPLICATE_IDENTIFIER409El nuevo documento ya pertenece a otro cliente.
DUPLICATE_REFERENCE_NUMBER409La obligación ya existe (POST /v1/obligations). Use el lote.
OBLIGATION_CUSTOMER_MISMATCH409La obligación pertenece a otro cliente.
DUE_DATE_BEFORE_ISSUE_DATE422due_date anterior a issue_date.
OBLIGATION_UNDER_DISPUTE409No se puede cambiar el estado: el cliente tiene una disputa abierta.
OBLIGATION_HAS_PAYMENT_ALLOCATIONS409No se puede eliminar: tiene pagos aplicados.
OBLIGATION_NOT_FOUND422El pago nombra una obligación que no existe.
OBLIGATION_FULLY_ALLOCATED409La obligación ya no tiene saldo.
PAYMENT_RECEIVED_DATE_IMMUTABLE409La fecha de un pago no se puede cambiar: elimínelo y créelo de nuevo.
PAYMENT_AMOUNT_LOCKED_BY_PROMISE409El pago ya cumplió un acuerdo de pago y su valor no se puede cambiar: elimínelo y créelo de nuevo.
PAYMENT_AMOUNT_BELOW_ALLOCATED409El nuevo valor es menor que lo ya aplicado.
LEDGER_HELD_EXTERNALLY409Su 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_RECORD409El registro no se puede eliminar por la API.
ORGANIZATION_SETTINGS_NOT_FOUND422Su organización aún no tiene configuración regional; escríbanos.
INTERNAL_ERROR500Falla 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.

CampoDescripció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_nameApellidos.
external_idEl código del cliente en su sistema contable. Recomendado.
emailsLista de correos. Reemplaza los guardados; [] los borra.
mobilesLista 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.
landlinesTeléfonos fijos en E.164 (solo de referencia).
contactsContactos con canales explícitos (whatsapp, sms, call). Un cliente puede tener hasta tres celulares, cada canal en uno solo.
countryPaís del documento, ISO alfa-3. Por defecto COL.
Solicitud
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.

CampoDescripció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_dateFecha de emisión.
currencyMoneda. Envíela siempre: si la omite al actualizar, vuelve a la moneda por defecto.
external_referenceUn segundo número suyo (pedido, contrato). Envíelo siempre: si lo omite al actualizar, se borra.
descriptionQué se cobra, dicho para el cliente: los agentes lo usan para explicarle la deuda.
notesNotas internas; el cliente no las ve.
tagsEtiquetas para filtrar consultas.
line_itemsDesglose de conceptos; sus total deben sumar amount.
Solicitud
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.

CampoDescripció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_numberLa obligación que paga. Envíelo siempre que lo sepa.
customer_identifierEl cliente que pagó. Obligatorio solo si no indica obligación.
currencyObligatoria solo si no indica obligación.
Solicitud
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.