Usage Limits
Response Data Transfer Quota
Each user is granted a maximum of 2 GiB of response data within a rolling 24-hour window.
Data retrieved from both primary and secondary endpoints will contribute towards this quota. The quota consumption of each request is reported in the Ratelimit-Weight
response header.
Tip
Use the ZIP Bundle format and the feature that images are content-adressed to reduce quota consumption.
Exceeding the Quota
If your data consumption surpasses the granted quota, you will receive a response with a 429
status code. This response will include a Retry-After
header, which must be adhered to.
Tip
To simulate exceeding the quota, add the query parameter extra_data_consumption=-1
to your request URI (e.g., /public/api/v1?extra_data_consumption=-1
or /public/api/v1/resources/img/A2MBVdft8hv7MJKfsscRSoMH1xDrR8JZb?extra_data_consumption=-1
).
Retrieving Quota Information
To access quota details, use the UserQuota Action. Ensure that you perform this action before the quota is exhausted.
Concurrency
A maximum of 12 requests can be processed concurrently.
During request processing, a permit from a semaphore that manages the allowed concurrency will be automatically acquired and released. If there is contention for access to the semaphore, the X-IPI-ACQUIRE
response header will indicate the time spent waiting to obtain the permit.
Tip
Configure your HTTP 1.1 client to utilize a connection pool of appropriate size, such as allowing 12 connections for API endpoints. Ensure that established connections are reused for multiple requests.
Note that some client libraries might require manual configuration
or the addition of the Connection: keep-alive
request header to correctly handle connection reuse.
import requests
api_session = requests.Session() # connection keep-alive is automatic within a session
api_session.mount("https://",
requests.adapters.HTTPAdapter(
pool_connections=12, pool_maxsize=12,
max_retries=0, pool_block=True))
api_args = {'headers': {'Content-Type': 'application/xml', 'Accept': 'application/xml'} }
api_response = api_session.post(api_endpoint, data=api_request_xml, **api_args)
Penalties
If a client sends bad requests that result in 4xx
or 5xx
response statuses, a penalty will be recorded and the release of the concurrency permit will be delayed.
Penalties may also be imposed if access tokens are not reused or if excessive concurrent requests cause timeouts during the acquisition of request permits.
If the client makes no requests for 15
minutes, the penalty count will reset to zero.
As penalties accumulate, the delay for releasing semaphore permits will gradually increase (up to 15
seconds), while the available concurrency decreases (down to 1
). Once 2048
penalties are recorded, further processing will be halted for 15
minutes, and the client will receive a 503
response status.