Informes
Los informes devuelven, ya calculadas, las mismas cifras que los informes de la web. Son de solo lectura y se generan en el momento a partir de la contabilidad de la empresa.
El resumen de resultados responde a «cuánto he facturado, cuánto he gastado y cuánto he ganado» en un periodo, separando cada importe por su origen: facturas, gastos, nóminas, amortizaciones, diferencias de cambio y otros. Está disponible en todos los planes y da las mismas cifras que las tarjetas de Ingresos, Gastos y Beneficio del panel.
Para ver qué documentos componen una cifra, el detalle del resumen lista los documentos de una categoría con el importe que aporta cada uno.
Los informes contables (pérdidas y ganancias, balance de situación y sumas y saldos) siguen el modelo oficial del Plan General Contable y necesitan el módulo de Contabilidad, como en la web.
Para totales usa estos informes y no sumes apuntes del diario: los informes aplican las mismas reglas que la web (por ejemplo, excluyen el asiento de regularización), y una suma propia puede no coincidir con lo que ve el usuario.
Estructura del resumen de resultados
La respuesta tiene meta y rows:
Campo | Tipo | Significado |
| string | Siempre |
| string | Moneda de la empresa (ISO 4217). Todos los importes van en ella. |
| object[] | Columnas del informe, ver más abajo. |
| date-time | Momento en que se calculó el informe. |
| object[] | Filas del informe, en orden de presentación. |
Cada fila de rows:
Campo | Tipo | Significado |
| enum | Categoría ( |
| enum |
|
| enum | Solo en las categorías: |
| string | Nombre de la fila en el idioma de la petición. |
| object | Valor de cada columna, por su |
Las filas aparecen en este orden: categorías de ingresos, total de ingresos, categorías de gastos, total de gastos y beneficio. Una categoría solo aparece si tiene importe en alguna columna; los tres totales aparecen siempre.
Los importes son positivos cuando suman a su lado: un ingreso de 100 € vale 100 en ingresos y un gasto de 40 € vale 40 en gastos. El beneficio es el total de ingresos menos el total de gastos.
Columnas
Cada columna de meta.columns tiene un id, que es la clave de values en cada fila, y un kind:
| Campos | Valor en cada fila |
|
| Importe del periodo, con las dos fechas incluidas. |
|
| Importe de |
|
| Variación como fracción: |
Sin opciones de comparativa hay una sola columna, current. Con compare las columnas son current y reference, más difference y variance si se piden. Con breakdown son p0, p1... por orden de fechas, más total si se pide.
Qué importes entran
El resumen suma los apuntes de las cuentas de los grupos 6 (gastos) y 7 (ingresos) del periodo, sin el asiento de regularización de fin de año. Por eso coincide con sumas y saldos de esos grupos y con el resultado de pérdidas y ganancias excluyendo la regularización.
Cada importe va a una categoría:
Las cuentas de diferencias de cambio de la configuración contable (768000 y 668000 por defecto) van a
currencyGainsycurrencyLosses, sea cual sea el documento que las genera.El resto se reparte por el documento que genera el asiento: las facturas de venta en
invoices, los gastos enbillsy las nóminas enpayrolls.Lo que queda del grupo 68 va a
depreciation.Todo lo demás va a
otherIncomeuotherExpenses.
Estructura de los informes contables
Pérdidas y ganancias y el balance de situación tienen meta, rows y diagnostics. meta añade a lo del resumen:
Campo | Tipo | Significado |
| object | Modelo oficial: |
| enum | Nivel de detalle aplicado: |
| object |
|
Cada fila de rows:
Campo | Tipo | Significado |
| string | Identificador estable: el epígrafe del modelo ( |
| string | Fila cuyo total incluye esta. Puede faltar en |
| enum |
|
| integer | Nivel de sangría, el de la web. |
| string | Título en el idioma de la petición. |
| string | Prefijo de cuenta de un grupo. |
| string | Cuenta de una fila de detalle y su título en el plan contable. |
| object | Tercero de una fila de detalle: |
| object | Valor de cada columna por su |
Una fila cuyas columnas son todas cero no aparece, igual que en la web. En el balance, cada columna es de tipo balanceAt: el saldo acumulado a su date. Con revenueShare, pérdidas y ganancias añade columnas shareOfRow con el peso de cada fila sobre el importe neto de la cifra de negocios.
Cada aviso de diagnostics tiene code, severity (info o warning), message en el idioma de la petición y, según el caso, years o accounts. Son los mismos avisos que muestra la web, por ejemplo un ejercicio anterior sin regularizar (previousYearNotClosed) o cuentas con saldo fuera del modelo (unmappedBalances).
Sumas y saldos tiene meta, rows, totals y pagination. Cada fila es un subtotal (group, con accountPrefix), una cuenta (account) o un tercero de una cuenta (thirdParty), con sus importes en amounts: previousBalance, debit, credit y balance. totals es el total del informe completo, no solo de la página.
Operaciones
Obtener el resumen de resultados
GET /{companyId}/reports/resultsSummary
Parámetro | Valores | Por defecto | Significado |
| fecha | año natural en curso | Periodo del informe, con las dos fechas incluidas. Como máximo, 5 años. |
|
|
| Añade un periodo de referencia: el anterior de la misma duración o el mismo periodo del año anterior. |
|
|
| Divide el periodo en meses, trimestres o años naturales, como máximo 24 columnas. |
| booleano |
| Con |
| booleano |
| Con |
| booleano |
| Con |
compare y breakdown no se combinan. difference y variance necesitan compare, y total necesita breakdown. Cualquier combinación no válida responde 400.
Ejemplo: ingresos, gastos y beneficio del año comparados con el anterior
curl "https://app.facturadirecta.com/api/$COMPANY_ID/reports/resultsSummary?startDate=2025-01-01&endDate=2025-12-31&compare=previousYear&difference=true" \ -H "Authorization: Bearer $ACCESS_TOKEN"
{
"meta": {
"report": "resultsSummary",
"currency": "EUR",
"columns": [
{ "id": "current", "kind": "movement", "start": "2025-01-01", "end": "2025-12-31" },
{ "id": "reference", "kind": "movement", "start": "2024-01-01", "end": "2024-12-31" },
{ "id": "difference", "kind": "difference", "current": "current", "reference": "reference" }
],
"generatedAt": "2025-12-31T10:00:00.000Z"
},
"rows": [
{ "id": "invoices", "kind": "category", "side": "income", "title": "Ventas facturadas", "values": { "current": 98000, "reference": 91500, "difference": 6500 } },
{ "id": "currencyGains", "kind": "category", "side": "income", "title": "Diferencias de cambio a favor", "values": { "current": 1200, "reference": 0, "difference": 1200 } },
{ "id": "income", "kind": "total", "title": "Total ingresos", "values": { "current": 99200, "reference": 91500, "difference": 7700 } },
{ "id": "bills", "kind": "category", "side": "expenses", "title": "Compras y gastos", "values": { "current": 41500, "reference": 39000, "difference": 2500 } },
{ "id": "payrolls", "kind": "category", "side": "expenses", "title": "Nóminas", "values": { "current": 22000, "reference": 21000, "difference": 1000 } },
{ "id": "expenses", "kind": "total", "title": "Total gastos", "values": { "current": 63500, "reference": 60000, "difference": 3500 } },
{ "id": "profit", "kind": "total", "title": "Beneficio", "values": { "current": 35700, "reference": 31500, "difference": 4200 } }
]
}
Ejemplo: evolución mensual
curl "https://app.facturadirecta.com/api/$COMPANY_ID/reports/resultsSummary?startDate=2025-01-01&endDate=2025-12-31&breakdown=month&total=true" \ -H "Authorization: Bearer $ACCESS_TOKEN"
Devuelve las columnas p0 (enero) a p11 (diciembre) y total.
Listar los documentos de una categoría
GET /{companyId}/reports/resultsDetail
Parámetro | Valores | Por defecto | Significado |
| una de las categorías | obligatorio | Categoría cuyos documentos se quieren ver. |
| fecha | año natural en curso | Periodo, con las dos fechas incluidas. Como máximo, 5 años. |
| ver Paginación | 25, 0 | Paginación por desplazamiento, hasta 500 por página. |
Con la categoría y las fechas de una columna del resumen, la suma de amount de todas las páginas es el importe de esa celda.
La respuesta tiene meta (con category, side y period), items y pagination. Cada elemento de items:
Campo | Tipo | Significado |
| string | Documento que genera los apuntes ( |
| string | Tipo del documento ( |
| string | Título del documento. |
| date | Fecha del primer apunte del documento en el periodo. |
| number | Importe que el documento aporta a la categoría, con el signo de su lado. |
Los documentos van de más antiguo a más reciente. Con el id puedes abrir el documento en su recurso, por ejemplo GET /{companyId}/invoices/{id}.
Ejemplo
curl "https://app.facturadirecta.com/api/$COMPANY_ID/reports/resultsDetail?category=currencyGains&startDate=2025-01-01&endDate=2025-12-31" \ -H "Authorization: Bearer $ACCESS_TOKEN"
{
"meta": {
"report": "resultsDetail",
"currency": "EUR",
"category": "currencyGains",
"side": "income",
"period": { "start": "2025-01-01", "end": "2025-12-31" },
"generatedAt": "2025-12-31T10:00:00.000Z"
},
"items": [
{ "id": "<id-cobro>", "type": "transaction", "title": "Cobro en dólares", "date": "2025-04-01", "amount": 1200 }
],
"pagination": { "limit": 25, "offset": 0, "total": 1 }
}
Obtener pérdidas y ganancias
GET /{companyId}/reports/profitLoss
Parámetro | Valores | Por defecto | Significado |
| fecha | año natural en curso | Periodo, con las dos fechas incluidas. Como máximo, 5 años. |
| como en el resumen | Mismas opciones de comparativa que el resumen de resultados. | |
| booleano |
| Añade tras cada columna de periodo otra ( |
|
|
| Nivel de detalle: solo epígrafes, con grupos de cuentas o con cada cuenta y tercero. |
| booleano |
| Incluye la regularización y el cierre fechados el último día del periodo. |
| booleano |
| Excluye la regularización de ingresos y gastos en todo el periodo. |
| texto, repetible | Solo los apuntes de documentos con todas estas etiquetas. |
Ejemplo
curl "https://app.facturadirecta.com/api/$COMPANY_ID/reports/profitLoss?startDate=2025-01-01&endDate=2025-12-31&detail=summary&compare=previousYear" \ -H "Authorization: Bearer $ACCESS_TOKEN"
{
"meta": {
"report": "profitLoss",
"template": { "id": "profitLoss", "variant": "pyme", "version": 1 },
"currency": "EUR",
"detail": "summary",
"policies": { "includeClosure": false, "excludeRevenueClearing": false },
"columns": [
{ "id": "current", "kind": "movement", "start": "2025-01-01", "end": "2025-12-31" },
{ "id": "reference", "kind": "movement", "start": "2024-01-01", "end": "2024-12-31" }
],
"generatedAt": "2025-12-31T10:00:00.000Z"
},
"rows": [
{ "id": "A_1", "parentId": "A", "kind": "accounts", "level": 2, "title": "1. Importe neto de la cifra de negocios", "values": { "current": 98000, "reference": 91500 } },
{ "id": "A_4", "parentId": "A", "kind": "accounts", "level": 2, "title": "4. Aprovisionamientos", "values": { "current": -41500, "reference": -39000 } },
{ "id": "A", "parentId": "C", "kind": "sum", "level": 1, "title": "A) RESULTADO DE EXPLOTACIÓN ( 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 )", "values": { "current": 56500, "reference": 52500 } },
{ "id": "D", "kind": "sum", "level": 1, "title": "D) RESULTADO DEL EJERCICIO (C + 17)", "values": { "current": 56500, "reference": 52500 } }
],
"diagnostics": []
}
Los gastos aparecen en negativo, con el signo de presentación del modelo oficial.
Obtener el balance de situación
GET /{companyId}/reports/balanceSheet
Parámetro | Valores | Por defecto | Significado |
| fecha | 31 de diciembre del año en curso | Fecha del saldo. |
| fecha | 1 de enero del año de | Inicio del periodo para |
|
|
| Saldo al final del periodo anterior (el día antes de |
|
|
| Saldo al final de cada mes, trimestre o año del periodo, como máximo 24 columnas. |
| booleano |
| Con |
|
|
| Nivel de detalle, como en pérdidas y ganancias. |
| booleano |
| Incluye la regularización y el cierre fechados en la fecha del saldo. |
| texto, repetible | Solo los apuntes de documentos con todas estas etiquetas. |
El saldo de cada columna suma todos los apuntes hasta su fecha. El resultado del ejercicio se calcula desde la cuenta de pérdidas y ganancias, aunque el año no esté regularizado. Si el activo no coincide con el patrimonio neto y el pasivo, aparece la fila imbalance con la diferencia y el aviso imbalance.
Con detail=full el informe resuelve el tercero de todos los documentos de la historia, y en empresas con mucho volumen puede tardar varios segundos.
Obtener sumas y saldos
GET /{companyId}/reports/trialBalance
Parámetro | Valores | Por defecto | Significado |
| fecha | año natural en curso | Periodo. El saldo anterior es todo lo anterior a |
| cuenta o prefijo |
| |
|
| Añade subtotales por los primeros dígitos de la cuenta. | |
| id de contacto, producto o banco | Solo los apuntes de ese tercero, con el criterio del balance. | |
| booleano |
| Añade bajo cada cuenta una fila por tercero. Necesita |
| booleano |
| Separa cada cuenta por moneda, con los importes en la moneda original en |
| booleano |
| Omite las filas con saldo final cero. |
| booleano |
| Como en pérdidas y ganancias. |
| texto, repetible | Solo los apuntes de documentos con todas estas etiquetas. | |
| ver Paginación | 25, 0 | La paginación se aplica a las filas ya agrupadas. |
thirdPartyDetail necesita thirdParty porque el detalle por tercero de una cuenta entera, como la de clientes, puede tardar decenas de segundos en empresas con miles de clientes.
Ejemplo: saldo de un cliente
curl "https://app.facturadirecta.com/api/$COMPANY_ID/reports/trialBalance?startDate=2025-01-01&endDate=2025-12-31&account=430&thirdParty=<id-contacto>&thirdPartyDetail=true" \ -H "Authorization: Bearer $ACCESS_TOKEN"
{
"meta": {
"report": "trialBalance",
"currency": "EUR",
"period": { "start": "2025-01-01", "end": "2025-12-31" },
"groups": [],
"thirdPartyDetail": true,
"policies": { "includeClosure": false, "excludeRevenueClearing": false },
"generatedAt": "2025-12-31T10:00:00.000Z"
},
"rows": [
{ "id": "430000", "kind": "account", "level": 0, "title": "430000 Clientes", "account": "430000", "accountTitle": "Clientes", "amounts": { "previousBalance": 0, "debit": 1210, "credit": 0, "balance": 1210 } },
{ "id": "430000/<id-contacto>", "kind": "thirdParty", "level": 1, "title": "Cliente Uno", "account": "430000", "accountTitle": "Clientes", "thirdParty": { "id": "<id-contacto>", "type": "contact", "name": "Cliente Uno" }, "amounts": { "previousBalance": 0, "debit": 1210, "credit": 0, "balance": 1210 } }
],
"totals": { "previousBalance": 0, "debit": 1210, "credit": 0, "balance": 1210 },
"pagination": { "limit": 25, "offset": 0, "total": 2 }
}
Permisos
Todas las operaciones necesitan el scope accounting:read, el mismo que el diario: los informes muestran el beneficio y el gasto en nóminas de la empresa.
Pérdidas y ganancias, el balance de situación y sumas y saldos necesitan además el módulo de Contabilidad. Sin él responden 403 con plan_limit_exceeded y hint.features: ["fullAccounting"], sin enviar ningún aviso a los administradores (ver Errores). Una aplicación conectada puede saber de antemano si una empresa lo tiene con accountingModule en el perfil.
Errores comunes
400 Bad Request: fechas no válidas, también las que no existen como2026-02-30(nunca se sustituyen por el periodo por defecto),startDateposterior a la fecha final, un periodo de más de 5 años,compareybreakdowna la vez,difference,varianceototalsin la opción que necesitan, más de 24 columnas othirdPartyDetailsinthirdParty.403 Forbidden: la credencial no tiene el scopeaccounting:read, o la empresa no tiene el módulo de Contabilidad (plan_limit_exceeded).422 Unprocessable Entity(report_query_timeout): el informe ha tardado demasiado. Acota el periodo, el nivel de detalle o las columnas.
Endpoints
Método | Path | operationId | Scopes | Descripción |
GET |
|
|
| Balance de situación |
GET |
|
|
| Pérdidas y ganancias |
GET |
|
|
| Detalle del resumen de resultados |
GET |
|
|
| Resumen de resultados |
GET |
|
|
| Sumas y saldos |
Scopes
accounting:read— Lectura de datos de contabilidad (diario).