Get catalog changes since a snapshot
GET/partner/catalog/delta
Returns the SKUs added, removed, or changed between since and the newest
snapshot, folded across every intervening snapshot.
since must be a snapshot_id previously returned by
/partner/catalog/manifest or by a prior delta's next_since. An arbitrary
timestamp is rejected — the chain is snapshot-indexed and an arbitrary
instant has no defined answer.
Normal loop: call with since = next_since from your last call, re-pull
added + changed via POST /partner/lowest/bulk, drop removed locally,
then store the new next_since.
When truncated is true, the response stops at an intermediate snapshot —
it is complete and correct up to to_snapshot. Call again with
since = next_since until truncated is false.
next_since always advances on a 200. It is never equal to since
except in the "already up to date" case, where all three arrays are empty
and truncated is false. So the loop above always terminates: it either
makes progress or returns one of the 400s below.
What this endpoint does NOT report. Only SKUs the manifest marks
price_source: "snapshot" are covered. SKUs marked price_source: "live"
(hash: null) are never listed in changed because their price moved —
we cannot fingerprint them, so we do not claim to. Their prices can and do
move silently between polls. Read caveat 5 on /partner/catalog/manifest:
you must refresh that cohort yourself, and the manifest identifies exactly
which SKUs it contains.
now_live — cohort membership changes, and your manifest copy goes
stale. A SKU is not permanently in one cohort. When its market rows stop
carrying price data it crosses snapshot → live, and when a backfill
reaches it it crosses back. Either crossing is reported in changed once,
where it is indistinguishable from an ordinary price move — so now_live
is the field that tells them apart.
now_live is a subset of added ∪ changed: it lists exactly those SKUs
whose price_source is "live" as of to_snapshot. For every SKU this
response names, now_live supersedes the price_source value in the
manifest you downloaded:
- in
now_live→ it is nowlive. Move it into the set you refresh on your own schedule. From here on the delta will not report its price moving; it reappears only if it crosses back or isremoved. - named but not in
now_live→ it issnapshot-priced; the normal loop covers it. - not named at all → unchanged cohort and unchanged price if it was
snapshot-priced; no statement at all if it waslive.
Every delta this service writes carries now_live, so the field is always
present in the response (it may be an empty array). There is no
"older snapshot without the field" case to handle: the catalog store is
created by the same release as the builder, so no delta object predates it.
now_live cannot make this response larger than added + changed
already made it.
Re-download the manifest periodically anyway — we suggest weekly, and it
is the only way to re-baseline the three things the delta cannot express:
product metadata (caveat 2), SKUs absent from the snapshot entirely
(caveat 3), and the full membership of the live cohort (caveat 5). Do not
treat a manifest you downloaded once as permanently accurate.
400 responses, and what to do about each:
0011—sincemissing or empty. Fix the request.0010—sinceis older than the retained window, or the change chain from it is broken (a snapshot in between can no longer be diffed). There is no way to walk forward from that point. Fetch a fresh manifest.0013— the very next snapshot's change set alone is too large to return in one response, so there is no shorter prefix to fall back to. Fetch a fresh manifest.
All three mean the same thing operationally: stop polling this since,
re-download the manifest, and resume from its snapshot_id. That
terminates — the manifest's snapshot_id is the newest snapshot, so your
next delta call is the "already up to date" case (empty arrays,
truncated: false) until the next build. If 0013 recurs, you are seeing
genuinely large change sets: keep re-baselining from the manifest, which is
the cheaper transfer in that situation anyway.
A 503 (0012 / 0014) means the catalog is not currently servable — see
/partner/catalog/manifest. Fall back to the price endpoints.
Request
Responses
- 200
- 400
- 500
- 503
Changes since the given snapshot
Missing or unusable since
Internal server error
No snapshot is available to serve — 0012 (never built) or 0014
(the newest snapshot is too old to present as current). Fall back to
the price endpoints; they are unaffected.