Get the current catalog manifest snapshot
GET/partner/catalog/manifest
Returns metadata for the newest catalog snapshot plus a presigned URL
to a gzipped NDJSON manifest of the SKUs that have a row in our
market-state store. This is not every priceable SKU — a SKU can be
priceable by GET /partner/lowest/{sku} and still be absent here; see
caveat 3. Do not use the manifest as your only source of SKUs to price.
The URL is requested with a 1 hour expiry and url_expires_at reports
that time, but it is signed with this service's own temporary
credentials, so it can stop working earlier if those credentials rotate
first. Treat a 403 from the URL as "re-request the manifest", not as an
error.
Use this instead of crawling SKU-by-SKU: download the manifest, keep it,
then poll GET /partner/catalog/delta?since={snapshot_id} and re-pull the
SKUs it reports (via POST /partner/lowest/bulk).
Re-download the manifest periodically — weekly is enough. The kept copy
is a point-in-time document and the delta cannot re-baseline it: it says
nothing about product metadata (caveat 2), nothing about SKUs that are not
in the snapshot (caveat 3), and it only reports price_source transitions
for the SKUs it happens to name (caveat 5, now_live).
That loop does not cover the whole manifest. Lines with
price_source: "live" are ones we cannot fingerprint, so the delta reports
nothing about them and you must refresh them on your own schedule. They are
labelled per line and counted in live_priced_sku_count. Read caveat 5
before you treat "not in changed" as "unchanged".
Each manifest line is one JSON object:
{"sku":"AT8086-002","sizes":15,"hash":"1f3a9c...","price_source":"snapshot","updated_at":"2026-07-31T08:12:03.000Z"}
hash is an opaque content fingerprint — compare it for equality only, never
parse it. hash may be null; see caveat 5.
Caveats — read these before building against it. Caveats 2, 3 and 5 are real limits of this endpoint, not edge cases: each one describes something the delta cannot tell you.
-
Snapshot granularity. The manifest is rebuilt on a schedule (default every 6 hours), so it is not real-time.
POST /partner/lowest/bulkandGET /partner/lowest/{sku}remain the price of record. -
Market state only. The hash covers listing/market state (sizes and their price buckets). A change to product metadata does NOT appear in
changed. That is the wholeproductobject (name,model,brand,gender_size,size_type,category) and alsosize_map.size_type, which is product metadata even though it is delivered insidesize_map. This matters: if a product'ssize_typeis corrected (e.g.US→EU), every size key in that SKU'ssize_mapchanges meaning, the hash does not move, and the SKU never appears inchanged. If you cachesize_map, re-pull product metadata on your own schedule; do not rely on the delta for it. -
The manifest is NOT the complete catalog. It lists SKUs that have a row in our market-state store. A SKU can be priceable by
GET /partner/lowest/{sku}and still be absent from the manifest, because that route can resolve a price from a source this snapshot does not read. Concretely: do not treat "absent from the manifest" as "does not exist", and do not use the manifest as your only source of SKUs to price. Conversely a SKU present in the manifest can still return400 / {"code":"0009"}from the price routes. Crawling the manifest minimises, but does not eliminate, "SKU not found" responses. -
Delisting. A SKU whose listings are all withdrawn normally stays in the manifest with a changed hash and an empty
size_map. It appears inremovedonly when its market rows are deleted outright. -
hash: null/price_source: "live"— the delta does NOT cover this cohort. Read this before you rely onchanged.price_source: "snapshot"(hashis a string): the fingerprint covers this SKU's price state. If the price moves, the SKU appears inchanged. The hash is computed over the underlying market rows, so it can also flip when the visible minimum did NOT move —changedmay contain a few no-op SKUs. For this cohort the delta over-reports and does not miss a price change.price_source: "live"(hashisnull): this SKU's price is served from a live source the snapshot cannot fingerprint, so we cannot tell you whether it moved. We do not guess. These SKUs are never reported inchangedon the basis of a price move, and their price CAN move without any delta ever mentioning them. They are listed explicitly in the manifest, andlive_priced_sku_counton this endpoint tells you how many there are, so the set is identified rather than hidden. You own the refresh cadence for them. Re-price them fromPOST /partner/lowest/bulk(orGET /partner/lowest/{sku}) on your own schedule — and pace it: these are exactly the SKUs we cannot answer cheaply, so a bulk request resolves only a handful of them and returns the rest indeferred. Currently a low single-digit percentage of the catalog and shrinking; it can temporarily become the entire catalog during an incident, which is visible aslive_priced_sku_count == sku_count.- Membership is not permanent, so the labels in the copy of the
manifest you keep go stale. A SKU crossing either way IS reported in
changed, once — and because that is indistinguishable from an ordinary price move, the delta response also carries anow_livearray naming which of the SKUs it reports are live-priced as ofto_snapshot. Honour it: a SKU appearing innow_livehas left the covered cohort, whatever your manifest copy says about it. From that point the delta will never again report its price moving; it will mention that SKU only if it crosses back (inchanged, and absent fromnow_live) or isremoved. Independently of that, plan to re-download the manifest periodically (weekly is enough) to re-baseline; a manifest you downloaded once is not permanently accurate.
So, precisely: for SKUs in the manifest with
price_source: "snapshot", the manifest → delta → bulk loop will not leave you holding a stale price, provided you also honournow_liveand move the SKUs it names into your own refresh schedule. Forprice_source: "live"SKUs the delta is silent by design; for SKUs absent from the manifest (caveat 3) it says nothing at all. In both of those cases the price routes remain authoritative and are the only thing that will tell you the current price. -
Staleness. The manifest is only as fresh as the last successful build. If the builder stops, this endpoint returns
503/ code0014rather than serving a frozen snapshot as though it were current. Also checkgenerated_atyourself — treat anything older than your polling interval by a wide margin as "fall back to the price routes".
Responses
- 200
- 500
- 503
Current manifest snapshot
Internal server error
No snapshot is available to serve.
0012— no snapshot has been built yet (expected only before the first build).0014— the newest snapshot is too old to be presented as current (the builder has stopped). We fail closed rather than serve a frozen snapshot as though it were fresh. The price endpoints are unaffected and remain authoritative; retry the catalog endpoints later.