> ## Documentation Index
> Fetch the complete documentation index at: https://docs.consile.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API reference: Dinero

> All 52 read-only tools in the Dinero connector: organisations, bookkeeping reports, contacts, invoices, credit notes, trade offers, purchases, products and files. Covers the shared organizationId requirement, pagination shapes and filter rules.

All Dinero tools are **read-only** and called via `tools/call` over
`POST /dinero/mcp`. The connector is connected through OAuth (Visma Connect; see
[Forbind Dinero](/connect/forbind-dinero)).

<Info>
  Endpoint: `https://mcp.consile.ai/dinero/mcp`. Dinero is its own named connector
  with only its own tools. Tool names are namespaced `dinero__<tool>` in
  Claude/ChatGPT; the bare names are used here for readability.
</Info>

<Warning>
  Dinero's public API requires a **Dinero Pro** subscription on the organisation.
  Non-Pro organisations return `403` on every call except `list_organizations` and
  `validate_connection` (both only enumerate organisations, so they work without
  Pro; check `isPro` there). The connector surfaces the `403` as
  `DineroProRequiredError`. Access tokens are refreshed
  silently; a revoked grant surfaces as `AccessTokenExpiredError` ("reconnect
  required"). See [Errors & limits](/developers/errors-and-limits).
</Warning>

## Shared conventions

### organizationId

Dinero auth is **user-based**, so almost every tool requires an `organizationId`.
Get the integer id (and the `isPro` flag) from `list_organizations`; there is no
single "selected organisation" stored.

<ParamField path="organizationId" type="integer" required>
  The Dinero organisation id from `list_organizations`. Required on every
  org-scoped tool (noted per tool below where it is the only argument).
</ParamField>

### Pagination

List tools come in two shapes. Tools backed by a Dinero collection endpoint return
an envelope; tools that slice a bare array return a flat page.

```json theme={null}
// envelope (e.g. list_invoices, list_contacts, list_sales); default pageSize 20
{ "items": [ ... ], "pagination": { "page": 0, "pageSize": 20, "result": 20, "totalWithoutFilter": 412, "hasMore": true } }

// client-sliced (e.g. list_chart_of_accounts, list_entries); default pageSize 100
{ "items": [ ... ], "totalCount": 100, "page": 0, "pageSize": 100, "hasMore": true }
```

<Warning>
  `totalWithoutFilter` is the row count **ignoring any filter**: it is NOT the
  filtered total. Dinero exposes no filtered total, so never answer "how many
  overdue invoices?" from `totalWithoutFilter`; count the returned `items` or page
  through with `hasMore`.
</Warning>

<ParamField path="page" type="integer" default="0">0-based page index.</ParamField>

<ParamField path="pageSize" type="integer" default="20">
  Rows per page. Defaults to **20** on the collection-backed lists (invoices,
  contacts, sales, credit notes, trade offers, products, files) and to **100** on
  the accounting lists (`list_chart_of_accounts`, `list_entries`,
  `list_entry_changes`). Dinero hard-caps `pageSize` at **1000**.
</ParamField>

### Filters & dates

<ParamField path="changesSince" type="string (ISO 8601 UTC)">
  On supported list tools, return only records changed at/after this timestamp. Use
  it for incremental pulls.
</ParamField>

<Note>
  Free-text filter values **cannot contain a single quote** (`'`): Dinero's filter
  syntax wraps the value in single quotes with no escape, so such a clause is
  rejected with a friendly error. `startDate`/`endDate` (on `list_invoices`,
  `list_sales`, `list_credit_notes`) must be passed as a pair; the `from`/`to`
  bounds on the state-of-account tools are independent optionals.
</Note>

### Read-via-POST calculators

Two tools (`calculate_invoice_totals`, `preview_invoice_reminder`) issue a POST to
a Dinero `…/fetch` endpoint. They are **read-only**: they compute a result for a
prospective input and **persist nothing** upstream.

***

## Organisations & reference

| Tool                    | Description                                                                                                 | Key arguments           | Returns                                                                  |
| ----------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------- | ------------------------------------------------------------------------ |
| `list_organizations`    | Dinero organisations the connected user can reach, with the id every other tool needs and the `isPro` flag. | (none)                  | `{ count, organizations[] }` (id, name, vatNumber, countryKey, isPro, …) |
| `validate_connection`   | Connectivity/credential health check; lists reachable orgs (works without Pro).                             | (none)                  | `{ connected, organizationCount, organizations[] }`                      |
| `list_accounting_years` | The org's accounting years with `fromDate`/`toDate` and the year **name** used by the report tools.         | `organizationId`        | `{ count, years[] }`                                                     |
| `list_countries`        | Country keys Dinero accepts on contacts (account-global).                                                   | `search?` (client-side) | `{ count, countries[] }`                                                 |
| `list_vat_types`        | The org's VAT types/codes, to interpret `vatCode` on accounts and entries.                                  | `organizationId`        | `{ count, vatTypes[] }`                                                  |
| `get_sales_settings`    | Default invoicing settings (default account, payment terms, reminder fee/interest, default template).       | `organizationId`        | sales-settings object                                                    |

***

## Bookkeeping & accounting

The four report tools are Dinero's only balance source. They take **no date range**:
balances are **whole-year totals** keyed by the accounting-year `name` (from
`list_accounting_years`). They share the same arguments.

<ParamField path="accountingYear" type="string" required>
  Accounting year **name** as Dinero returns it (e.g. `"2025"`), from
  `list_accounting_years`.
</ParamField>

<ParamField path="includeZeroAccounts" type="boolean" default="false" />

<ParamField path="includeSummaryAccounts" type="boolean" default="false" />

<ParamField path="accountNumberFrom" type="integer" />

<ParamField path="accountNumberTo" type="integer" />

| Tool                       | Description                                                                                                                       | Key arguments                                                                                                 | Returns                                                                  |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `list_chart_of_accounts`   | Entry accounts with VAT code and category. Rows carry **no balance**, so use the report tools.                                    | `organizationId`, `category?`, `accountNumberFrom?`, `accountNumberTo?`, `includeHidden?`, `page`, `pageSize` | `{ items, totalCount, page, pageSize, hasMore }`                         |
| `list_deposit_accounts`    | Deposit (bank/Stripe/MobilePay) accounts incl. default flag.                                                                      | `organizationId`, `includeHidden?`, `includeBankDetails?`                                                     | `{ count, accounts[] }`                                                  |
| `get_saldo_balance_report` | Saldobalance: per-account year totals for **all** accounts (P\&L + balance sheet). The workhorse for balance questions.           | report args                                                                                                   | `{ accountingYear, count, rows[] }` (accountNumber, accountName, amount) |
| `get_result_report`        | Resultatopgørelse (P\&L): income/expense accounts with year totals.                                                               | report args                                                                                                   | `{ accountingYear, count, rows[] }`                                      |
| `get_balance_report`       | Balance sheet: asset & liability accounts at booked position.                                                                     | report args                                                                                                   | `{ accountingYear, count, rows[] }`                                      |
| `get_primo_balance_report` | Opening (primo) balances per account.                                                                                             | report args                                                                                                   | `{ accountingYear, count, rows[] }`                                      |
| `get_account_balance`      | Year-total balance for specific account number(s) (fetches the saldo report, returns only those rows).                            | `organizationId`, `accountingYear`, `accountNumbers` (1–20 ints)                                              | `{ accountingYear, accounts[], notFound[] }`                             |
| `list_entries`             | Posted bookkeeping entries for a date range **within one accounting year**. The discovery path for purchase/manual voucher guids. | `organizationId`, `fromDate`, `toDate`, `includePrimo?`, `accountNumber?`, `voucherType?`, `page`, `pageSize` | `{ items, totalCount, page, pageSize, hasMore }`                         |
| `list_entry_changes`       | Entries **added** in a window of ≤31 days (filters on added date): incremental follow-up to `list_entries`.                       | `organizationId`, `changesFrom`, `changesTo` (≤31 days later), `includePrimo?`, `page`, `pageSize`            | `{ items, totalCount, page, pageSize, hasMore }`                         |

***

## Contacts

Dinero keeps one merged customer/supplier register. The debtor/creditor split is
only on `get_contact`, never on the list.

| Tool                                    | Description                                                                                                                                      | Key arguments                                                                                                                                                       | Returns                                                               |
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `list_contacts`                         | Search/list the merged contact register.                                                                                                         | `organizationId`, `name?`, `email?`, `phone?`, `vatNumber?`, `eanNumber?`, `externalReference?`, `isPerson?`, `changesSince?`, `deletedFilter?`, `page`, `pageSize` | `{ items, pagination }`                                               |
| `get_contact`                           | Full single contact incl. `isDebitor`/`isCreditor`, SE/P numbers, preferred language/currency.                                                   | `organizationId`, `contactGuid`                                                                                                                                     | contact object                                                        |
| `list_contact_notes`                    | Notes on a contact (full text, author, timestamps).                                                                                              | `organizationId`, `contactGuid`, `deletedOnly?`, `page`, `pageSize`                                                                                                 | `{ items, pagination }`                                               |
| `get_contact_state_of_account`          | Kontoudtog: summed income/expenses + dated entries with a running balance. `hideClosed=true` = open-items view ("what does this customer owe?"). | `organizationId`, `contactGuid`, `from?`, `to?`, `hideClosed?`, `maxEntries?` (1–500)                                                                               | `{ contactGuid, income, expenses, entryCount, truncated, entries[] }` |
| `download_contact_state_of_account_pdf` | The kontoudtog as a PDF (base64).                                                                                                                | `organizationId`, `contactGuid`, `from?`, `to?`, `hideClosed?`                                                                                                      | `{ contactGuid, fileName, mimeType, base64 }`                         |

***

## Invoices & reminders

| Tool                            | Description                                                                                                             | Key arguments                                                                                                                                                                                                     | Returns                                       |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- |
| `list_invoices`                 | List/search invoices. `status` is a 5-value filter (Draft/Booked/Paid/OverPaid/Overdue). Drafts ignore the date filter. | `organizationId`, `status?`, `startDate?`/`endDate?`, `freeTextSearch?`, `contactGuid?`, `externalReference?`, `descriptionContains?`, `changesSince?`, `deletedOnly?`, `sort?`, `sortOrder?`, `page`, `pageSize` | `{ items, pagination }`                       |
| `list_invoices_overdue`         | Outstanding receivables: invoices past payment date.                                                                    | `organizationId`, `includeNotYetDue?`, `page`, `pageSize`                                                                                                                                                         | `{ items, pagination }`                       |
| `get_invoice`                   | Full single invoice: product lines, totals/VAT, FIK code, mailout status.                                               | `organizationId`, `invoiceGuid`                                                                                                                                                                                   | invoice object                                |
| `download_invoice_pdf`          | Invoice PDF (base64). PDFs exist **only for booked invoices**.                                                          | `organizationId`, `invoiceGuid`                                                                                                                                                                                   | `{ invoiceGuid, fileName, mimeType, base64 }` |
| `list_invoice_payments`         | Payments on an invoice + paid/remaining amounts.                                                                        | `organizationId`, `invoiceGuid`                                                                                                                                                                                   | payments object                               |
| `calculate_invoice_totals`      | **Read-via-POST calculator:** compute totals/VAT/payment date for a prospective set of lines. Persists nothing.         | `organizationId`, `productLines[]`, `contactGuid?`, `date?`, `currency?`, …                                                                                                                                       | computed totals object                        |
| `list_invoice_mailouts`         | Delivery/engagement history for an invoice (received/opened/bounced, download count).                                   | `organizationId`, `invoiceGuid`, `includeSms?`, `changesSince?`                                                                                                                                                   | `{ count, mailouts[] }`                       |
| `list_invoice_reminders`        | All reminders (rykkere, max 3) for one booked invoice: fee, interest, accumulated fees.                                 | `organizationId`, `invoiceGuid`, `changesSince?`                                                                                                                                                                  | `{ count, reminders[] }`                      |
| `get_invoice_reminder`          | One reminder with full fee/interest breakdown incl. Danish legal text.                                                  | `organizationId`, `invoiceGuid`, `reminderId`                                                                                                                                                                     | reminder object                               |
| `download_invoice_reminder_pdf` | A reminder as PDF (base64).                                                                                             | `organizationId`, `invoiceGuid`, `reminderId`                                                                                                                                                                     | `{ …, fileName, mimeType, base64 }`           |
| `get_next_invoice_reminder`     | Preview the **next** reminder Dinero would generate for an overdue invoice. Persists nothing.                           | `organizationId`, `invoiceGuid`                                                                                                                                                                                   | reminder preview object                       |
| `preview_invoice_reminder`      | **Read-via-POST calculator:** reminder preview for a chosen date + fee/interest toggles. Persists nothing.              | `organizationId`, `invoiceGuid`, `date`, `withFee`, `withInterestFee`, `withCompensationFee`, `withDebtCollectionWarning`                                                                                         | reminder preview object                       |

***

## Sales: credit notes & trade offers

| Tool                        | Description                                                                                                          | Key arguments                                                                                                                                                                                                                     | Returns                                          |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| `list_sales`                | **All** sales vouchers in one feed: invoices AND credit notes (`type` tells them apart).                             | `organizationId` + same filter surface as `list_invoices`                                                                                                                                                                         | `{ items, pagination }`                          |
| `list_credit_notes`         | List sales credit notes (kreditnotaer).                                                                              | same filter surface as `list_sales`                                                                                                                                                                                               | `{ items, pagination }`                          |
| `get_credit_note`           | Full single credit note incl. `creditNoteFor` (the credited invoice guid).                                           | `organizationId`, `creditNoteGuid`                                                                                                                                                                                                | credit note object                               |
| `download_credit_note_pdf`  | Booked credit note as PDF (base64).                                                                                  | `organizationId`, `creditNoteGuid`                                                                                                                                                                                                | `{ creditNoteGuid, fileName, mimeType, base64 }` |
| `list_credit_note_payments` | Payments/settlement of a booked credit note.                                                                         | `organizationId`, `creditNoteGuid`                                                                                                                                                                                                | payments object                                  |
| `list_credit_note_mailouts` | Delivery history for a credit note.                                                                                  | `organizationId`, `creditNoteGuid`, `changesSince?`                                                                                                                                                                               | `{ count, mailouts[] }`                          |
| `list_trade_offers`         | List/search trade offers (tilbud). **No server-side status filter**: `status` filters the returned page client-side. | `organizationId`, `status?`, `contactNameContains?`, `descriptionContains?`, `externalReference?`, `currency?`, `number?`, `date?`, `freeTextSearch?`, `changesSince?`, `deletedOnly?`, `sort?`, `sortOrder?`, `page`, `pageSize` | `{ items, pagination }`                          |
| `get_trade_offer`           | Full single trade offer: lines, totals, status, history timeline, `generatedVouchers`.                               | `organizationId`, `tradeOfferGuid`                                                                                                                                                                                                | trade offer object                               |
| `download_trade_offer_pdf`  | A trade offer as PDF (base64).                                                                                       | `organizationId`, `tradeOfferGuid`                                                                                                                                                                                                | `{ tradeOfferGuid, fileName, mimeType, base64 }` |
| `list_trade_offer_mailouts` | Delivery log for a trade offer.                                                                                      | `organizationId`, `tradeOfferGuid`, `includeSms?`, `changesSince?`                                                                                                                                                                | `{ count, mailouts[] }`                          |

***

## Purchases, products & files

Dinero has **no list endpoint** for purchase vouchers, purchase credit notes or
manual vouchers: they are fetched by guid. Discover guids via `list_entries`
(with a `voucherType` filter), `get_purchase_vouchers_by_file`, or known references.

| Tool                            | Description                                                                                          | Key arguments                                                                                                            | Returns                                  |
| ------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- |
| `get_purchase_voucher`          | One purchase voucher (køb) by guid: status, dates, contact, lines, totals, attached fileGuid.        | `organizationId`, `voucherGuid`                                                                                          | voucher object                           |
| `get_purchase_voucher_payments` | Payments on a credit purchase voucher / purchase credit note.                                        | `organizationId`, `voucherGuid`                                                                                          | `{ count, payments[] }`                  |
| `get_purchase_vouchers_by_file` | Reverse lookup: `fileGuid` → guid(s) of purchase voucher(s) referencing it.                          | `organizationId`, `fileGuid`                                                                                             | `{ fileGuid, voucherGuids[] }`           |
| `get_purchase_credit_note`      | One purchase credit note by guid.                                                                    | `organizationId`, `creditNoteGuid`                                                                                       | voucher object                           |
| `get_manual_voucher`            | One manual voucher (kassekladde) by guid: lines, balancing accounts/VAT, FX, booking metadata.       | `organizationId`, `voucherGuid`                                                                                          | manual voucher object                    |
| `list_products`                 | The product register (varekartotek) with prices, units, account mapping.                             | `organizationId`, `search?`, `productNumber?`, `externalReference?`, `changesSince?`, `deletedOnly?`, `page`, `pageSize` | `{ items, pagination }`                  |
| `get_product`                   | One product by guid (incl. the comment field the list omits).                                        | `organizationId`, `productGuid`                                                                                          | product object                           |
| `list_files`                    | The file archive (uploaded receipts/docs): name, extension, size, upload date/user, linked vouchers. | `organizationId`, `extensions?`, `uploadedAfter?`, `uploadedBefore?`, `fileStatus?`, `page`, `pageSize`                  | `{ count, hasMore, files[] }`            |
| `download_file`                 | Download an archive file (receipt image/PDF) as base64. Capped at 6 MB.                              | `organizationId`, `fileGuid`                                                                                             | `{ fileGuid, base64 }`                   |
| `list_document_attachments`     | Attachments bound to a **sales** document (invoice/trade offer/credit note).                         | `organizationId`, `documentGuid`                                                                                         | `{ documentGuid, count, attachments[] }` |

***

## Code examples

<CodeGroup>
  ```json Request: list_invoices_overdue theme={null}
  {
    "name": "dinero__list_invoices_overdue",
    "arguments": { "organizationId": 123456, "includeNotYetDue": false }
  }
  ```

  ```json Request: get_saldo_balance_report theme={null}
  {
    "name": "dinero__get_saldo_balance_report",
    "arguments": { "organizationId": 123456, "accountingYear": "2025" }
  }
  ```

  ```json Request: get_contact_state_of_account (open items) theme={null}
  {
    "name": "dinero__get_contact_state_of_account",
    "arguments": { "organizationId": 123456, "contactGuid": "…", "hideClosed": true }
  }
  ```
</CodeGroup>

<Note>
  Error contract: `401` → reconnect required (`AccessTokenExpiredError`); `403` →
  no Dinero Pro or no access to that org (`DineroProRequiredError`); `429` → rate
  limit (≈100 requests/min/org; retried once, then `DineroRateLimitError`); `480`
  → a deprecated Dinero endpoint. `4xx` responses are never retried. See
  [Errors & limits](/developers/errors-and-limits).
</Note>
