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.

Para rankings, totales y comparativas a medida (los cinco mejores clientes, el gasto por proveedor, las provincias que más facturan frente al año pasado) usa la consulta analítica: agrupa facturas, compras, contactos o apuntes por la dimensión que elijas, con las mismas cifras que los listados.

Estructura del resumen de resultados

La respuesta tiene meta y rows:

CampoTipoSignificado
meta.reportstringSiempre resultsSummary.
meta.currencystringMoneda de la empresa (ISO 4217). Todos los importes van en ella.
meta.columnsobject[]Columnas del informe, ver más abajo.
meta.generatedAtdate-timeMomento en que se calculó el informe.
rowsobject[]Filas del informe, en orden de presentación.

Cada fila de rows:

CampoTipoSignificado
idenumCategoría (invoices, currencyGains, otherIncome, bills, payrolls, depreciation, currencyLosses, otherExpenses) o total (income, expenses, profit).
kindenumcategory o total.
sideenumSolo en las categorías: income (ingresos) o expenses (gastos).
titlestringNombre de la fila en el idioma de la petición.
valuesobjectValor de cada columna, por su id.

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:

kindCamposValor en cada fila
movementstart, endImporte del periodo, con las dos fechas incluidas.
differencecurrent, referenceImporte de current menos el de reference.
varianceRatiocurrent, referenceVariación como fracción: 0.2 es un 20 %. Vale null si la referencia es cero.

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:

  1. Las cuentas de diferencias de cambio de la configuración contable (768000 y 668000 por defecto) van a currencyGains y currencyLosses, sea cual sea el documento que las genera.
  2. El resto se reparte por el documento que genera el asiento: las facturas de venta en invoices, los gastos en bills y las nóminas en payrolls.
  3. Lo que queda del grupo 68 va a depreciation.
  4. Todo lo demás va a otherIncome u otherExpenses.

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:

CampoTipoSignificado
meta.templateobjectModelo oficial: id, variant (pyme, o pymesfl para entidades sin fines lucrativos, según la empresa) y version.
meta.detailenumNivel de detalle aplicado: summary, accounts o full.
meta.policiesobjectincludeClosure, excludeRevenueClearing (solo pérdidas y ganancias) y tags, si se filtró por etiquetas.

Cada fila de rows:

CampoTipoSignificado
idstringIdentificador estable: el epígrafe del modelo (A_1, PC_2_3…). Un grupo añade su prefijo de cuenta (A_1/700) y una fila de detalle, su cuenta y tercero (A_1/700/700000/con_…).
parentIdstringFila cuyo total incluye esta. Puede faltar en rows si todas sus columnas son cero.
kindenumaccounts o sum (epígrafes), group (grupo de cuentas), detail (cuenta y tercero), unregularizedResult (resultado aún sin regularizar, en el balance) o imbalance (descuadre del balance).
levelintegerNivel de sangría, el de la web.
titlestringTítulo en el idioma de la petición.
accountPrefixstringPrefijo de cuenta de un grupo.
account, accountTitlestringCuenta de una fila de detalle y su título en el plan contable.
thirdPartyobjectTercero de una fila de detalle: id, type y name.
valuesobjectValor de cada columna por su id.

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ámetroValoresPor defectoSignificado
startDate, endDatefecha YYYY-MM-DDaño natural en cursoPeriodo del informe, con las dos fechas incluidas. Como máximo, 5 años.
comparenone, previousPeriod, previousYearnoneAñade un periodo de referencia: el anterior de la misma duración o el mismo periodo del año anterior.
breakdownnone, month, quarter, yearnoneDivide el periodo en meses, trimestres o años naturales, como máximo 24 columnas.
differencebooleanofalseCon compare, añade la columna difference.
variancebooleanofalseCon compare, añade la columna variance.
totalbooleanofalseCon breakdown, añade la columna total con el periodo completo.

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

shell
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"
json
{
  "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

shell
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ámetroValoresPor defectoSignificado
categoryuna de las categoríasobligatorioCategoría cuyos documentos se quieren ver.
startDate, endDatefecha YYYY-MM-DDaño natural en cursoPeriodo, con las dos fechas incluidas. Como máximo, 5 años.
limit, offsetver Paginación25, 0Paginació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:

CampoTipoSignificado
idstringDocumento que genera los apuntes (inv_…, bil_…, par_…, tra_…).
typestringTipo del documento (invoice, bill, payroll, transaction…), o null si no se reconoce.
titlestringTítulo del documento.
datedateFecha del primer apunte del documento en el periodo.
amountnumberImporte 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

shell
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"
json
{
  "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ámetroValoresPor defectoSignificado
startDate, endDatefecha YYYY-MM-DDaño natural en cursoPeriodo, con las dos fechas incluidas. Como máximo, 5 años.
compare, breakdown, difference, variance, totalcomo en el resumenMismas opciones de comparativa que el resumen de resultados.
revenueSharebooleanofalseAñade tras cada columna de periodo otra (<id>_share) con el peso de cada fila sobre la cifra de negocios.
detailsummary, accounts, fullaccountsNivel de detalle: solo epígrafes, con grupos de cuentas o con cada cuenta y tercero.
includeClosurebooleanofalseIncluye la regularización y el cierre fechados el último día del periodo.
excludeRevenueClearingbooleanofalseExcluye la regularización de ingresos y gastos en todo el periodo.
allTheseTagstexto, repetibleSolo los apuntes de documentos con todas estas etiquetas.

Ejemplo

shell
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"
json
{
  "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ámetroValoresPor defectoSignificado
datefecha YYYY-MM-DD31 de diciembre del año en cursoFecha del saldo.
startDatefecha YYYY-MM-DD1 de enero del año de dateInicio del periodo para breakdown y compare=previousPeriod. Como máximo, 5 años antes de date.
comparenone, previousPeriod, previousYearnoneSaldo al final del periodo anterior (el día antes de startDate) o en la misma fecha del año anterior.
breakdownnone, month, quarter, yearnoneSaldo al final de cada mes, trimestre o año del periodo, como máximo 24 columnas.
difference, variancebooleanofalseCon compare, añaden la diferencia y la variación.
detailsummary, accounts, fullaccountsNivel de detalle, como en pérdidas y ganancias.
includeClosurebooleanofalseIncluye la regularización y el cierre fechados en la fecha del saldo.
allTheseTagstexto, repetibleSolo 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ámetroValoresPor defectoSignificado
startDate, endDatefecha YYYY-MM-DDaño natural en cursoPeriodo. El saldo anterior es todo lo anterior a startDate, con el asiento de apertura de ese día.
accountcuenta o prefijo43 incluye todas las cuentas de clientes y 430000 solo esa cuenta.
groups1, 2, 3, repetibleAñade subtotales por los primeros dígitos de la cuenta.
thirdPartyid de contacto, producto o bancoSolo los apuntes de ese tercero, con el criterio del balance.
thirdPartyDetailbooleanofalseAñade bajo cada cuenta una fila por tercero. Necesita thirdParty.
showCurrencybooleanofalseSepara cada cuenta por moneda, con los importes en la moneda original en currencyAmounts.
excludeBalance0booleanofalseOmite las filas con saldo final cero.
includeClosure, excludeRevenueClearingbooleanofalseComo en pérdidas y ganancias.
allTheseTagstexto, repetibleSolo los apuntes de documentos con todas estas etiquetas.
limit, offsetver Paginación25, 0La paginación se aplica a las filas ya agrupadas.

Para el saldo contable de un banco no hace falta este informe: GET /{companyId}/banks/{id}?related=balance lo da con el mismo criterio (y con balanceDate, a una fecha), en todos los planes y con el scope banks:read. Ver Bancos.

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

shell
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"
json
{
  "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 como 2026-02-30 (nunca se sustituyen por el periodo por defecto), startDate posterior a la fecha final, un periodo de más de 5 años, compare y breakdown a la vez, difference, variance o total sin la opción que necesitan, más de 24 columnas o thirdPartyDetail sin thirdParty.
  • 403 Forbidden: la credencial no tiene el scope accounting: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étodoPathoperationIdScopesDescripción
GET/{companyId}/reports/balanceSheetgetBalanceSheetaccounting:readBalance de situación
GET/{companyId}/reports/profitLossgetProfitLossaccounting:readPérdidas y ganancias
GET/{companyId}/reports/resultsDetailgetResultsDetailaccounting:readDetalle del resumen de resultados
GET/{companyId}/reports/resultsSummarygetResultsSummaryaccounting:readResumen de resultados
GET/{companyId}/reports/trialBalancegetTrialBalanceaccounting:readSumas y saldos

Scopes

  • accounting:read — Lectura de datos de contabilidad (diario).

Empieza gratis y factura con flow

Únete a los más de 90.000 negocios que ya gestionan sus facturas de forma rápida y sencilla con FacturaDirecta
Empieza Gratis

Fácil de usar · Sin permanencia · Sin tarjeta de crédito