Skip to main content
The Reports API surfaces financial and operational read models for a single entity. All endpoints are 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.
Open in the app. Every report here is a page in the Sintropix web app under https://app.sintropix.com/{entityId}/: balance, eight-column-balance, income-statement, income-statement-by-dimension, cash-flow, general-ledger, journal, partner-ledger, receivables, payables, revenue-realization, customers, and fixed-assets. Pass the period as from and to, as cutoffDate alone for the balance sheet, or as exerciseStart and cutoffDate for the eight-column balance and the cash flow statement. When you report a figure to a user, link the page it came from. See Link to the App for every parameter.

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’s fiscalYearStartMonth, 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 at 0 on 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_earnings sub-type.
  • Any other account carries every line before the date.
Sintropix posts no closing entry. Every report derives the close when it reads, so a change to a line of a closed year shows on the next read. Until the Entity has a retained earnings account, no account carries the result of the closed years. The balance sheet shows it as 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:
The income statement, the journal, the cash flow statement, and the other reports that sum the lines between two dates take any window.

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.
Response 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.
Response An array, earliest due date first, then earliest issue date. Invoices with no due date come last. Each item:
To list one supplier’s invoices from a single Source, combine the filters:

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.
Each item in 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.
To see only the net result per value across all accounts, use Income statement by dimension instead.

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_transfer account 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, not supplier_payments.
  • A line on the Suspense Account, or on an account with no category and no default, lands in unclassified. Set a cashFlowCategory on the account to move it into an activity.
Query params 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.
  • entryMemo and partnerName sort alphabetically. A line with no memo or no partner sorts as empty text, so it comes first in ascending order.
  • debit and credit sort by the amount on that side. A line on the other side counts as zero.
  • runningBalance is always the balance of the line in date order. A sort never recomputes it, so sorting by runningBalance orders the lines by that balance.
  • cursor continues the walk in the order you asked for. Pass the same sort and sortDirection on every page.
Response 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:
Download it from the app. On the Libro mayor page, click Exportar a Excel to download this report for the window on screen as libro-mayor-{from}-{to}.xlsx. The sheet opens with the Entity, the window, and the currency. Each account is a block: a Saldo inicial row, one row per line (Fecha, Asiento, Glosa, Contacto, RUT, Débito, Crédito, Saldo), and a Total row with the debit total, the credit total, and the closing balance. Every row repeats the account’s Código and Cuenta, so filtering on either column keeps an account’s block whole. Asiento holds the Ledger Entry id. Amounts are in currency units, not minor units.

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:

Status codes