Skip to main content
Errors are returned as JSON with a consistent shape so you can handle them uniformly.

Error envelope

error is a stable machine-readable code; message is human readable. Some errors carry extra fields (for example retry_after on a 429, field-level details on a 422, or a reference correlation code on a 500).

Status codes

Identifiers are scoped to your shop. A resource that belongs to another shop is reported as 404, never another shop’s data.

Rate limiting

Requests are rate limited per token, per shop, and per IP address. When you exceed any of these limits you receive a 429 carrying:
  • Retry-After (seconds to wait),
  • X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.
Respect Retry-After and use exponential backoff. Spread bulk reads over time rather than bursting.

Good citizenship

  • Cache responses where you can and poll with filter[updated_since] instead of re-reading everything.
  • Prefer webhooks for change notifications; reserve polling for reconciliation.
  • Treat repeated 404s as a bug in your integration, not a way to discover records.
Last modified on July 2, 2026