Skip to main content
The Reporting API turns your Shippo account data into downloadable CSV or Parquet files. Pick a report type, request a time interval, and Reporting API builds the file for you. The work happens asynchronously, so you create a run, poll until it’s ready, then download it. See the Authentication guide for token setup.

Report types

A report type is a predefined report identified by a versioned key ({name}.v{version}). Call GET /v2/reporting/reports to fetch the live catalog. It returns the currently active report types and their available columns. See Discover available reports.

Endpoints

Base URL: https://api.goshippo.com An unknown run_id returns a 404.

Run states

Reporting API uses uppercase run statuses to match Shippo’s existing reports API lifecycle vocabulary.
A run with status: FAILED is HTTP 200 with status: FAILED, not an HTTP error. Read the error object to handle it.
There’s no webhook. Poll GET /v2/reporting/runs/{run_id} until the run reaches a terminal status.

Example flow

1. Create a run. Set interval.start and interval.end in UTC epoch seconds. end must be greater than start, otherwise you get a 422. A single run can span up to 92 days; a longer window returns 400 invalid-parameter.
cURL
You get 201 Created with status: QUEUED.
Idempotency is opt-in. Send an optional idempotency_key, any string of 1 to 128 characters, to make retries safe. Reuse the same key with the same request and you get the existing run back as HTTP 200 instead of a duplicate. Reuse the same key with a different request and you get a 409 (idempotency-conflict). Skip the key and every create starts a new run, so there’s no automatic deduplication.
2. Poll until terminal.
cURL
Once the run reaches SUCCEEDED, the response includes result.download.url.
The download URL expires at result.download.expires, expressed as a UTC epoch second. If it expires, fetch the run again for a new URL.
3. Download. Send a GET request to result.download.url. A Shippo Authorization header is not required for this request.
cURL
See Download report files.

Errors

Reporting API errors use RFC 7807 application/problem+json, except authentication failures, which use 401 application/json with a detail field. Match problem responses on the trailing error-code segment of type, since its host can change. Common codes: A run with status: FAILED comes back as HTTP 200 with status: FAILED, and its error object carries a failure code: invalid_run_request, run_failed, run_processing_failed, run_timeout, or service_unavailable. Other statuses you may see: 401, 404. See Errors and run failures.

Next steps

Last modified on September 16, 2026