Check and report Exact Online API usage

With Exact Online increasingly tightening resource usage for APIs, it is essential to monitor actual usage.

Note for 2021: Exact has announced that the API rate limits will be tightened in various aspects in July 2021. Read Impact Exact Online API adjustments July 1, 2021 for more information.*

The following query provides an overview per Exact Online company (“division”) of the remaining daily API calls across all sessions, as well as the uncompressed amount of data transported during the current session.

The first statement use selects all Exact Online companies. You might want to select specific companies as a comma-separated list.

The second statement select triggers a short API request for each Exact Online company to retrieve at most one unique journal. This API request returns the current maximum and remaining number of daily and minutely API calls, including rate limit reset times.

The third statement select is the actual report. It collect for all divisions (each division is a partition) the remaining daily calls as well as the approximate number of uncompressed data transported between the Exact Online API clusters and the client.

The report works for both on-premise products such as Invantive Query Tool for Windows or Invantive Data Hub for Mac, as well as online products such as Invantive Bridge Online, Invantive App Online, Invantive Cloud or Get My Report.

use all@eol

--
-- Ensure at least one API call has been made
-- to each Exact Online division. Each API call
-- returns remaining API calls.
--
select *
from   exactonlinerest..journals@eol
where  code = 'x'

select spn.code
,      spn.provider_data_container_alias
,      rlt.DailyLastRemaining
,      sio.bytes_received
,      sio.bytes_sent
from   SYSTEMPARTITIONS@DataDictionary spn
left
outer
join   ratelimits@eol rlt
on     rlt.division = to_number(spn.code)
left
outer
join   ( select partition
         ,      sum(bytes_sent) 
                bytes_sent
         ,      sum(bytes_received) 
                bytes_received
         from   SESSIONIOS@DataDictionary sio
         where  sio.data_container_alias = 'eol'
         and    sio.partition is not null
         group
         by     partition
       ) sio
on     sio.partition = spn.code
where  spn.provider_data_container_alias = 'eol'
and    spn.is_selected = true
order
by     spn.code

The results resemble: