Bancos y cuentas de tesorería
Un banco (bank) en FacturaDirecta es una cuenta de tesorería de la empresa: una cuenta corriente con IBAN, una cuenta de tarjeta o una caja en efectivo. Los bancos son las contrapartidas naturales de los cobros y pagos, y son lo que se concilia contra los extractos bancarios.
En los ejemplos, ban_… son ilustrativos. El ID real se devuelve al consultar la API.
Los bancos no se crean por API
Este recurso es solo lectura. La API pública no expone crear, modificar ni borrar bancos: ese flujo vive solo en la interfaz, donde se configura la conexión automática con el banco, los datos de SEPA y demás detalles operativos. La API expone los datos necesarios para integraciones (registrar pagos contra una cuenta, mostrar listado al usuario) y, con el parámetro related, el saldo contable, el saldo según la entidad, el estado del enlace y los movimientos pendientes de conciliar: lo mismo que muestra la pantalla de bancos de la aplicación.
Estructura
Cada item del listado tiene la forma { uuid, content, creationDate, modificationDate }. El contenido principal está en content.main:
Campo | Tipo | Significado |
| string | Nombre de la cuenta. |
| string | Título descriptivo (opcional). |
| string | Notas internas de la cuenta, si están informadas en la interfaz. |
| enum |
|
| string | Moneda (ISO 4217). |
| string | Cuenta contable del banco en el plan contable. |
| string | Últimos 4 dígitos del IBAN, prefijados por |
| string | IBAN completo. Solo si |
| string | BIC/SWIFT (si está informado). |
| string | Código de banco usado en exportaciones a contabilidad externa (A3). |
No hay tags sobre bancos. A diferencia del resto de documentos, el item devuelto no incluye el campo tags.
Saldos y estado del enlace: el parámetro related
El listado y el detalle aceptan related, repetible, con estos valores. Cada uno añade una clave bajo related en el item; sin el parámetro, la respuesta no lleva related.
Valor | Clave | Qué devuelve |
|
| Saldo contable del banco. |
|
| Saldo según la entidad enlazada, o |
|
| Estado de la conexión automática con el banco. |
|
| Movimientos pendientes de conciliar y fecha del último. |
Todos los importes de related son positivos cuando hay dinero en el banco, igual que amount en los extractos.
Los dos saldos
Un banco tiene dos saldos distintos, y conviene no confundirlos:
related.balance, el saldo contable: la suma de los apuntes de la cuenta contable del banco (account) cuyo tercero es el banco. Es el saldo de FacturaDirecta: el de la pantalla de bancos, el del panel de inicio y el de sumas y saldos. Está en todos los planes. Para sincronizarlo en un ERP o cuadrar la contabilidad, este es el dato.related.linkedBalance, el saldo según la entidad: el que el banco informó en el último movimiento sincronizado o importado. Es un dato informativo que depende de hasta dónde ha sincronizado el proveedor: cambia con cada sincronización (cada 12 horas, o cuando un usuario la pide desde la aplicación) y puede ir por detrás del banco real. Por eso lleva la fecha y el id del movimiento del que sale y la fecha de la última sincronización correcta: con ellos tu integración decide si le sirve.
La diferencia entre los dos suele ser lo que falta por conciliar: related.statements.pending dice cuántos movimientos son.
related.balance:
Campo | Tipo | Significado |
| number | Saldo en la moneda de la empresa. Suma todos los apuntes del banco, en cualquier moneda, por su importe convertido. |
| string | Moneda del banco (ISO 4217). |
| number | Saldo en la moneda del banco. Suma solo los apuntes en esa moneda, por su importe en divisa. En un banco en la moneda de la empresa coincide con |
| date | Fecha del último apunte que mueve el saldo, o |
| date | Fecha de corte. Solo cuando se pasa |
Sin balanceDate, el saldo incluye todos los apuntes, también los de fecha futura: es el mismo número que enseña la pantalla de bancos. Con balanceDate=YYYY-MM-DD es el saldo al cierre de ese día (apuntes con fecha hasta ese día inclusive), y latestEntryDate es la del último apunte dentro del corte. balanceDate solo tiene efecto con related=balance.
related.linkedBalance (o null si no hay saldo de la entidad: banco sin movimientos, movimientos importados sin saldo, o banco stripe):
Campo | Tipo | Significado |
| number | Saldo disponible que informó la entidad tras el movimiento. |
| number | Saldo contable que informó la entidad, cuando difiere del disponible. |
| string | Moneda del saldo (ISO 4217). |
| date | Fecha del movimiento del que sale el saldo. |
| string | Id del movimiento del que sale el saldo ( |
| date-time | Última sincronización correcta con el proveedor. |
El saldo es el del último movimiento con fecha hasta hoy, esté o no conciliado o ignorado: es el último dato que dio la entidad.
related.link:
Campo | Tipo | Significado |
| enum |
|
| string | Nombre de la entidad según la conexión. |
| date | Hasta cuándo autorizó el usuario el acceso a los datos (PSD2). |
| boolean | Si el enlace sincroniza movimientos automáticamente. |
| boolean | Si la sincronización está detenida porque el usuario debe hacer algo en la aplicación (volver a autorizar el acceso, confirmar un código…). |
| string | Motivo por el que está detenida, tal como lo ve el usuario. |
| date-time | Último intento de sincronización. |
| boolean | Si el último intento acabó bien. |
status solo no dice si el banco sincroniza: un banco de Stripe es linked en cuanto tiene la cuenta conectada para cobrar, aunque no sincronice movimientos. Mira syncEnabled. related.link nunca incluye credenciales ni referencias de cuenta del proveedor.
related.statements:
Campo | Tipo | Significado |
| integer | Movimientos pendientes de conciliar. Quedan fuera los ignorados y los borrados; un movimiento cuyo asiento se ha borrado vuelve a contar como pendiente. |
| date | Fecha del último movimiento del banco con fecha hasta hoy. |
Son solo contadores y fechas: el listado de movimientos está en GET /{companyId}/statements?bank={id}.
Acceso al IBAN: dos scopes
Los IBAN son datos sensibles. La API segrega el acceso en dos niveles:
banks:read— siempre presente para listar bancos. Devuelve todos los campos exceptoiban. Eliban4(últimos 4 dígitos enmascarados) sí se devuelve.banks:readIban— scope adicional para ver el IBAN completo. Sin él,ibanse omite del objeto.
Para integraciones que solo necesitan identificar la cuenta (UI de selección, conciliación contra banco), basta con banks:read. Pide banks:readIban solo si tu integración realmente necesita el IBAN completo (por ejemplo, generación de remesas SEPA externas).
Este patrón de doble scope se aplica también en los métodos de pago (allí se enmascara el IBAN del deudor del SEPA Direct Debit por la misma razón).
Enlace a la aplicación
Las respuestas que devuelven un banco incluyen webUrl junto al resto de los datos. En los listados, cada elemento de items lleva su propio enlace.
webUrl abre la ficha del elemento en la aplicación web de FacturaDirecta. Puedes mostrarlo como enlace en tu integración sin construir rutas internas. El navegador pedirá iniciar sesión con un usuario que tenga acceso a la empresa. Es un campo opcional y no es un endpoint de la API: trátalo como una URL para el usuario, no como una URL a la que enviar $ACCESS_TOKEN.
Operaciones
Lista de bancos
GET /{companyId}/banks devuelve los bancos activos de la empresa.
Parámetros de consulta específicos:
currency— filtrar por moneda (ISO 4217, exacto).related— datos adicionales de cada banco:balance,linkedBalance,link,statements(repetible). Ver Saldos y estado del enlace.balanceDate— fecha de corte del saldo contable (YYYY-MM-DD). Solo conrelated=balance.sortBy— campo de orden. Valores aceptados:title,currency,creationDate,modificationDate(cada uno con su variante descendente-title...).
Parámetros globales aceptados:
Acepta además los parámetros estándar offset, limit, minCreationDate, maxCreationDate, minModificationDate, maxModificationDate y el header accept-version. Ver Paginación y Autenticación.
Notas:
El listado excluye los bancos borrados: solo aparecen las cuentas activas de la empresa.
El orden por defecto es por número total de comentarios y luego por fecha de creación descendente. Si tu integración depende del orden, indícalo explícitamente con
sortBy.
Copy as cURL
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://app.facturadirecta.com/api/$COMPANY_ID/banks?currency=EUR&sortBy=title"
Respuesta típica (sin scope banks:readIban):
{
"pagination": { "offset": 0, "limit": 100, "total": 2 },
"items": [
{
"uuid": "ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d",
"content": {
"type": "bank",
"uuid": "ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d",
"main": {
"name": "Cuenta principal",
"subtype": "iban",
"currency": "EUR",
"notes": "Cuenta para cobros principales",
"account": "572000",
"iban4": "****1234",
"bic": "BSCHESMMXXX"
}
},
"creationDate": "2024-01-15T08:00:00.000Z",
"modificationDate": "2024-01-15T08:00:00.000Z"
}
]
}
Con related cada item añade los bloques pedidos:
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://app.facturadirecta.com/api/$COMPANY_ID/banks?related=balance&related=statements"
Obtener un banco
GET /{companyId}/banks/{id} devuelve un banco activo, con la misma forma que cada item del listado ({ uuid, content, creationDate, modificationDate, webUrl }) y los mismos scopes. Acepta related y balanceDate.
Copy as cURL
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://app.facturadirecta.com/api/$COMPANY_ID/banks/ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d?related=balance&related=linkedBalance&related=link&related=statements"
Respuesta típica de un banco enlazado por PSD2:
{
"uuid": "ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d",
"content": {
"type": "bank",
"uuid": "ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d",
"main": {
"name": "Cuenta principal",
"subtype": "iban",
"currency": "EUR",
"account": "572000",
"iban4": "****1234",
"bic": "BSCHESMMXXX"
}
},
"creationDate": "2024-01-15T08:00:00.000Z",
"modificationDate": "2026-09-02T10:21:00.000Z",
"webUrl": "https://3.facturadirecta.com/company/com_…/banks/ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d",
"related": {
"balance": {
"balance": 12345.67,
"currency": "EUR",
"currencyBalance": 12345.67,
"latestEntryDate": "2026-10-15"
},
"linkedBalance": {
"balance": 12400.12,
"bookedBalance": null,
"currency": "EUR",
"date": "2026-10-15",
"statement": "sta_8c1f2b7e-3d4a-4e5f-9a6b-7c8d9e0f1a2b",
"syncedAt": "2026-10-16T06:12:41.000Z"
},
"link": {
"status": "linked",
"bankName": "Banco Santander",
"accessValidUntil": "2026-12-01",
"syncEnabled": true,
"actionRequired": false,
"message": null,
"lastSyncAt": "2026-10-16T06:12:41.000Z",
"lastSyncOk": true
},
"statements": { "pending": 3, "latestDate": "2026-10-15" }
}
}
Los 54,45 € de diferencia entre los dos saldos son los tres movimientos pendientes de conciliar: cuando se concilien, el saldo contable coincidirá con el de la entidad.
Para el saldo contable a una fecha (por ejemplo, al cierre de un mes):
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \ "https://app.facturadirecta.com/api/$COMPANY_ID/banks/ban_5e7d8a31-9c4b-4f6e-a1d3-2b5c7e9f1a4d?related=balance&balanceDate=2026-09-30"
related.balance lleva entonces "date": "2026-09-30" y solo suma los apuntes con fecha hasta ese día. El mismo saldo, con el detalle de cada cuenta, lo da sumas y saldos con thirdParty y account, pero ese informe exige el módulo de Contabilidad y el scope accounting:read; related=balance está en todos los planes.
Recomendaciones
Para el saldo de un banco usa
related=balanceen el detalle o en el listado. No sumes los apuntes deGET /journalni construyas el saldo a partir de los extractos: es el mismo número que ve el usuario en la pantalla de bancos, calculado con el mismo criterio.No uses
linkedBalancecomo saldo contable. Es el último dato que dio la entidad, con fecha; sirve para mostrar «saldo en el banco» o para detectar que la sincronización va atrasada (syncedAt), no para cuadrar la contabilidad.Cachea el listado. Las cuentas cambian con muy baja frecuencia; no hace falta consultar el endpoint en cada operación. Refresca el cache cuando una creación de cobro/pago falle con
400porbankdesconocido (alguien puede haber borrado o añadido cuentas desde la interfaz).Para mostrar al usuario, usa
name(otitlesi está informado) eiban4. No pidasbanks:readIbansolo para mostrar la cuenta: coniban4ya tienes los últimos 4 dígitos.Para registrar pagos (
POST /bills/{id}/paymentsoPOST /payrolls/{id}/payments), basta con eluuiddel banco.
Versiones
GET /{companyId}/banks/{id}/versions lista las versiones de el banco: su alta, cada modificación, su eliminación y su recuperación, con quién y cuándo, aunque se haya eliminado. GET /{companyId}/banks/{id}/versions/{versionId} devuelve la copia de una versión, en el mismo formato que el listado GET /{companyId}/banks, y los cambios respecto a la versión anterior. Sirven para ver qué se cambió y recuperar datos: ver Versiones de documentos.
Errores comunes
El listado no devuelve
404: si no hay bancos, recibirásitems: [].404 Not FoundenGET /banks/{id}— el banco no existe o está borrado.400 Bad Request— un valor derelatedque no existe, o unbalanceDateque no es una fechaYYYY-MM-DD.403 Forbidden(code: "forbidden") — falta el scopebanks:read.
Ver Errores y validaciones para el formato general.
Referencia exhaustiva
Esta página cubre los matices funcionales. Para el contrato completo del schema (incluyendo los oneOf por subtype), consulta el Swagger UI o el openapi crudo.
Endpoints
Método | Path | operationId | Scopes | Descripción |
GET |
|
|
| Lista de bancos |
GET |
|
|
| Obtener un banco |
GET |
|
|
| Versiones de el banco |
GET |
|
|
| Versión de el banco |
Scopes
banks:read— Lectura de bancos y cuentas de tesorería, sus saldos y el estado de su enlace.