Client Accounts & Multi-Tenancy

Every resource in the Snapbooks API — journal entries, documents, bank transactions, business partners — belongs to exactly one client account: one company’s books. Understanding how requests are scoped to a client account is the first thing an integration needs to get right.

The client_account_id parameter

Almost every endpoint requires a client account:

  • List and read endpoints take a client_account_id query parameter:
GET /v2/journal-entries?client_account_id=42
Authorization: Bearer {access_token}
  • Create endpoints take client_account_id in the request body:
{
  "client_account_id": 42,
  "entry_date": "2026-08-01",
  ...
}

The client account must be one of the accounts the authenticated user can access — otherwise the API responds with 403 Forbidden. A resource’s client account cannot be changed after creation.

Which accounts can a token access?

A user’s eligible accounts are:

  1. Client accounts the user is a member of directly (with a role such as owner or accountant), and
  2. Client accounts accessible through service contracts — the model used by accounting firms, where the firm’s own account is the service provider for its clients’ accounts.

An OAuth token acts as a user, and can reach everything that user can:

  • Authorization code flow — the token acts as the user who approved the consent screen. If they can access ten companies, so can the token.
  • Client credentials flow — the token acts as the user who registered the OAuth client. This grant is only available to clients registered by an authenticated user (not to self-registered clients).

There is currently no way to restrict a token to a single client account — scopes limit what a token may do (read vs write), not which accounts it applies to. Always pass the explicit client_account_id you intend to operate on, and prefer the read scope for integrations that don’t need to make changes.

Discovering accessible accounts

List the accounts available to the token’s user:

GET /v2/client-accounts
Authorization: Bearer {access_token}

Use the returned id values as client_account_id in subsequent requests. See Client Accounts for the full resource documentation.

Currency

Every client account has an accounting_currency, and every monetary field in the API carries an explicit currency_code. Don’t assume NOK — read the currency from the response.