Cuentas y bancos
Administra tus cajas, cuentas bancarias y tarjetas (CuentaDinero).
El saldo no se guarda: se calcula siempre como
saldo_inicial + Σ movimientos. Los movimientos nacen de:
egresos e ingresos bancarios (con asiento
contable), ajustes manuales, transferencias internas entre dos cuentas, y
automáticamente cuando registras un cobro, un
pago a proveedor, un pago de nómina o
la venta directa de un activo con cuenta_dinero_id. Cada cuenta
tiene su libro con saldo acumulado y se puede
conciliar contra el extracto del banco.
Autenticación
X-API-Key con una API key que tenga permisos sobre el
recurso cuentas_dinero. 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).
Listar cuentas
GET /api/v1/cuentas-dinero?incluir_inactivas= — Lista las cuentas de dinero del tenant, con su saldo_actual calculado
| Parámetro | Tipo | Descripción |
|---|---|---|
incluir_inactivas optional | boolean | Si es true, incluye también las cuentas dadas de baja (activo=false). Default false. |
[
{
"id": 1,
"nombre": "Caja chica",
"tipo": "caja",
"banco": null,
"numero_mascarado": null,
"saldo_inicial": 100.0,
"activo": true,
"creado_en": "2026-01-10T08:00:00",
"saldo_actual": 62.5
},
{
"id": 3,
"nombre": "Banco Pichincha corriente",
"tipo": "banco",
"banco": "Banco Pichincha",
"numero_mascarado": "****4321",
"saldo_inicial": 500.0,
"activo": true,
"creado_en": "2026-01-15T09:00:00",
"saldo_actual": 1280.5
}
]Crear una cuenta
POST /api/v1/cuentas-dinero — Crea una caja, cuenta bancaria o tarjeta
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
nombre required | string | Nombre de la cuenta. Máx 120 caracteres. |
tipo required | string | 'caja', 'banco' o 'tarjeta'. |
banco optional | string | Nombre del banco emisor. Máx 120 caracteres. |
numero_mascarado optional | string | Número de cuenta/tarjeta enmascarado (ej. '****4321'). Máx 30 caracteres. |
saldo_inicial optional | number | Saldo con el que arranca la cuenta antes de cualquier movimiento. Default 0. |
cuenta_contable_id optional | integer | Cuenta contable propia (activo o pasivo, imputable) donde se asientan sus cobros, pagos y egresos. Vacía = cuenta general de caja (101.01.01) o bancos (101.01.03). |
La respuesta incluye además cuenta_contable_efectiva_id /
_codigo (la cuenta contable que realmente se usa: la propia o la
general) y saldo_contable (saldo del mayor de su cuenta propia;
null sin cuenta propia o sin contabilidad activa), útil para
detectar descuadres entre tesorería y contabilidad.
import { Emitoo } from "emitoo";
const client = new Emitoo(); // lee la API key de EMITOO_API_KEY
const cuenta = await client.cuentasDinero.crear({
nombre: "Banco Pichincha corriente",
tipo: "banco",
banco: "Banco Pichincha",
numero_mascarado: "****4321",
saldo_inicial: 500.0,
});from emitoo import EmitooClient
client = EmitooClient() # lee la API key de EMITOO_API_KEY
cuenta = client.cuentas_dinero.crear({
"nombre": "Banco Pichincha corriente",
"tipo": "banco",
"banco": "Banco Pichincha",
"numero_mascarado": "****4321",
"saldo_inicial": 500.00,
})client, err := emitoo.New("") // lee la API key de EMITOO_API_KEY
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
cuenta, err := client.CuentasDinero.Crear(ctx, emitoo.M{
"nombre": "Banco Pichincha corriente",
"tipo": "banco",
"banco": "Banco Pichincha",
"numero_mascarado": "****4321",
"saldo_inicial": 500.0,
})
if err != nil {
log.Fatal(err)
}curl -X POST https://api.emitoo.io/api/v1/cuentas-dinero \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"nombre": "Banco Pichincha corriente",
"tipo": "banco",
"banco": "Banco Pichincha",
"numero_mascarado": "****4321",
"saldo_inicial": 500.00
}'Respuesta (201 Created)
{
"id": 3,
"nombre": "Banco Pichincha corriente",
"tipo": "banco",
"banco": "Banco Pichincha",
"numero_mascarado": "****4321",
"saldo_inicial": 500.0,
"activo": true,
"creado_en": "2026-01-15T09:00:00",
"saldo_actual": 1280.5,
"cuenta_contable_id": 1134,
"cuenta_contable_codigo": "101.01.04",
"cuenta_contable_nombre": "Banco Pichincha",
"saldo_contable": 1280.5,
"cuenta_contable_efectiva_id": 1134,
"cuenta_contable_efectiva_codigo": "101.01.04"
}Errores
| Código | Cuándo ocurre |
|---|---|
422 | tipo no es 'caja', 'banco' ni 'tarjeta'. |
409 | cuenta_contable_id no es una cuenta de activo o pasivo, imputable y activa, del tenant. |
Obtener una cuenta
GET /api/v1/cuentas-dinero/{id} — Detalle de una cuenta, con su saldo_actual calculado
Actualizar una cuenta
PATCH /api/v1/cuentas-dinero/{id} — Actualiza campos de la cuenta (parcial)
| Parámetro | Tipo | Descripción |
|---|---|---|
nombre optional | string | Nuevo nombre. |
tipo optional | string | 'caja', 'banco' o 'tarjeta'. |
banco optional | string | Nombre del banco emisor. |
numero_mascarado optional | string | Número enmascarado. |
saldo_inicial optional | number | Redefine el punto de partida del saldo calculado. No reescribe movimientos ya registrados: para corregir el saldo actual sin tocar el histórico, registra un movimiento de ajuste en su lugar. |
activo optional | boolean | false = baja lógica (equivalente a DELETE). true = reactiva una cuenta dada de baja. |
cuenta_contable_id optional | integer | Cuenta contable propia. null explícito la quita; omitir el campo la conserva. |
Cambiar saldo_inicial de una cuenta que ya tiene
conciliaciones bancarias cerradas responde 409 (reescribiría
saldos ya conciliados).
saldo_inicial no es un ajuste de saldo
saldo_inicial desplaza el saldo calculado de TODA la
vida de la cuenta (pasado incluido), porque saldo_actual =
saldo_inicial + Σ movimientos. Si lo que quieres es corregir el
saldo actual en una fecha puntual, usa
POST /cuentas-dinero/{id}/movimientos con
ajuste_ingreso o ajuste_egreso.
Desactivar una cuenta
DELETE /api/v1/cuentas-dinero/{id} — Baja lógica (activo=false). No borra la cuenta ni su historial de movimientos
Responde 204 No Content. Una cuenta inactiva no admite
movimientos nuevos ni transferencias (409); para volver a
usarla, reactívala con PATCH y { "activo": true }.
Transferencias entre cuentas
POST /api/v1/cuentas-dinero/transferencias — Mueve dinero entre dos cuentas propias: crea dos movimientos enlazados en una sola transacción
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
origen_id required | integer | Cuenta de la que sale el dinero. |
destino_id required | integer | Cuenta a la que entra el dinero. Debe ser distinta de origen_id. |
monto required | number | Monto a transferir. Mayor que 0. |
fecha required | datetime | Fecha del movimiento (ISO 8601). No futura ni en un período contable cerrado (400). |
descripcion optional | string | Nota libre. Máx 300 caracteres. Se copia en ambos movimientos. |
Crea un movimiento transferencia_out en origen_id
y uno transferencia_in en destino_id, con
origen_tipo="transferencia" y origen_id apuntando
al id del movimiento espejo (así puedes reconstruir el par desde
cualquiera de los dos lados).
Respuesta (200 OK)
Un arreglo de los dos movimientos creados: [movimiento_out, movimiento_in].
[
{
"id": 160,
"cuenta_id": 3,
"fecha": "2026-07-06T10:00:00",
"tipo": "transferencia_out",
"monto": 200.0,
"origen_tipo": "transferencia",
"origen_id": 161,
"descripcion": "Traspaso a caja chica",
"conciliado": false,
"creado_en": "2026-07-06T10:00:01"
},
{
"id": 161,
"cuenta_id": 1,
"fecha": "2026-07-06T10:00:00",
"tipo": "transferencia_in",
"monto": 200.0,
"origen_tipo": "transferencia",
"origen_id": 160,
"descripcion": "Traspaso a caja chica",
"conciliado": false,
"creado_en": "2026-07-06T10:00:01"
}
]Errores
| Código | Cuándo ocurre |
|---|---|
400 | fecha futura o en un período contable cerrado. |
404 | origen_id o destino_id no existen (o no son del tenant). |
409 | Alguna de las dos cuentas está inactiva. |
400 / 422 | origen_id es igual a destino_id. |
Con contabilidad activa, la transferencia genera su asiento (Debe la cuenta contable del destino / Haber la del origen). Si ambas cuentas caen en la misma cuenta contable, no hay nada que asentar.
Anular una transferencia
POST /api/v1/cuentas-dinero/transferencias/{movimiento_id}/anular — Revierte la transferencia en ambas cuentas (y su asiento, si lo hay)
| Parámetro | Tipo | Descripción |
|---|---|---|
movimiento_id required | integer | Id de cualquiera de los dos movimientos de la transferencia (path). |
motivo required | string | Body. Entre 1 y 300 caracteres. |
fecha optional | date | Body. Fecha del reverso (YYYY-MM-DD). Si se omite: la de la transferencia si su período sigue abierto; si no, hoy. Ver fechas contables. |
Marca los dos movimientos originales con anulado_en /
anulado_motivo y crea dos ajustes con la fecha del reverso:
ajuste_ingreso en el origen y ajuste_egreso en el
destino. Responde el arreglo de esos dos ajustes. 400 si la
fecha no es válida; 409 si ya estaba anulada o si
alguno de los movimientos está en una conciliación bancaria cerrada.
Cambiar la fecha de una transferencia
PATCH /api/v1/cuentas-dinero/transferencias/{movimiento_id}/fecha — Mueve de día sus dos movimientos y su asiento. Body { fecha }
movimiento_id es cualquiera de los dos movimientos. Responde
como los demás cambios de fecha (ver fechas
contables); 409 si la transferencia está anulada.
Egresos e ingresos bancarios
Para lo que sale o entra del banco sin un comprobante de venta: comisiones, notas de débito/crédito bancarias, débitos automáticos, retiros, cheques, intereses. Cada transacción mueve la cuenta y, con contabilidad activa, genera el asiento contra las cuentas contables de sus líneas. Si el banco emitió factura (por ejemplo una comisión con IVA), regístrala como compra y págala con un pago desde la cuenta.
POST /api/v1/cuentas-dinero/{id}/transacciones — Registra un egreso o ingreso bancario directo (numeración EGR-000001 / ING-000001)
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
tipo required | string | 'egreso' o 'ingreso'. |
subtipo required | string | Egreso: nota_debito, transferencia, cheque, debito_automatico, retiro, otro. Ingreso: nota_credito, deposito, transferencia, intereses, otro. |
fecha required | datetime | ISO 8601. Una fecha sin hora se guarda a las 00:00 (hora de Ecuador). No futura ni en un período contable cerrado (400). |
persona_id optional | integer | Beneficiario u ordenante (del catálogo de personas/empresas). |
referencia optional | string | N° de transacción, nota o cheque. |
descripcion optional | string | Máx 300 caracteres. |
lineas required | array | Mínimo 1. Ver forma abajo. |
conciliacion_id optional | integer | Conciliación en curso de la misma cuenta: el movimiento nace marcado en ella (la fecha debe ser ≤ su fecha de corte). |
Forma de lineas[]
| Parámetro | Tipo | Descripción |
|---|---|---|
cuenta_id optional | integer | Cuenta contable imputable. Obligatoria con contabilidad activa; no puede ser la propia cuenta contable del banco. |
monto required | number | Mayor que 0. |
descripcion optional | string | Detalle de la línea. |
deducible optional | boolean | Solo cuenta en cuentas de gasto/costo (en las demás se fuerza true). Las líneas no deducibles se precargan en la conciliación tributaria del formulario 101 con la causal 'sin comprobante válido'. |
ambito optional | string | 'local' (casillero 806, default) o 'exterior' (807), para las no deducibles. |
contrario optional | boolean | true = la línea va al otro lado del asiento y RESTA del movimiento del banco. Default false. En una línea contraria se ignoran deducible y ambito. |
Líneas que restan del total
Sirven para registrar en un solo documento lo que el banco liquida neto:
intereses de una póliza con su retención, un desembolso de préstamo neto
de comisión, vouchers de tarjeta netos de comisión y retenciones. El total
de la transacción (lo que entra o sale del banco) es Σ líneas normales −
Σ líneas con contrario: true, y debe ser mayor a 0
(409 si no). En la respuesta, monto siempre viene
positivo y contrario dice el lado. Ejemplo: intereses de 100
con retención de 2; al banco entran 98.
{
"tipo": "ingreso",
"subtipo": "intereses",
"fecha": "2026-09-30",
"referencia": "Póliza 4471",
"lineas": [
{ "cuenta_id": 4120, "monto": 100.00, "descripcion": "Intereses ganados" },
{ "cuenta_id": 1150, "monto": 2.00, "descripcion": "Retención en la fuente 2%", "contrario": true }
]
}const egreso = await client.cuentasDinero.crearTransaccion(3, {
tipo: "egreso",
subtipo: "nota_debito",
fecha: "2026-09-05T09:00:00",
referencia: "ND-889",
descripcion: "Comisión transferencia interbancaria",
lineas: [{ cuenta_id: 1402, monto: 2.5, deducible: false, ambito: "local" }],
});
const pdf = await client.cuentasDinero.transaccionPdf(egreso.id); // Uint8Arrayegreso = client.cuentas_dinero.crear_transaccion(3, {
"tipo": "egreso",
"subtipo": "nota_debito",
"fecha": "2026-09-05T09:00:00",
"referencia": "ND-889",
"descripcion": "Comisión transferencia interbancaria",
"lineas": [{"cuenta_id": 1402, "monto": 2.50, "deducible": False, "ambito": "local"}],
})
pdf = client.cuentas_dinero.transaccion_pdf(egreso["id"]) # bytesegreso, err := client.CuentasDinero.CrearTransaccion(ctx, 3, emitoo.M{
"tipo": "egreso",
"subtipo": "nota_debito",
"fecha": "2026-09-05T09:00:00",
"referencia": "ND-889",
"descripcion": "Comisión transferencia interbancaria",
"lineas": []emitoo.M{
{"cuenta_id": 1402, "monto": 2.5, "deducible": false, "ambito": "local"},
},
})
if err != nil {
log.Fatal(err)
}curl -X POST https://api.emitoo.io/api/v1/cuentas-dinero/3/transacciones \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tipo": "egreso",
"subtipo": "nota_debito",
"fecha": "2026-09-05T09:00:00",
"referencia": "ND-889",
"descripcion": "Comisión transferencia interbancaria",
"lineas": [
{ "cuenta_id": 1402, "monto": 2.50, "deducible": false, "ambito": "local" }
]
}'Respuesta (201 Created)
{
"id": 5,
"numero_comprobante": "EGR-000001",
"tipo": "egreso",
"subtipo": "nota_debito",
"fecha": "2026-09-05T09:00:00",
"cuenta_dinero_id": 3,
"cuenta_dinero_nombre": "Banco Pichincha corriente",
"persona_id": null,
"persona_nombre": null,
"referencia": "ND-889",
"descripcion": "Comisión transferencia interbancaria",
"total": 2.5,
"estado": "activo",
"anulado_motivo": null,
"anulado_en": null,
"creado_por": "api-key:ERP",
"creado_en": "2026-09-05T09:00:02",
"asiento_id": 991,
"conciliado": false,
"lineas": [
{
"id": 1,
"cuenta_id": 1402,
"cuenta_codigo": "502.01.05",
"cuenta_nombre": "Comisiones bancarias",
"cuenta_tipo": "gasto",
"descripcion": null,
"monto": 2.5,
"deducible": false,
"ambito": "local",
"contrario": false
}
]
}Listar, detalle, anular y PDF
GET /api/v1/cuentas-dinero/transacciones?cuenta_id=&tipo=&desde=&hasta=&limit=&offset= — Listado (limit entre 1 y 500)
GET /api/v1/cuentas-dinero/transacciones/{id} — Detalle con sus líneas
POST /api/v1/cuentas-dinero/transacciones/{id}/anular — Body { motivo, fecha? }. Devuelve el dinero con un ajuste y revierte el asiento
PATCH /api/v1/cuentas-dinero/transacciones/{id}/fecha — Body { fecha }. Mueve de día la transacción, su movimiento y su asiento; conserva el número EGR/ING
GET /api/v1/cuentas-dinero/transacciones/{id}/pdf — Comprobante de egreso/ingreso (application/pdf)
En la anulación, fecha (opcional, YYYY-MM-DD) es la del
reverso; si se omite, la de la transacción si su período sigue abierto y,
si no, hoy. Reglas de ambas fechas en fechas
contables.
Errores
| Código | Cuándo ocurre |
|---|---|
400 | fecha (al registrar, anular o cambiarla) futura, anterior a la transacción en una anulación, en un período cerrado o, en una anulación, dentro de una conciliación bancaria cerrada. |
404 | La cuenta o la transacción no existen (o no son del tenant). |
409 | Cuenta de línea inválida o igual a la del banco, cuenta de dinero inactiva, persona de otra empresa, total (normales − contrarias) ≤ 0, anulación repetida, cambio de fecha de una transacción anulada, movimiento en una conciliación cerrada, o conciliacion_id que no es una conciliación en curso de esa cuenta. |
422 | Subtipo que no corresponde al tipo, monto ≤ 0, lineas vacío, tipo o ambito inválidos. |
Libro de la cuenta
GET /api/v1/cuentas-dinero/{id}/libro?desde=&hasta= — Movimientos en orden cronológico con saldo acumulado y el documento de origen
Sin fechas devuelve los últimos 90 días. saldo_anterior es el
saldo al empezar el rango. Cada fila trae documento con
tipo (cobro, pago_proveedor,
transaccion_bancaria, transferencia,
manual, nomina, activo_fijo u
otro), su id (en una transferencia, el id de la
otra cuenta), una etiqueta legible y estado
(activo/anulado en transacciones bancarias y
transferencias). 422 si desde > hasta.
{
"cuenta": { "id": 3, "nombre": "Banco Pichincha corriente", "...": "..." },
"desde": "2026-06-17",
"hasta": "2026-09-15",
"saldo_anterior": 1000.0,
"total_ingresos": 1500.0,
"total_egresos": 149.5,
"saldo_final": 2350.5,
"contabilidad_activa": true,
"filas": [
{
"id": 12,
"fecha": "2026-09-05T09:00:00",
"tipo": "egreso",
"ingreso": 0,
"egreso": 2.5,
"saldo": 2497.5,
"descripcion": "Comisión transferencia interbancaria",
"conciliado": false,
"origen_tipo": "transaccion_bancaria",
"origen_id": 5,
"documento": { "tipo": "transaccion_bancaria", "id": 5, "etiqueta": "Egreso EGR-000001", "estado": "activo" }
}
]
}Movimientos de una cuenta
GET /api/v1/cuentas-dinero/{id}/movimientos?desde=&hasta=&tipo=&limit=&offset= — Historial de movimientos de una cuenta, más reciente primero
| Parámetro | Tipo | Descripción |
|---|---|---|
desde optional | date | Fecha inicial (inclusive). |
hasta optional | date | Fecha final (inclusive). |
tipo optional | string | Filtra por un tipo exacto: ingreso, egreso, transferencia_in, transferencia_out, ajuste_ingreso o ajuste_egreso. |
limit optional | integer | Default 100. |
offset optional | integer | Default 0. |
Cada movimiento trae origen_tipo (cobro,
pago_proveedor, manual,
transferencia, transaccion_bancaria,
nomina o activo_fijo) y origen_id
(el id del documento; en una transferencia, el del movimiento espejo; en
nómina, el del asiento del pago) para que puedas reconstruir de dónde vino
cada línea. conciliacion_id indica la conciliación bancaria
que lo marcó y conciliado es true cuando esa
conciliación está cerrada. anulado_en /
anulado_motivo se llenan en transferencias anuladas. Para una
vista con saldo acumulado usa el libro.
Registrar un movimiento manual
POST /api/v1/cuentas-dinero/{id}/movimientos — Registra un ingreso, egreso o ajuste manual (no ligado a un cobro/pago/transferencia)
Sin asiento contable
ajuste_ingreso / ajuste_egreso
(diferencias de arranque, redondeos).
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
tipo required | string | Solo 'ingreso', 'egreso', 'ajuste_ingreso' o 'ajuste_egreso'. 'transferencia_in'/'transferencia_out' están reservados a POST /transferencias. |
monto required | number | Mayor que 0. |
fecha required | datetime | Fecha del movimiento (ISO 8601). No futura ni en un período contable cerrado (400). |
descripcion optional | string | Nota libre. Máx 300 caracteres. |
import { Emitoo } from "emitoo";
const client = new Emitoo(); // lee la API key de EMITOO_API_KEY
const movimiento = await client.cuentasDinero.crearMovimiento(3, {
tipo: "egreso",
monto: 45.0,
fecha: new Date().toISOString(),
descripcion: "Compra de suministros de oficina",
});from emitoo import EmitooClient
client = EmitooClient() # lee la API key de EMITOO_API_KEY
movimiento = client.cuentas_dinero.crear_movimiento(3, {
"tipo": "egreso",
"monto": 45.00,
"fecha": "2026-07-06T09:30:00",
"descripcion": "Compra de suministros de oficina",
})client, err := emitoo.New("") // lee la API key de EMITOO_API_KEY
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
movimiento, err := client.CuentasDinero.CrearMovimiento(ctx, 3, emitoo.M{
"tipo": "egreso",
"monto": 45.0,
"fecha": time.Now().Format(time.RFC3339),
"descripcion": "Compra de suministros de oficina",
})
if err != nil {
log.Fatal(err)
}curl -X POST https://api.emitoo.io/api/v1/cuentas-dinero/3/movimientos \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tipo": "egreso",
"monto": 45.00,
"fecha": "2026-07-06T09:30:00",
"descripcion": "Compra de suministros de oficina"
}'Respuesta (201 Created)
{
"id": 152,
"cuenta_id": 3,
"fecha": "2026-07-06T09:30:00",
"tipo": "egreso",
"monto": 45.0,
"origen_tipo": "manual",
"origen_id": null,
"descripcion": "Compra de suministros de oficina",
"conciliado": false,
"creado_en": "2026-07-06T09:30:04"
}Errores
| Código | Cuándo ocurre |
|---|---|
400 | fecha futura o en un período contable cerrado. |
404 | La cuenta no existe (o no es del tenant). |
409 | La cuenta está inactiva. |
422 | tipo no es uno de los 4 valores permitidos para movimiento manual. |
Cambiar la fecha de un movimiento manual
PATCH /api/v1/cuentas-dinero/movimientos/{movimiento_id}/fecha — Body { fecha }. Solo movimientos manuales
Solo para movimientos con origen_tipo="manual"
(404 para los demás): la fecha de un cobro, pago, transacción
o transferencia se cambia desde ese documento, para que su asiento se
mueva con él. Reglas en fechas contables.
Movimientos automáticos desde cobros y pagos
No hay un endpoint separado para esto: POST /cobros y
POST /pagos-proveedor aceptan un cuenta_dinero_id
opcional. Si lo mandas, el backend crea el movimiento (ingreso
para un cobro, egreso para un pago) en la misma
transacción que el cobro/pago, con origen_tipo igual
a "cobro" o "pago_proveedor" y
origen_id apuntando al id del cobro/pago que lo generó. Si
omites cuenta_dinero_id, el cobro/pago se registra igual,
simplemente sin tocar ninguna cuenta de dinero.
{
"id": 153,
"cuenta_id": 3,
"fecha": "2026-07-06T15:00:00",
"tipo": "ingreso",
"monto": 150.0,
"origen_tipo": "cobro",
"origen_id": 88,
"descripcion": null,
"conciliado": false,
"creado_en": "2026-07-06T15:00:03"
}
Lo mismo pasa con el pago del rol, de décimos y de vacaciones en nómina
(origen_tipo="nomina") y con la venta directa de un activo
fijo (origen_tipo="activo_fijo") cuando mandas
cuenta_dinero_id.
Los eventos relevantes para engancharte vía webhook son los del propio
cobro/pago — cobro.registrado y
pago_proveedor.registrado (documentados en
Cobros y
Pagos a proveedores).
Las transacciones bancarias, transferencias y conciliaciones todavía no
emiten eventos de webhook propios: si los necesitas, consulta el
libro o el listado de transacciones.
Fechas contables
Lo que se registra hoy suele haber pasado días atrás, así que toda operación de tesorería que registra o revierte algo en libros acepta una fecha y se puede corregir después. Las mismas reglas aplican en cobros, pagos a proveedores, transacciones bancarias, transferencias, movimientos manuales y en la anulación de compras.
Reglas
- Nunca futura (hora de Ecuador).
- Nunca en un período contable cerrado (solo aplica si la empresa lleva contabilidad). Al cambiar una fecha, también el período de la fecha actual debe estar abierto.
- Un reverso nunca antes del documento que revierte: la
fechade una anulación no puede ser anterior a la del cobro, pago, transacción, transferencia o compra. - Sin
fecha, una anulación usa la del documento si su período sigue abierto; si no, hoy. - Una fecha inválida responde
400con el motivo en español.
Cambiar la fecha de un registro
PATCH /api/v1/cobros/{id}/fecha — Cobro, su ingreso y su asiento
PATCH /api/v1/pagos-proveedor/{id}/fecha — Pago, su egreso y su asiento
PATCH /api/v1/cuentas-dinero/transacciones/{id}/fecha — Transacción bancaria, su movimiento y su asiento
PATCH /api/v1/cuentas-dinero/transferencias/{movimiento_id}/fecha — Los dos movimientos de la transferencia y su asiento
PATCH /api/v1/cuentas-dinero/movimientos/{movimiento_id}/fecha — Movimiento manual (sin asiento)
Body { "fecha": "YYYY-MM-DD" }. Se conserva la hora
original. El asiento se mueve sin rehacerse (mismo número
y líneas), por eso no puede cambiar de año: para eso anula y registra de
nuevo. Requiere permiso de edición (can_put) sobre el recurso.
{
"fecha": "2026-09-28T09:00:00",
"asiento_movido": true,
"avisos": [
"El movimiento quedó después del corte de la conciliación en borrador al 27/09/2026: se desmarcó de ella."
]
}| Parámetro | Tipo | Descripción |
|---|---|---|
fecha required | datetime | Fecha que quedó en el registro. |
asiento_movido required | boolean | true si el documento tenía asiento y se movió con él. |
avisos required | string[] | Efectos colaterales: p. ej. el movimiento se desmarcó de una conciliación en curso porque la nueva fecha quedó después de su corte. |
Conciliaciones bancarias cerradas
Un movimiento que está en una conciliación cerrada no cambia de fecha
(409), y tampoco uno cuyo cambio pase al otro lado del corte
de una conciliación cerrada: cambiaría su saldo según libros. En una
anulación, una fecha que cae dentro de una conciliación
cerrada responde 400; sin fecha, el reverso se
hace con la fecha de hoy. Reabre la conciliación si de verdad hace falta.
Conciliación bancaria
Compara los movimientos de una cuenta con el extracto del banco a una
fecha de corte. Marcas los movimientos que aparecen en el extracto; los
que quedan sin marcar son partidas en tránsito. Se cierra solo cuando
diferencia = saldo_libros − (saldo_extracto + depositos_en_transito −
cheques_en_transito) es 0. Los movimientos de una conciliación
cerrada quedan bloqueados: anular su cobro, pago,
transacción o transferencia, o cambiarle la fecha, responde
409 hasta reabrirla.
GET /api/v1/cuentas-dinero/{id}/conciliaciones — Historial de la cuenta, más reciente primero (resumen)
POST /api/v1/cuentas-dinero/{id}/conciliaciones — Inicia una conciliación: { fecha_corte, saldo_extracto, observaciones? }
GET /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id} — Detalle con el cuadre y los movimientos candidatos
PATCH /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id} — Cambia fecha_corte, saldo_extracto u observaciones (solo en curso)
PUT /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id}/marcas — { movimiento_ids: [..], marcado: true|false } — marca o desmarca en lote
POST /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id}/cerrar — Cierra si la diferencia es 0
POST /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id}/reabrir — Reabre la última conciliación cerrada de la cuenta
DELETE /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id} — Descarta una conciliación en curso (204)
GET /api/v1/cuentas-dinero/conciliaciones/{conciliacion_id}/pdf — Reporte de conciliación (application/pdf)
# 1) Iniciar
curl -X POST https://api.emitoo.io/api/v1/cuentas-dinero/3/conciliaciones \
-H "X-API-Key: $EMITOO_API_KEY" -H "Content-Type: application/json" \
-d '{ "fecha_corte": "2026-08-31", "saldo_extracto": 2500.00 }'
# 2) Marcar lo que aparece en el extracto
curl -X PUT https://api.emitoo.io/api/v1/cuentas-dinero/conciliaciones/10/marcas \
-H "X-API-Key: $EMITOO_API_KEY" -H "Content-Type: application/json" \
-d '{ "movimiento_ids": [11, 15], "marcado": true }'
# 3) Cerrar (409 si la diferencia no es 0)
curl -X POST https://api.emitoo.io/api/v1/cuentas-dinero/conciliaciones/10/cerrar \
-H "X-API-Key: $EMITOO_API_KEY"Respuesta
{
"id": 10,
"cuenta_dinero_id": 3,
"cuenta_dinero_nombre": "Banco Pichincha corriente",
"fecha_corte": "2026-08-31",
"saldo_extracto": 2500.0,
"observaciones": "Extracto de agosto",
"estado": "borrador",
"saldo_libros": 2033.0,
"total_marcado_ingresos": 1500.0,
"total_marcado_egresos": 0,
"depositos_en_transito": 0,
"cheques_en_transito": 467.0,
"saldo_ajustado": 2033.0,
"diferencia": 0,
"puede_cerrar": true,
"es_ultima_cerrada": false,
"creado_por": "api-key:ERP",
"creado_en": "2026-09-10T10:00:00",
"cerrado_por": null,
"cerrado_en": null,
"movimientos": [
{
"id": 11,
"fecha": "2026-08-02T09:00:00",
"tipo": "ingreso",
"ingreso": 1500.0,
"egreso": 0,
"descripcion": "Cobro factura",
"referencia": "TRF-9981",
"documento": { "tipo": "cobro", "id": 7, "etiqueta": "Cobro · Factura 001-001-000000123", "estado": null },
"marcado": true
}
]
}Reglas y errores
| Código | Cuándo ocurre |
|---|---|
409 | Ya hay una conciliación en curso para la cuenta; fecha_corte futura o no posterior a la última cerrada; cuenta inactiva; marcar un movimiento que no es candidato; editar, marcar o descartar una cerrada; cerrar con diferencia; reabrir una que no es la última cerrada o con otra en curso. |
404 | La cuenta o la conciliación no existen (o no son del tenant). |
Importar extractos
PUT …/marcas.