Docs / API Reference / Cuentas y bancos
API Reference

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

Todos los endpoints de este recurso requieren el header 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,
});

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
422tipo no es 'caja', 'banco' ni 'tarjeta'.
409cuenta_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

Cambiar 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
400fecha futura o en un período contable cerrado.
404origen_id o destino_id no existen (o no son del tenant).
409Alguna de las dos cuentas está inactiva.
400 / 422origen_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); // Uint8Array

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ódigoCuándo ocurre
400fecha (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.
404La cuenta o la transacción no existen (o no son del tenant).
409Cuenta 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.
422Subtipo 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

Los movimientos manuales solo mueven el saldo de tesorería: no generan asiento. Para gastos o ingresos reales del banco usa egresos e ingresos bancarios; deja los manuales para 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",
});

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
400fecha futura o en un período contable cerrado.
404La cuenta no existe (o no es del tenant).
409La cuenta está inactiva.
422tipo 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 fecha de 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 400 con 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ódigoCuándo ocurre
409Ya 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.
404La cuenta o la conciliación no existen (o no son del tenant).

Importar extractos

Subir el extracto del banco (CSV/Excel) para que el sistema proponga los cruces todavía no está disponible. Mientras tanto puedes hacer el cruce en tu integración y enviar las marcas con PUT …/marcas.