Pagos a proveedores
Cuentas por pagar (CxP): registra el dinero que le pagas a un proveedor y
aplícalo contra una o varias compras o liquidaciones de compra (abono
parcial o pago consolidado). Lo que no se aplica queda como
anticipo al proveedor, y un pago también puede
cancelarse con cruce contra cuentas contables en vez de
caja o bancos. Espejo de Cobros sobre
Compra en vez de Factura. Incluye la agenda de
pagos semanal.
Autenticación
X-API-Key con una API key que tenga permisos sobre el
recurso pagos_proveedor. Igual que el resto de la API, el
tenant se resuelve por la propia key (no hace falta
X-Tenant-Id en integraciones vía API pública).
Registrar un pago
POST /api/v1/pagos-proveedor — Crea un pago y sus aplicaciones a compra(s)
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
proveedor_id required | integer | Id del proveedor (PersonaEmpresa con es_proveedor=true). |
fecha required | datetime | Fecha en que se entregó el dinero (ISO 8601). No puede ser futura ni caer en un período contable cerrado (400). Ver fechas contables. |
medio required | string | Medio de pago — código de la Tabla 24 SRI (ej. '01' efectivo, '16' t. débito, '19' t. crédito, '20' otros con utilización del sistema financiero). '15' (compensación de deudas) para un pago con cruce. |
monto required | number | Monto total del pago. Σ aplicaciones.monto_aplicado debe ser ≤ monto (±0.01); lo que sobra queda como anticipo (monto_anticipo). |
referencia optional | string | Referencia libre (n° de transferencia, cheque, etc). Máx 120 caracteres. |
notas optional | string | Notas internas. |
cuenta_dinero_id optional | integer | Cuenta de caja/banco desde la que salió el dinero: crea el egreso en ella (ver Cuentas y bancos). Si se omite y la empresa tiene una sola cuenta activa del tipo que corresponde al medio ('01' caja, '16'/'19' tarjeta, '20' banco), se usa esa. No se admite en un pago con cruce. |
sucursal_id optional | integer | Sucursal de trazabilidad. Si se omite, se infiere del usuario. |
aplicaciones optional | array | Documentos que cancela. Puede ir vacío (anticipo puro, con monto > 0). Default []. |
cruce optional | array | Líneas contables de un pago con cruce (ver más abajo). Default []. |
Forma de aplicaciones[]
| Parámetro | Tipo | Descripción |
|---|---|---|
compra_id optional | integer | Compra (documento recibido) a la que se aplica el pago. Exactamente uno de compra_id o liquidacion_id. |
liquidacion_id optional | integer | Liquidación de compra emitida (autorizada) a la que se aplica el pago. |
monto_aplicado required | number | Monto aplicado a ese documento. No puede superar su saldo pendiente (total − total_pagado). |
import { Emitoo } from "emitoo";
const client = new Emitoo(); // lee la API key de EMITOO_API_KEY
const pago = await client.pagosProveedor.crear({
proveedor_id: 7,
fecha: new Date().toISOString(),
medio: "01",
monto: 320.0,
referencia: "TRF-55021",
aplicaciones: [
{ compra_id: 214, monto_aplicado: 200.0 },
{ compra_id: 219, monto_aplicado: 120.0 },
],
});from emitoo import EmitooClient
client = EmitooClient() # lee la API key de EMITOO_API_KEY
pago = client.pagos_proveedor.crear({
"proveedor_id": 7,
"fecha": "2026-07-06T09:30:00",
"medio": "01",
"monto": 320.00,
"referencia": "TRF-55021",
"aplicaciones": [
{"compra_id": 214, "monto_aplicado": 200.00},
{"compra_id": 219, "monto_aplicado": 120.00},
],
})client, err := emitoo.New("") // lee la API key de EMITOO_API_KEY
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
pago, err := client.PagosProveedor.Crear(ctx, emitoo.M{
"proveedor_id": 7,
"fecha": time.Now().Format(time.RFC3339),
"medio": "01",
"monto": 320.0,
"referencia": "TRF-55021",
"aplicaciones": []emitoo.M{
{"compra_id": 214, "monto_aplicado": 200.0},
{"compra_id": 219, "monto_aplicado": 120.0},
},
})
if err != nil {
log.Fatal(err)
}curl -X POST https://api.emitoo.io/api/v1/pagos-proveedor \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proveedor_id": 7,
"fecha": "2026-07-06T09:30:00",
"medio": "01",
"monto": 320.00,
"referencia": "TRF-55021",
"aplicaciones": [
{ "compra_id": 214, "monto_aplicado": 200.00 },
{ "compra_id": 219, "monto_aplicado": 120.00 }
]
}'Respuesta (201 Created)
{
"id": 41,
"fecha": "2026-07-06T09:30:00",
"proveedor_id": 7,
"medio": "01",
"monto": 320.0,
"referencia": "TRF-55021",
"notas": null,
"cuenta_dinero_id": null,
"cruce_lineas": [],
"monto_anticipo": 0,
"saldo_anticipo": 0,
"anulado": false,
"anulado_motivo": null,
"anulado_en": null,
"creado_en": "2026-07-06T09:30:04",
"aplicaciones": [
{ "id": 61, "compra_id": 214, "liquidacion_id": null, "monto_aplicado": 200.0, "desde_anticipo": false, "fecha_aplicacion": null },
{ "id": 62, "compra_id": 219, "liquidacion_id": null, "monto_aplicado": 120.0, "desde_anticipo": false, "fecha_aplicacion": null }
]
}Errores
| Código | Cuándo ocurre |
|---|---|
400 | fecha futura o en un período contable cerrado; una línea de cruce inválida (ver pagos con cruce). |
404 | El proveedor no existe, o alguna de las compras o liquidaciones referenciadas en aplicaciones no existe, está anulada o es de otro proveedor. |
409 | El monto_aplicado de una línea supera el saldo pendiente de ese documento, o la liquidación no está en un estado que admita pagos. |
422 | El medio no es un código válido de la Tabla 24 SRI; Σ(aplicaciones) supera monto; no hay aplicaciones y monto es 0; una aplicación trae compra y liquidación a la vez (o ninguna); o un cruce que no cumple sus reglas de forma. |
Listar pagos
GET /api/v1/pagos-proveedor?proveedor_id=&desde=&hasta=&limit=&offset= — Listado con filtros opcionales
| Parámetro | Tipo | Descripción |
|---|---|---|
proveedor_id optional | integer | Filtra por proveedor. |
desde optional | date | Fecha inicial (inclusive). |
hasta optional | date | Fecha final (inclusive). |
limit optional | integer | Default 50. |
offset optional | integer | Default 0. |
Obtener un pago
GET /api/v1/pagos-proveedor/{id} — Detalle completo, con sus aplicaciones a compra
Anular un pago
POST /api/v1/pagos-proveedor/{id}/anular — Anula el pago y revierte sus aplicaciones (el saldo de las compras vuelve a subir)
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
motivo required | string | Motivo de la anulación. Máx 300 caracteres. |
fecha optional | date | Fecha del reverso (asiento espejo y movimiento inverso en el banco), YYYY-MM-DD. Si se omite: la del pago si su período sigue abierto; si no, hoy. Dada: no futura, no anterior al pago, en un período abierto y fuera de una conciliación bancaria cerrada (400). |
Cuándo no se puede anular
409, igual
que anular un pago cuyo anticipo ya se aplicó a documentos (primero
deshaz esas aplicaciones) o cuyo egreso del banco
está en una conciliación bancaria cerrada. Si necesitas corregir el monto o
las compras aplicadas, anula y crea un pago nuevo; si solo está mal la
fecha, cámbiala.
Cambiar la fecha de un pago
PATCH /api/v1/pagos-proveedor/{id}/fecha — Corrige la fecha del pago, de su egreso en el banco y de su asiento (sin rehacerlo)
| Parámetro | Tipo | Descripción |
|---|---|---|
fecha required | date | Body. Nueva fecha (YYYY-MM-DD); se conserva la hora original. |
{
"fecha": "2026-09-28T09:30:00",
"asiento_movido": true,
"avisos": []
} asiento_movido indica si el pago tenía asiento y se movió con
él (mismo número). avisos lista efectos colaterales, por
ejemplo que el egreso se desmarcó de una conciliación en curso porque la
nueva fecha quedó después de su corte. Si parte del anticipo ya se aplicó,
el pago no puede quedar después de esa aplicación. Las reglas comunes
están en fechas contables:
400 por fecha inválida, 409 si el pago está
anulado o el cambio toca una conciliación bancaria cerrada.
Pagos con cruce
Un pago con cruce cancela compras o liquidaciones contra una o varias cuentas contables en vez de caja o bancos. Caso típico: la factura del proveedor la pagó una compañía relacionada y el valor se carga a la cuenta por pagar a esa relacionada. No mueve dinero (no toca ninguna cuenta de dinero ni la conciliación bancaria) y genera el asiento Debe cuentas por pagar / Haber las cuentas del cruce.
Forma de cruce[]
| Parámetro | Tipo | Descripción |
|---|---|---|
cuenta_id required | integer | Cuenta contable del plan de la empresa: imputable, activa, que no sea de caja/bancos ni la propia cuenta por pagar a proveedores. |
monto required | number | Mayor que 0. |
tercero_id optional | integer | Persona o empresa del catálogo para el auxiliar de la cuenta (p. ej. la relacionada). |
descripcion optional | string | Máx 200 caracteres. |
Reglas del pago con cruce (si no se cumplen, 422):
mediodebe ser"15"(compensación de deudas) y no se envíacuenta_dinero_id.- Σ
cruce[].montodebe ser exactamente igual amonto, al centavo. - Se aplica completo a documentos:
aplicacionesno puede ir vacío y su Σ debe cuadrar conmonto. Un cruce no deja anticipo.
Una cuenta que no existe en el plan, de agrupación, inactiva, de caja/bancos
o igual a la cuenta por pagar que se cancela responde 400 con
el número de línea. Se anula y se cambia de fecha igual que un pago normal.
curl -X POST https://api.emitoo.io/api/v1/pagos-proveedor \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proveedor_id": 7,
"fecha": "2026-10-06T10:00:00",
"medio": "15",
"monto": 450.00,
"referencia": "Pagada por Relacionada S.A.",
"aplicaciones": [
{ "compra_id": 230, "monto_aplicado": 450.00 }
],
"cruce": [
{ "cuenta_id": 2105, "monto": 450.00, "tercero_id": 31, "descripcion": "CxP a la relacionada" }
]
}'El pago trae las líneas en cruce_lineas:
"cruce_lineas": [
{
"id": 9,
"cuenta_id": 2105,
"cuenta_codigo": "201.03.02",
"cuenta_nombre": "Cuentas por pagar relacionadas",
"monto": 450.0,
"tercero_id": 31,
"tercero_nombre": "RELACIONADA S.A.",
"descripcion": "CxP a la relacionada"
}
]Anticipos a proveedores
Un pago que entrega más de lo que aplica (o que va sin
aplicaciones, antes de recibir la factura) deja la diferencia
como anticipo: monto_anticipo es lo que quedó
sin aplicar al crearlo y saldo_anticipo lo que falta aplicar.
Contablemente es un activo (anticipos a proveedores) hasta que se aplica a
una compra o liquidación del mismo proveedor. Aplicarlo baja el saldo del
documento sin mover dinero y genera su propio asiento con
la fecha de aplicación. Es el espejo de los
anticipos de clientes.
Registrar un anticipo
curl -X POST https://api.emitoo.io/api/v1/pagos-proveedor \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proveedor_id": 7,
"fecha": "2026-10-01T10:00:00",
"medio": "20",
"monto": 800.00,
"referencia": "TRF-7781",
"cuenta_dinero_id": 3,
"aplicaciones": []
}'
Registrar un anticipo emite el evento pago_proveedor.registrado
de siempre; aplicarlo emite compra.pagada (o
liquidacion.pagada) si el documento queda en cero. No hay
eventos propios de anticipos.
Anticipos por aplicar
GET /api/v1/pagos-proveedor/anticipos?proveedor_id= — Pagos no anulados con saldo_anticipo > 0, del más antiguo al más reciente
[
{
"pago_id": 57,
"fecha": "2026-10-01T10:00:00",
"proveedor_id": 7,
"proveedor_nombre": "Distribuidora Andina S.A.",
"referencia": "TRF-7781",
"monto_anticipo": 800.0,
"saldo_anticipo": 500.0
}
]Aplicar un anticipo
POST /api/v1/pagos-proveedor/{id}/aplicar-anticipo — Aplica el anticipo del pago a compras o liquidaciones del mismo proveedor
| Parámetro | Tipo | Descripción |
|---|---|---|
fecha required | date | datetime | Fecha de la aplicación (y de su asiento). No anterior al pago, no futura y en un período abierto. |
aplicaciones required | array | Mínimo 1. Cada una: { compra_id | liquidacion_id, monto_aplicado > 0 }. |
{
"fecha": "2026-10-06",
"aplicaciones": [
{ "compra_id": 241, "monto_aplicado": 300.00 }
]
}
Devuelve el pago con la nueva aplicación (desde_anticipo: true
y su fecha_aplicacion).
| Código | Cuándo ocurre |
|---|---|
400 | fecha futura o en un período cerrado. |
404 | El pago o un documento no existen, están anulados o son de otro proveedor. |
409 | Pago anulado; Σ aplicado supera saldo_anticipo; monto mayor al saldo del documento; liquidación que no admite pagos; fecha anterior a la del pago. |
422 | Una aplicación trae compra y liquidación a la vez, o ninguna; aplicaciones vacío. |
Deshacer una aplicación del anticipo
DELETE /api/v1/pagos-proveedor/{id}/aplicaciones/{aplicacion_id}?fecha= — Devuelve el saldo al documento y al anticipo, y revierte su asiento
Solo para aplicaciones hechas desde el anticipo (409 si la
aplicación se hizo con el pago). fecha (query, opcional) es la
del reverso del asiento; sin ella, la de la aplicación si su período sigue
abierto. Devuelve el pago actualizado.
Agenda de pagos
GET /api/v1/pagos-proveedor/agenda — Compras con saldo pendiente, agrupadas por semana ISO (lunes) de fecha_vencimiento
Cada compra con saldo > 0 se agrupa en la semana (lunes ISO) de su
fecha_vencimiento (o de fecha_emision si no
tiene vencimiento). Útil para planificar los pagos de la semana.
{
"semanas": [
{
"semana": "2026-07-06",
"total": 320.0,
"cantidad": 2,
"compras": [
{
"id": 214,
"numero_doc": "001-001-000000214",
"proveedor_razon_social": "Distribuidora Andina S.A.",
"fecha_vencimiento": "2026-07-08",
"total": 200.0,
"total_pagado": 0,
"saldo": 200.0
},
{
"id": 219,
"numero_doc": "001-002-000000019",
"proveedor_razon_social": "Suministros del Pacífico",
"fecha_vencimiento": "2026-07-10",
"total": 120.0,
"total_pagado": 0,
"saldo": 120.0
}
]
}
],
"total_general": 320.0
}Eventos
Este módulo emite los siguientes eventos:
| Evento | Cuándo se dispara |
|---|---|
pago_proveedor.registrado | Se creó un pago (POST /pagos-proveedor). |
pago_proveedor.anulado | Se anuló un pago (POST /pagos-proveedor/{id}/anular). |
compra.pagada | El saldo de una compra llegó a 0 tras aplicar un pago o un anticipo. |
liquidacion.pagada | El saldo de una liquidación de compra llegó a 0 tras aplicar un pago o un anticipo. |
// POST https://tu-app.com/webhooks/emitoo
// X-Emitoo-Event: pago_proveedor.registrado
{
"evento": "pago_proveedor.registrado",
"data": {
"id": 41,
"proveedor_id": 7,
"medio": "01",
"monto": 320.0,
"referencia": "TRF-55021",
"compras": [214, 219]
}
}Automatiza el pago a proveedores
compra.creada con un
workflow para avisar por email o
WhatsApp cuando llega una compra con vencimiento próximo, usando la
misma agenda que ves en GET /pagos-proveedor/agenda.