SellOrchard

Guides

Rate limits

Limits are applied per API key, so one busy integration can’t slow down another.
On this page

Limits

Key typeLimit
Live keys (so_live_)120 requests per minute
Test keys on trial stores (so_test_)30 requests per minute

Rate-limit headers

Every response tells you where you stand:

HeaderDescription
X-RateLimit-LimitRequests allowed per window.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetWhen the window resets (Unix timestamp, seconds).
Retry-AfterOnly on 429: seconds to wait before retrying.

Handling 429 responses

HTTP response
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1793714400

{"error":{"type":"rate_limited","message":"Rate limit exceeded. Retry in 12 seconds."}}
async function request(url, init = {}, attempt = 0) {
  const res = await fetch(url, init);
  if (res.status === 429 && attempt < 5) {
    const wait = Number(res.headers.get("Retry-After") ?? 1);
    await new Promise((r) => setTimeout(r, wait * 1000));
    return request(url, init, attempt + 1);
  }
  return res;
}

Staying under the limit

  • Use limit=250 when paging through large lists.
  • Sync changes with updated_since instead of re-reading everything — see incremental sync.
  • Prefer webhooks over polling.
  • Fetch stock for many variants at once with GET /inventory-levels?variant_ids=….