Staying in Sync
Catalogue: fetch only what changed
Don't re-read the whole catalogue on every run. partnerProducts can return just the products that changed since a point in time, including products that are no longer orderable so you know what to hide. See Products for each argument.
1. First run: read everything once
query {
partnerProducts(includeUnavailable: true, limit: 500, offset: 0) {
total
hasMore
items { id sku name weight stock pprice available updatedAt }
}
}Page with offset until hasMore is false. Results are ordered oldest change first. Save the largest updatedAt you received. That is your cursor.
2. Every run after that: ask for changes since the cursor
query {
partnerProducts(includeUnavailable: true, updatedSince: "2026-10-12T09:30:00Z", limit: 500) {
total
hasMore
items { id sku name weight stock pprice available updatedAt }
}
}updatedSinceincludes products changed at exactly that time, so a product can appear in two consecutive runs. Treat every item as an upsert keyed bysku.- Start each run from your saved cursor minus a minute or two, so a change that landed while you were reading is not missed.
- Items with
available: falsecan't be ordered right now (inactive, archived or out of stock). Hide or mark them in your store. They come back withavailable: truewhen they can be ordered again. updatedAtmoves when a product's price, stock or content changes.
If you page through a long result, keep the same updatedSince for every page of that run and only move your cursor forward once the run finishes.
Orders: find status changes
An order moves through the statuses listed under Orders. To notice a change, read your orders from time to time and compare with what you stored.
query {
myOrders(limit: 50, offset: 0) {
id orderNumber status amountDue amountPaid createdAt
}
}myOrdersreturns your newest orders first, so one request for the latest page usually covers every order that can still change. Page further back only if you have more open orders than that.myOrderStatsis a quick overview, not a change detector: its counts group statuses (pendingisPENDINGplusACCEPTED,completedisCOMPLETEDplusPROCESSED), so a move between two statuses in the same group does not change them. Compare the orders themselves.- Only keep checking orders that are still open. Once an order is
COMPLETED,CANCELLEDorREJECTEDyou can stop. - For tracking details on a dispatched order, see Shipments.
- Use your
partnerReferenceto match our orders to yours, and resend the same reference if you are unsure a submission arrived (see Idempotency).
Planning your request budget
The limit is 60 requests per minute per account, shared across live and test keys. A sensible starting point:
| What | How often | Requests |
|---|---|---|
Catalogue changes (updatedSince) | Every 15 minutes | 4 an hour, plus extra pages only when many products changed |
Latest orders (myOrders) | Every 5 minutes | 12 an hour for one page of 50 |
| Tracking for open shipments | A few times a day | One per open order per check |
That is a few dozen requests an hour, far under the limit, and each check is as fresh as your schedule. If a request returns RATE_LIMITED, wait for the next minute before retrying (see Rate Limits & Errors).