Taxmo API

A REST API for your own bookkeeping data

Taxmo has a REST API for programmatic access to a user's own account: read bookkeeping entries, invoices, VAT filings and annual summaries, create invoices and contacts and record payments (Dutch accounts), and add hours and time entries. It is authenticated with scoped API keys, or with OAuth 2.0 for partner apps, and available from the Starter plan (EUR 12.99/month excl. VAT). This is separate from the open, unauthenticated tax-data and calculator MCP tools at /open-data, which need no account.

Authentication

Every request needs an API key in the X-API-Key header. Keys are created on the API Access page inside a paid account, Starter or higher (/api-access) and only carry the scopes assigned to them at creation.

X-API-Key: txm_your_api_key_here

Scopes

Endpoints

OAuth 2.0 for partner apps

For an integration used by many Taxmo users (Dutch accounts), a partner app lets each user connect with their own Taxmo login instead of pasting an API key. It is the OAuth 2.0 authorization code flow with PKCE (S256 only): send the user to /oauth/authorize with response_type=code, client_id, redirect_uri, scope, state, code_challenge and code_challenge_method=S256; the user approves on a consent screen; swap the returned code at POST /api/oauth/token (grant_type=authorization_code, with client_id and client_secret via HTTP Basic or in the body, plus redirect_uri and code_verifier). Call the endpoints above with Authorization: Bearer and the access token. Access tokens last one hour; refresh with grant_type=refresh_token (a refresh token works once, is replaced on every refresh and lasts 90 days). POST /api/oauth/revoke revokes a token. Scopes are the same as for API keys. The user needs a Starter plan or higher to approve and can disconnect the app at any time on the API Access page. Partner apps are registered by the Taxmo team on request.

Example

curl -H "X-API-Key: txm_your_api_key_here" \
  "https://taxmo.nl/api/v1/entries?quarter=2&year=2026"
curl -H "X-API-Key: txm_your_api_key_here" \
  https://taxmo.nl/api/v1/summary/2026
curl -X POST -H "X-API-Key: txm_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"projectId": 12, "date": "2026-09-15", "hours": 3.5, "description": "Sprint review"}' \
  https://taxmo.nl/api/v1/time-entries
curl -X POST -H "X-API-Key: txm_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"externalId": "job-1042", "invoiceDate": "2026-09-24", "status": "sent", "customer": {"externalId": "cust-77", "name": "Bakkerij De Vries", "country": "NL"}, "items": [{"description": "Installation", "quantity": 4, "unitPrice": 65, "vatRate": 21}]}' \
  https://taxmo.nl/api/v1/invoices

FAQ

Does Taxmo have a public API? Yes. A REST API (/api/v1/*) authenticated with scoped API keys, available from the Starter plan. Endpoints read entries, invoices, VAT filings and annual summaries, and add hours and time entries.

How do I get a Taxmo API key? Sign in to a Taxmo account on the Starter plan or higher and open API Access (/api-access) to create a key and choose its scopes.

Can I create invoices in Taxmo through the API? Yes, for Dutch accounts. With a key that has the write scope, POST /api/v1/invoices creates an invoice (draft or sent) that is booked, numbered and put on the BTW return exactly like one made in the app. Give it your own externalId so a re-sync returns the existing invoice instead of a duplicate. Credit notes, draft edits and payments have their own endpoints, and GET /api/v1/invoices/:id reports whether the invoice is paid.

Does the Taxmo API support OAuth? Yes, for partner apps connecting Dutch accounts. A partner registered by Taxmo sends its users to /oauth/authorize, and each user approves the connection with their own Taxmo login; the partner then calls the API with a Bearer access token. Authorization code flow with PKCE (S256), one-hour access tokens and rotating refresh tokens. A single user connecting their own tool can keep using an API key.

Can I add hours to Taxmo through the API? Yes. With a key that has the write scope, POST /api/v1/time-entries adds a time entry to a project (find the projectId with GET /api/v1/projects), and POST /api/v1/hours-log adds hours to the urencriterium hours log for Dutch accounts. A time tracker plugin or script can use these to sync hours into Taxmo.