https://qwoty.app can reject requests that arrive in bursts, with an HTTP 429 Too Many Requests response. The API does not expose a quota you can query, so your integration must expect 429 responses and retry. Contractual usage limits per plan are described in the Fair use policy.
What to expect
- A
429can be returned by any endpoint, typically when many requests are sent in a very short time. - Do not rely on rate-limit headers (such as
X-RateLimit-*orRetry-After): they are not guaranteed to be present. If aRetry-Afterheader is present, wait at least that long. - A
429means the request was not processed. It is safe to send it again later.
Retry with exponential backoff
When you receive a429 (or a 5xx), wait before retrying, and double the wait after each failed attempt. Add a little randomness (jitter) so that parallel workers don’t retry at the same moment, and stop after a few attempts.
JavaScript
Python
429 and 5xx. Other 4xx errors will fail again until you fix the request (see Error handling).
Avoid bursts
- Send requests sequentially or with a small, fixed concurrency (a few requests in parallel), rather than firing hundreds at once.
- Spread bulk jobs over time. For large imports, process records in batches with a short pause between batches. For a one-off initial load of products and prices, consider the CSV import in the app instead (see Data migration).
- Use list endpoints. Fetch a list once (for example List Products with
limit, or List Prices withlimitandoffset) instead of oneGETper object. - Cache what rarely changes, such as catalogs, categories and payment terms.
- React to webhooks instead of polling. See Webhooks.

