GET only. Pass the entity id as a UUID path parameter. Responses are bare JSON with no wrapper. Paginated endpoints return { rows, nextCursor }.
All amounts are integers in the minor unit of the currency (for example, cents). Dates are YYYY-MM-DD strings. Where a report accepts presentationCurrency and presentationRate, the two must be supplied together, and every amount in the response is then expressed in the presentation currency.
Entities with Books. Every report on this page reads one Book. When the Entity has at least one Book, pass the
bookId query parameter on every request; the server answers BOOK_REQUIRED_ERROR (400) without it. When the Entity has no Book, omit bookId.The Fiscal Year in reports
Each Entity has a Fiscal Year: the twelve months over which it measures its result. It starts on day 1 of the Entity’sfiscalYearStartMonth, January unless you set another month. For example, with a start month of 7, the Fiscal Year that holds 2026-03-15 runs from 2025-07-01 to 2026-06-30.
Every balance a report reads before a date follows one carry rule:
- Result accounts (
income,cost_of_goods_sold,operating_expense,other_income,other_expense) carry only their lines of the current Fiscal Year. They open at0on the first day of each Fiscal Year. - The retained earnings account carries its own lines plus the result of every closed Fiscal Year. Mark one equity account of the Entity with the
retained_earningssub-type. - Any other account carries every line before the date.
equity.priorPeriodResult, and the eight-column balance shows it as unclosedPriorResult. The app labels it Resultados anteriores pendientes de cierre. Both are 0 once you mark the account.
A report that walks a running balance reads one Fiscal Year: the eight-column balance, the general ledger, the general ledger of every account, and the partner ledger of a result account. A window that crosses a Fiscal Year start returns 400 with LEDGER_WINDOW_CROSSES_FISCAL_YEAR_ERROR. params.fiscalYearStart is the start of the Fiscal Year that holds the window’s start, so you can pick dates inside it:
Entity reports
Base path:GET /api/entities/:entityId/reports
Home dashboard
GET /api/entities/:entityId/reports/home
Returns the home dashboard snapshot: cash position, daily balances for the last 60 days, monthly income for the last 6 months, receivables/payables open positions, and unbooked invoice counts.
Query params
Response
Open positions (receivables and payables)
GET /api/entities/:entityId/reports/open-positions
Returns open items grouped by ledger account for one invoice direction: receivables (accounts tracking money owed to the entity) or payables (accounts tracking money the entity owes). Use it to build a receivables or payables aging view, drill into a specific account’s open lines, or filter down to one partner.
The response always lists every matching account with its open totals. Pass expandedAccountId to also load the individual open lines for one account; each account expands independently, and pagination applies only to the expanded account’s lines.
Query params
Each direction lists the open-item accounts of the sub-types it accepts, the same ones an Invoice of that direction accepts as its control account:
So Por pagar shows what the Entity owes its suppliers and what it owes people on approved Expense Claims. A Rendición por pagar line names the person as its partner, so
partnerId gives what is owed to one person.
invoiceDirection replaces the subtype query param.
Each item in
accounts extends the Ledger Account with:
Each item in
lines extends the ledger entry line with:
Payables to plan
GET /api/entities/:entityId/reports/payables-to-plan
Returns the purchase invoices the Entity still has to plan a payment for: every payable Invoice of kind invoice whose Amount to Plan is above zero. Use it to pick the invoices of a Payment Batch. Invoices excluded from the books never appear.
Query params
The report takes the same filters as the purchases listing, GET /invoices/pages, except the booking status. Every filter is optional, and every bound is inclusive. Any other param is refused with 400. The report takes no bookId, so a bookId is refused too.
Unlike
GET /invoices/pages, a due-date bound here keeps the invoices with no due date.Balance sheet
GET /api/entities/:entityId/reports/balance-sheet
Returns the balance sheet on one date. The report reads the Fiscal Year that holds cutoffDate, from its first day to cutoffDate.
Query params
Response
Each item in an
accounts array, in code order:
Income statement
GET /api/entities/:entityId/reports/income-statement
Returns the income statement for the requested date range.
Each account carries its result month by month in amounts. To read the lines behind one amount, call Income statement lines for that account and month.
Pass dimensionId to split each account by the values of one Dimension, for example to see an income account per country or per business line. Each item of amounts then covers one month and one value of the Dimension, named in dimensionValueId, and the response lists every value of the Dimension so you can group the amounts yourself. The account totals don’t change.
Pass budgetId to compare the actual results against a Budget. Each account then carries the months the Budget plans for it in budgetAmounts, and the response names the Budget in budget.
Query params
Response
Each item in
accounts:
Each item in
amounts:
amount covers only the lines between from and to: with from=2027-03-15, the March amount adds up the lines from March 15 on. A month with no lines has no item. With presentationCurrency, each line converts on its own before it adds up, so a monthly amount always equals the sum of the lines Income statement lines returns for that month.
To total an account for the period, add up all its amounts. To total it by value, add up its amounts per dimensionValueId. To total a parent value, also add the amounts of every value under it, following parentId. Amounts with a null dimensionValueId make up the untagged remainder, so the values plus the remainder always add up to the account.
amounts replaces the lines array each account used to carry. To read the lines, call Income statement lines.budgetAmounts covers a whole calendar month, given by its first day in month. Every month the range overlaps counts whole: with from=2027-03-15, March is still included in full. Like amounts, amount is in the presentation currency, and it reads on the account’s normal side, so a planned cost is positive.
To compare an account for a period, total its amounts to get the actual, and total its budgetAmounts for the months of the period to get the plan. The variance is actual minus plan. For an income account a positive variance is a better result; for a cost or expense account a negative variance is.
Income statement lines
GET /api/entities/:entityId/reports/income-statement/lines
Returns the lines behind one figure of the income statement: the lines of one result account between two dates. To explain one monthly amount, pass the account and that month’s first and last days. To explain a whole column of a quarter or a year, pass that period instead.
Query params
Response
Each item in
lines:
Add up the lines on the account’s normal side, a line on the other side counting negative, to get the income statement’s amount for the same account and period. To keep the lines of one Dimension value, keep the lines with that
dimensionValueId.
Income statement by dimension
GET /api/entities/:entityId/reports/income-statement-by-dimension
Returns the income statement broken down by the values of a single dimension (for example, a cost center). The Dimension belongs to the Entity’s Organization: the report lists every value of that Dimension, and adds up only this Entity’s lines.
Query params
Response
Each item in
dimensionValues. A positive amount is a profit.
Cash flow statement
GET /api/entities/:entityId/reports/cash-flow
Returns the cash flow statement for the period, prepared with the direct method. It reads the entries that post to a Cash Account, a Ledger Account with the sub-type cash, and classifies the cash they move into operating, investing, and financing activities. Pass groupBy to also get one statement per month, quarter, or year.
Each entry’s cash lands on the entry’s other accounts, classified by their cash flow category:
- A transfer between two Cash Accounts moves no flow.
- A line on an
internal_transferaccount counts as cash in transit (cashInTransit): cash that left one of your accounts and hasn’t reached the other yet. - A payment or collection allocated to an Invoice follows the Allocation to the Invoice. Its amount is spread pro rata over the Invoice’s lines, and the tax lines are absorbed into the other lines. For example, a supplier payment for a fixed asset bought on credit counts as
fixed_assets, notsupplier_payments. - A line on the Suspense Account, or on an account with no category and no default, lands in
unclassified. Set acashFlowCategoryon the account to move it into an activity.
Response
A positive amount is cash in; a negative amount is cash out. Every statement satisfies
closingCash = openingCash + netChange + fxEffect + cashInTransit, and closingCash equals the balance of the Cash Accounts at its cutoffDate.
Each item in
categories is { category, total, accounts }. Every category of the activity is listed, in the order below, even at zero:
Each item in an
accounts array is { accountId, code, name, amount }, in code order. An account whose flows net to zero is left out.
Each item in periods has the same fields as the statement, without functionalCurrency and periods. The first and last periods are clipped to the requested range. Each period opens with the closingCash of the period before it, and the top-level fields always cover the whole range.
Cash flow statement entries
GET /api/entities/:entityId/reports/cash-flow/entries
Returns the entries behind one line of the cash flow statement. To explain the figure of one period, pass that period’s exerciseStart and cutoffDate.
Query params
Response
An entry that lands on several accounts of the line appears once per account.
Journal report
GET /api/entities/:entityId/reports/journal
Returns a paginated journal of ledger entry lines in chronological order. Each row contains the line, its parent entry, and the account it posts to.
Query params
Response
Each item in
rows:
Revenue realization
GET /api/entities/:entityId/reports/revenue-realization
Returns a revenue realization report for the requested period, showing recognized revenue, collected amounts, billed outstanding, and monthly breakdowns. To read the revenue entries behind the figures, call Revenue realization entries.
Query params
Response
Amount fields present on every item of
months and on total, and on every item of entries in Revenue realization entries:
entryCount replaces the entries array the report used to carry. To read the entries, call Revenue realization entries.Revenue realization entries
GET /api/entities/:entityId/reports/revenue-realization/entries
Returns the revenue entries behind the revenue realization report. It takes the same query params as the report. To explain one month, pass that month’s first and last days as from and to.
With presentationCurrency, each entry converts once, and the report’s months and total add up the converted entries, so the entries of a month always add up to that month of the report.
Response
Customer status
Follow each customer: what you sold them, what you billed, what they paid, and what is still pending. In the app this is Reportes → Gestión de clientes. Use the list to find the customers who owe you, then read one customer’s detail to see the months and the documents behind each amount. Amounts follow the revenue realization cohort. Each amount sits in the month the revenue was recognized, and its payment state is as of today (paymentStateDate). Revenue recognized after today isn’t counted yet. All amounts are in the Entity’s functional currency.
Amount fields present on total, on every customer row, and on every item of months:
List every customer
GET /api/entities/:entityId/reports/customer-status
Returns one page of customers, one row each, sorted by pending, highest first. Customers with the same pending are sorted by name, and the row with no Partner comes last. Revenue booked with no Partner comes back as one row with partnerId: null.
The list is paginated. To read every customer, pass the nextCursor of each response as cursor until nextCursor is null. Keep from, to, search, onlyPending, and bookId the same on every page.
Query params
A
cursor that isn’t a nextCursor value, or a limit above 50, returns 400.
Response
Read one customer
GET /api/entities/:entityId/reports/customer-status/:partnerId
Returns one customer’s amounts by month, the revenue entries behind them, and the documents of the period: receivable Invoices, accruals on unbilled receivable accounts, and Bank Movements. An unknown partnerId returns 404 with PARTNER_NOT_FOUND_ERROR.
Query params: from, to, and bookId, as in the list.
Response
Each item in
invoices:
Each item in
unbilledReceivableLines:
Each item in
movements:
A Movement belongs to the customer when the customer is its own Partner, or when the entry that books it has a receivable or unbilled receivable line with the customer. A customer’s payment booked against their receivable shows here even when the Movement itself has no Partner.
Ledger reports
Base path:GET /api/entities/:entityId/ledger
Eight-column balance
GET /api/entities/:entityId/ledger/reports/eight-column-balance
Returns the classic eight-column trial balance: debit, credit, debtor balance, creditor balance, asset, liability, loss, and profit per account.
The window must sit inside one Fiscal Year; one that crosses a Fiscal Year start returns 400 with LEDGER_WINDOW_CROSSES_FISCAL_YEAR_ERROR. Each account’s debit or credit adds what the account carries into exerciseStart, on its own side, as an opening entry would. So a bank account shows its whole balance, and the trial balance agrees with the balance sheet and the general ledger. In the app, the page opens on the start of the Fiscal Year that holds the cutoff date when you give no start.
Query params
Response
type on a row is one of asset, liability, equity, income, cost_of_goods_sold, operating_expense, other_income, other_expense. The eight column fields, all nonnegative integers:
General ledger
GET /api/entities/:entityId/ledger/general-ledger
Returns the lines of one ledger account in a window, one page at a time, with a running balance that starts from what the account carries into the window. Lines come by date, oldest first, unless you pass sort.
The window must sit inside one Fiscal Year; one that crosses a Fiscal Year start returns 400 with LEDGER_WINDOW_CROSSES_FISCAL_YEAR_ERROR. In the app, the Libro mayor page opens on the current Fiscal Year.
Query params
Sorting
- Lines with the same sort value keep date order, oldest first.
entryMemoandpartnerNamesort alphabetically. A line with no memo or no partner sorts as empty text, so it comes first in ascending order.debitandcreditsort by the amount on that side. A line on the other side counts as zero.runningBalanceis always the balance of the line in date order. A sort never recomputes it, so sorting byrunningBalanceorders the lines by that balance.cursorcontinues the walk in the order you asked for. Pass the samesortandsortDirectionon every page.
Each item in
lines:
General ledger of every account
GET /api/entities/:entityId/ledger/reports/general-ledger
Returns the whole General Ledger of a window in one response: every account, with its opening balance, its lines, its totals, and its closing balance. Use it to export or archive the complete Libro mayor. To browse one account page by page, use the general ledger instead.
It reads the same live lines as the general ledger (active and reversed entries), so the balances of both always agree. The response is not paginated, so a long window over a busy Entity can be large.
Query params
A
from later than to returns 400. A window that crosses a Fiscal Year start returns 400 with LEDGER_WINDOW_CROSSES_FISCAL_YEAR_ERROR.
Response
An account appears when it has a line in the window or carries a nonzero balance into it. An account with no line in the window and no balance doesn’t appear.
Each item in
accounts:
Each item in
lines:
Partner ledger
GET /api/entities/:entityId/ledger/partner-ledger
Returns the partner ledger for an open-item account, grouped by partner with opening/closing balances and line-level detail.
The report is paginated. A page walks each partner’s opening row, then that partner’s lines in date order. Partners come in name order, and the group with no partner comes last. A partner whose lines run over a page boundary appears on both pages with the same openingBalance, totals, and closingBalance, so join its lines across pages. To read the whole ledger, pass the nextCursor of each response as cursor until nextCursor is null, keeping the other params the same.
Query params
Response
Each item in
groups:
Each item in
lines:

