Overview
Exact Online is the cloud-based accounting and ERP platform that hundreds of thousands of Dutch and Belgian businesses use for their financial administration, invoicing, purchase management, project administration, and CRM. As one of the dominant business software platforms in the Netherlands, Exact Online sits at the centre of many organisations' operational data — the system that holds the authoritative financial records, the customer and supplier master data, the invoice history, and the general ledger that management accounts and tax filings depend on.
For organisations that run Exact Online as their financial system of record, integration between Exact Online and the other systems the organisation uses is a common requirement. The custom web application that needs to read customer data from Exact Online. The e-commerce platform that needs to post sales invoices to Exact Online automatically. The HR system that needs to synchronise employee cost centre data. The operational tool that needs to create purchase orders in Exact Online when stock falls below threshold. The reporting dashboard that aggregates financial data from Exact Online alongside operational data from other sources.
The Exact Online REST API provides programmatic access to the full range of Exact Online data through a well-structured OAuth 2.0-authenticated API. The API covers financial administration, sales and purchase management, inventory, projects, payroll data, and the other modules that Exact Online supports. Understanding the API's division model — where each Exact Online company is identified by a division number that must be included in every API call — and the OAuth 2.0 flow that authorises access to specific company accounts is the foundation for reliable Exact Online integrations.
We build Exact Online integrations for Dutch and Belgian businesses that need to connect their custom software, operational tools, and web applications to Exact Online — covering the full range of Exact Online data domains and the integration patterns that production Exact Online connectivity requires.
What Exact Online Integration Covers
OAuth 2.0 authentication and authorisation. The Exact Online REST API uses standard OAuth 2.0 for authentication — the same OAuth flows used by other modern APIs, with Exact Online-specific conventions for the token endpoint and the division-based authorisation model.
Authorisation code flow: the user-facing OAuth flow for integrations that access Exact Online on behalf of a specific user or company. The authorisation URL that redirects the user to Exact Online's login page, the consent screen where the user grants the application access to their Exact Online data, the authorisation code returned to the redirect URI, and the token exchange that converts the authorisation code to access and refresh tokens.
Client credentials considerations: Exact Online's OAuth implementation does not support the client credentials flow for machine-to-machine access without user interaction. All Exact Online API access requires user authorisation — the user must complete the OAuth flow to grant the integration access to their account. For automated integrations, the access token obtained through the initial user authorisation is refreshed using the refresh token for ongoing access without requiring repeated user interaction.
Access token refresh: Exact Online access tokens expire after 10 minutes — a shorter expiry than most OAuth implementations. The token refresh logic that uses the refresh token to obtain a new access token before the current one expires, handling the 10-minute expiry window correctly. The refresh token itself has a longer lifetime but must be used within 30 days of the last access token request to remain valid.
Division identification: every Exact Online API endpoint includes the division number in the URL path (/api/v1/{division}/...). The division number identifies the specific Exact Online company (administration) being accessed. The GET /api/v1/current/Me endpoint that returns the authenticated user's available divisions and the current division number — the starting point for discovering which division to use for subsequent API calls.
Financial administration. The core financial data that most Exact Online integrations access — general ledger entries, accounts receivable, accounts payable, and financial reporting data.
General ledger accounts: the GET /api/v1/{division}/financial/GLAccounts endpoint for the chart of accounts — the account codes, descriptions, and account types (balance sheet, profit and loss, cost, revenue) that financial transaction posting requires. The GL account lookup that maps the integration's internal account codes to Exact Online's account codes before posting transactions.
Journal entries: the POST /api/v1/{division}/financial/TransactionLines endpoint for posting general ledger entries to Exact Online. The transaction structure with the journal code, the entry date, the description, the GL account, the amount, and the VAT code. The balanced transaction that has equal debits and credits. The import batch that groups multiple transaction lines into a single accounting entry.
Financial periods: the GET /api/v1/{division}/financial/FinancialPeriods endpoint for the open and closed financial periods. The period status check that prevents posting to closed periods — attempting to post to a closed period returns an error that the integration must handle by either rejecting the transaction or adjusting the posting date to an open period.
VAT codes: the GET /api/v1/{division}/financial/VATCodes endpoint for the VAT rate codes configured in the Exact Online administration. The VAT code that must be specified on invoice lines and journal entries to correctly calculate and report VAT. The Dutch VAT rates — 21% standard rate, 9% reduced rate, 0% for exempt and zero-rated transactions — mapped to their corresponding Exact Online VAT codes.
Accounts receivable — sales invoices. Creating and managing sales invoices in Exact Online.
Invoice creation: the POST /api/v1/{division}/salesinvoice/SalesInvoices endpoint for creating sales invoices. The invoice header with the account (customer) reference, the invoice date, the payment terms, the currency, and the invoice lines with the item description, quantity, unit price, VAT code, and GL account. The invoice number that Exact Online assigns automatically according to the configured number series.
Invoice retrieval: the GET /api/v1/{division}/salesinvoice/SalesInvoices endpoint for listing sales invoices with OData filtering and sorting. The $filter parameter for filtering by customer account, invoice date range, invoice status, or any other queryable field. The $select parameter for requesting only the fields the integration needs rather than the full invoice object.
Invoice status: the invoice status values — 10 (Draft), 20 (Open), 50 (Processed/Closed). The status filter that retrieves only outstanding invoices for dunning and cash flow reporting.
Credit notes: the POST /api/v1/{division}/salesinvoice/SalesInvoices endpoint with a negative total amount for creating credit notes against existing invoices. The YourRef field that references the original invoice number.
Accounts payable — purchase invoices. Receiving and managing purchase invoices from suppliers.
Purchase invoice creation: the POST /api/v1/{division}/purchaseinvoice/PurchaseInvoices endpoint for recording purchase invoices from suppliers. The invoice header with the supplier account reference, the invoice date, the due date, the invoice number from the supplier's document, and the purchase invoice lines with the GL account allocation and VAT code.
Purchase invoice retrieval: the GET /api/v1/{division}/purchaseinvoice/PurchaseInvoices endpoint for listing purchase invoices with OData filtering by supplier, date range, and payment status.
Accounts — customers and suppliers. Managing the customer and supplier master data in Exact Online.
Account creation: the POST /api/v1/{division}/crm/Accounts endpoint for creating new customer or supplier accounts. The account record with the name, address, VAT number, Chamber of Commerce number (KvK), payment terms, and the account classification (customer, supplier, or both). The duplicate check that searches for existing accounts by VAT number or KvK number before creating a new record.
Account retrieval: the GET /api/v1/{division}/crm/Accounts endpoint for querying accounts with OData filtering. The search by name, email, VAT number, KvK number, or account code for the account lookup that invoice creation requires. The $filter=IsCustomer eq true for customer-only results, $filter=IsSupplier eq true for supplier-only results.
Account updates: the PUT /api/v1/{division}/crm/Accounts(guid) endpoint for updating account master data — address changes, payment term updates, contact information changes. The GUID-based resource identification that Exact Online uses throughout its API.
Contact persons: the GET /api/v1/{division}/crm/Contacts endpoint for the contact persons associated with accounts. The contact person data — name, email, phone, job title — linked to the parent account via the Account GUID reference.
Items and inventory. Product and inventory master data.
Item retrieval: the GET /api/v1/{division}/logistics/Items endpoint for the product catalogue — the item codes, descriptions, sales prices, purchase prices, and the GL accounts that determine how item transactions are posted. The item lookup that maps the integration's product identifiers to Exact Online item codes before creating invoice lines.
Stock positions: the GET /api/v1/{division}/inventory/ItemWarehouses endpoint for the current stock quantities per item per warehouse. The stock level data that inventory management integrations use to synchronise warehouse system stock with Exact Online's inventory records.
Goods receipts: the POST /api/v1/{division}/inventory/GoodsDeliveries endpoint for recording stock movements — goods received from suppliers against purchase orders. The goods receipt that updates Exact Online's stock position and creates the associated financial entries.
Projects. Project data for organisations that use Exact Online's project administration module.
Project retrieval: the GET /api/v1/{division}/project/Projects endpoint for the project list with filtering by status, responsible employee, and date range. The project data — project code, description, budget, start and end dates — used by project dashboards and time registration systems.
Hours registration: the POST /api/v1/{division}/project/TimeTransactions endpoint for submitting employee hours against projects. The time transaction with the employee, the project, the activity, the date, and the hours. The hours registration that connects time tracking systems to Exact Online's project cost reporting.
Project invoicing: the GET /api/v1/{division}/project/ProjectPlanning and related endpoints for project billing data — the hours and costs that have been registered against a project and are eligible for invoicing.
OData querying. The Exact Online REST API uses OData conventions for filtering, selecting, and paginating data.
OData filters: the $filter query parameter with OData filter expressions — $filter=Modified gt datetime'2024-01-01T00:00:00' for delta synchronisation by modification date, $filter=AccountCode eq 'CUST001' for specific account lookup, $filter=Status eq 20 for open invoices. The OData operator set — eq, ne, gt, ge, lt, le, and, or, not — applied to Exact Online entity fields.
Field selection: the $select parameter that requests only specific fields from the API, reducing response payload size. The performance benefit of requesting only the fields the integration actually uses — $select=ID,Code,Name,Modified for a lightweight account list.
Pagination: the $top and $skip parameters for manual pagination, and the @odata.nextLink URL in the response that provides the URL for the next page of results when more records are available than the page size allows. The page size default and maximum that Exact Online imposes — typically 60 records per page for most endpoints, requiring iteration through multiple pages for large datasets.
Ordering: the $orderby parameter for sorting results — $orderby=Modified desc for retrieving the most recently modified records first, useful for delta synchronisation patterns.
Delta synchronisation. Most Exact Online integrations need to synchronise data incrementally rather than re-processing the full dataset on each run.
Modified timestamp filtering: most Exact Online entities expose a Modified field that records the last modification timestamp. The delta synchronisation that filters API queries to retrieve only records modified since the last synchronisation run — $filter=Modified gt datetime'{lastSyncTimestamp}'. The synchronisation state that persists the timestamp of the last successful sync for use as the filter value on the next run.
Webhooks: Exact Online provides a webhook mechanism that can notify external applications of changes to specific data types. The webhook subscription configuration in the Exact Online administration that triggers HTTP POST notifications to the integration's webhook endpoint when records are created, updated, or deleted. The webhook receiver that processes incoming notifications and triggers incremental synchronisation for the affected records.
Integration Patterns
Scheduled financial data synchronisation. The most common Exact Online integration pattern — a scheduled job that runs at defined intervals, queries Exact Online for changes since the last run, and applies the changes to the connected system. The daily or hourly synchronisation that keeps financial records, customer data, and invoice status current between Exact Online and other business systems.
Event-driven posting. The operational system that posts transactions to Exact Online in response to business events — the e-commerce order that creates a sales invoice in Exact Online on completion, the purchase order that creates a purchase invoice entry when goods are received, the time registration entry that posts hours to Exact Online immediately on approval.
Read-through reporting. The reporting dashboard that queries Exact Online's financial data in real time for management reports, cash flow dashboards, and financial KPI displays — reading directly from the Exact Online API rather than maintaining a local copy of the financial data.
Bidirectional master data synchronisation. The integration that keeps customer and supplier master data consistent between Exact Online and CRM, e-commerce, or other systems where the same entities are managed from both sides.
Technologies Used
- C# / ASP.NET Core — primary Exact Online integration implementation, leveraging the .NET HTTP client and the official Exact Online .NET SDK where appropriate
- Rust / Axum — high-performance Exact Online data processing for integrations with large data volumes
- TypeScript / Node.js — Exact Online integration for JavaScript-based e-commerce platforms and operational tools
- OAuth 2.0 — Exact Online API authentication with 10-minute access token management
- REST / HTTP / OData — Exact Online REST API with OData query conventions
- SQL (PostgreSQL / MySQL) — synchronisation state, local data caching, delta tracking
- Redis — access token caching, synchronisation job coordination
- Hangfire / scheduled jobs — scheduled synchronisation for financial data, invoices, and master data
- Webhooks — event-driven synchronisation via Exact Online webhook notifications
- Docker — containerised integration service deployment
- GitHub Actions — CI/CD pipeline for integration service deployment
Exact Online Integration in the Dutch Business Context
Exact Online's dominant position in Dutch SME financial administration means that Exact Online integration is a near-universal requirement for custom software built for Dutch businesses. The e-commerce operation that needs sales invoices to flow automatically to Exact Online without manual entry. The field service application that needs to post job completion records to Exact Online project administration. The supplier portal that needs to verify supplier data against Exact Online's creditor master. The HR tool that needs to read employee data from Exact Online's payroll module.
In each case, the specific Exact Online data domains — financial accounts, invoices, contacts, items, projects — have well-defined API endpoints that the integration uses. The OAuth authentication, the division model, the OData query conventions, and the 10-minute access token management are the integration-level details that require specific knowledge of Exact Online's API behaviour for reliable production integration.
Connected to Exact Online, Working for Your Business
Exact Online integrations built to production standards — correct OAuth 2.0 token management with 10-minute expiry handling, robust OData query construction, incremental delta synchronisation, webhook-triggered updates, and the monitoring that surfaces integration issues before they affect financial operations — keep your systems connected to Exact Online reliably rather than requiring manual reconciliation between Exact Online and your other business systems.