> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wristler.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits

> How much you may ask for in a minute, and what to do when you have.

Counted per minute, per token — not per account and not per business. Every token
you hold has its own minute, and a sync of yours running hot does not slow down the
person using the app.

| Who | Per minute |
| - | - |
| A seller's own script, or a product several sellers connect to | **600** |
| The Wristler app, signed in | **1,800** |
| The Wristler app with nobody signed in (a guest token) | **300** |
| A request with no usable token, counted per IP address | **60** |

The app gets more because it is a person tapping rather than a job running: one
screen is a list, its images, a thread and an unread count, and somebody moves
between screens faster than any sync runs.

## Every response says where you stand

```http theme={null}
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 587
```

When you have run out:

```http theme={null}
HTTP/1.1 429 Too Many Requests
Retry-After: 41
X-RateLimit-Reset: 1790174732
```

```json theme={null}
{ "jsonapi": { "version": "1.0" },
  "errors": [{ "status": "429", "title": "Too Many Requests", "detail": "Too many requests." }] }
```

**Honour `Retry-After`.** It is the number of seconds until the window rolls over,
and retrying sooner only spends the next window's room on being refused again.

## Staying under it

> [accordion] Send only what changed
>
> Walk the inventory with `fields[watches]=externalIdentifier,price,status`,
> compare, and `PATCH` the listings that moved. A listing whose price has not
> changed is a write you both pay for and nobody needed.

> [accordion] Pull orders incrementally
>
> `filter[updatedSince]` turns "walk the whole history" into one call per run.

> [accordion] Let us fetch your images
>
> Eight photographs uploaded one at a time is eight calls. `imageSources` on the
> listing is part of a call you were making anyway, and an unchanged set is not
> re-fetched at all.

> [accordion] Spread a big run
>
> 600 a minute is 10 a second. A sync that fires everything at once and then waits
> is slower than one that paces itself, because half of it comes back `429`.

> [!NOTE]
>
> A request that fails authentication still counts — against the anonymous bucket,
> by IP. Retrying a token that came back `401` will not start working, and sixty
> attempts a minute is all anyone gets at guessing.

Need more than this for something real? Say what you are building and we will
raise it — the numbers are a starting point, not a policy.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.