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.

Python: Connection Pooling with the requests library
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.