Working with Data Export API response limits
The Data Export API does not paginate responses. If a request would return more data
than the API permits in a single response, the request fails with an error rather
than returning a partial result. Plan your integrations to stay within the limits
by narrowing the date range, reducing the number of printers per request, or both.
What the limits are
Two kinds of limits apply to requests that include a date range:
- Maximum date range
- If the time between
startDateTimeandendDateTimeexceeds seven days, the API returns a 400 response with the error codeERR_DATE_RANGE_EXCEEDED. Reduce the size of the requested time window and submit the request again. - Maximum response size
- The maximum supported size of a response file is 6MB, which should be large enough
to hold the data for nearly 10,000 jobs. If the data that matches a request would
exceed the maximum response size, the API returns a 413 response with the error code
ERR_RESPONSE_LIMIT_EXCEEDED. The response body includes amaxJobsvalue that indicates the limit in effect. To recover, narrow the date range, request fewer printers, or both, and submit the request again.
Planning requests to stay within the limits
To design an integration that reliably stays within the response limits, consider the following factors:
- Job volume per printer. A high-throughput continuous-feed printer can produce many more jobs per hour than a low-volume cut-sheet printer. If you mix both in your fleet, the high-volume printers determine how short your time windows must be.
- Number of printers per request. Each request can include multiple
printerIdvalues. Combining many printers into a single request is convenient, but every additional printer increases the response size and the chance of exceeding the limit. - Time of day. If your operation runs in shifts, jobs and state changes are concentrated in certain hours. A 24-hour window can return very different volumes depending on when those 24 hours start and end.
- Tolerance for retries. If a request fails with
ERR_RESPONSE_LIMIT_EXCEEDED, your integration must split the request and retry. Designing for smaller windows up front is usually less complex than implementing dynamic splitting.
Recommended patterns
The following patterns work well for common integration scenarios:
- Nightly extract for reporting
- Run a scheduled job once per day that requests the previous 24 hours of data, one printer at a time. This pattern is simple to implement, easy to retry on failure, and keeps each response small. Combine the per-printer responses in your downstream process.
- Hourly extract for near-real-time dashboards
- Run a scheduled job once per hour that requests the previous hour of data for all printers in a single call. Hourly windows keep response sizes small even for high-volume printers. If your fleet is large, request printers in groups rather than all at once.
- Backfill of historical data
- To populate a data warehouse with historical data, iterate over the time range in
fixed-size windows (for example, six hours per request) and over your printers in
small groups. Process one window at a time and store the results before moving to
the next window. If a window fails with
ERR_RESPONSE_LIMIT_EXCEEDED, split that window in half and retry the two halves. - Current printer state for monitoring
- To monitor the current state of every printer in your fleet without retrieving history,
call
/printer-stateswithcurrentState=true. The response includes one row per engine and is not affected by the date range, so a single request can cover the entire fleet.
Handling response-limit errors in your integration
When you receive a 413 response with ERR_RESPONSE_LIMIT_EXCEEDED, take one or more of the following actions before retrying the request:
- Reduce the time window. Splitting the window in half is a reliable strategy; if the halved request still fails, split again.
- Reduce the number of
printerIdvalues in the request. If one printer is responsible for most of the volume, request that printer separately. - If the request is for a current snapshot rather than a history, use
currentState=trueon/printer-statesto avoid date-range-driven volume entirely.
Do not retry the same request without changing parameters. The API does not return partial results, so an unchanged retry will fail again.