All integrations
VoiceDock

Exact Online

The token expires in ten minutes and you may not refresh it

Exact Online is the connection where the honest answer is architectural rather than practical. Its token rules make refreshing on demand impossible, so the refresh has to run on a schedule whether or not anybody is calling.

Access token

10 minutes

Refresh floor

570 seconds

Rate budget

60 / minute, per administration

What gets asked for

Four jobs, in the order people want them

01

Recognise the caller among the accounts

One filtered read on the number, using a token that is already in memory rather than one fetched on the spot.

02

Read the invoice or order in question

So the agent can answer about the specific document instead of promising that somebody will look into it.

03

Check whether something is paid

Before the agent commits to anything. This is the read most worth getting right, because being wrong about money is expensive twice.

04

Log the call for finance

Queued for after the conversation, so the rate budget is spent on reads while the caller is still there.

The constraint that bites

You cannot refresh a token when you need it

An Exact Online access token is valid for ten minutes. The obvious design is to refresh it the moment a call needs one. That design does not work: Exact does not allow a new access token to be requested more than once every ten minutes, with a documented minimum of 570 seconds between requests. Refresh on demand and the second caller of the minute gets an error instead of an answer.

So the refresh runs on a timer in the background, and the call path only ever reads the token that is already there.

The rule that turns a bad minute into a bad hour

Exact allows no more than ten errors per API key, per user, per company, per endpoint, per hour. Exceed it and the key is blocked, and the block lifts by itself an hour later. A voice agent that retries a failing lookup is the fastest way to reach that ceiling, and it would do so during exactly the incident you least want to extend. It is one more reason a tool call on our platform gets one attempt rather than three.

Numbers

Rate limit
60 calls / minute per company
Daily limit
5,000 calls / day per company
Access token
Valid 10 minutes
Refresh floor
570 seconds between token requests
Error ceiling
10 errors per key, user, company, endpoint, hour

In practice

A recognised call, end to end

token-and-lookup.log
token service · background, independent of traffic
  [auth]   refresh · 570s floor respected · ok  08:41:00

inbound  +31612345678                       t+0.00s
  [token]  read from memory · 6m remaining   t+0.00s
  [eol]    GET /crm/Accounts?$filter=...     
  [eol]    200 · 1 account · 520ms           t+0.52s
  [eol]    GET /SalesInvoices?$filter=...    
  [eol]    200 · 1 open invoice · 480ms      t+1.00s
  [agent]  "The one from 12 August is open." t+1.08s

  rate budget used   2 of 60 per minute
  tokens fetched     0 · that is the point

What gets built

A token service, then everything else

The first component is not the lookup. It is a small service that holds the current access token, refreshes it on a schedule well inside the ten-minute window, and hands it out to everything else. Once that exists the rest is ordinary: filtered reads on the call path, writes queued for after the call, and a circuit breaker that stops calling Exact entirely once errors start, so the hour-long block never happens.

What the token service guarantees
refresh     every 8 minutes, on a timer
floor       570s minimum between requests, enforced
call path   reads only · never triggers a refresh
on error    circuit opens after 3 failures in 10 minutes

// The circuit breaker exists because of the error ceiling:
// 10 errors buys a one-hour block, and a retry loop
// reaches 10 faster than a human can notice.

What we need from you

Four things, and one of them is a person

  • The app registration

    Client id and secret in your environment, with the redirect that belongs to them. The credentials sit behind the endpoint we post to, never on our platform.

  • Which administrations

    The rate budget is counted per administration and does not pool. Serving four administrations from one integration is four budgets, not one shared one.

  • Somewhere the token service can run

    It has to stay up when nobody is calling, because the timer does not care whether the phone rings. This is the one piece that cannot be serverless-on-demand.

  • Who to tell when the key is blocked

    A block lasts an hour and clears itself. Somebody should know that before they start restarting things and make it worse.

Questions we get first

Can the agent read Exact live during a call?

Yes, for a filtered single-record read, and comfortably inside the thirty seconds a tool call gets. What it cannot do is fetch a token first, which is why the token service exists.

What happens when Exact is slow or down?

The tool call times out, the agent is told the lookup failed, and it says so and offers a callback or a transfer. It does not invent a balance. Fail closed is a platform-level position here, not a per-integration choice.

Does the rate limit apply per company?

Yes. Sixty calls per minute and five thousand per day are counted per company, which matters if you serve several administrations from one integration, because the budget does not pool.

Who owns the Exact app registration?

You do. The credentials sit in your environment behind the endpoint we post to, so the token service is yours as well, whether we build it with you or you build it yourself.

Going deeper

The two articles underneath this page

Bring us the awkward one

Send the system, its API documentation and one call you want to automate. On the intake call we will tell you whether the hard part is the code or the configuration, and which of the two sets the date.

Voice agents and Exact Online: token rules, rate limits and the error ceiling | VoiceDock