Catalogue feed
Endpoints
GET /v1/catalog/full: full snapshot, generated once a day, starting at 02:00 UTC. Returns{ "generated_at", "count", "download_url" }. The file is gzip JSON Lines, one variant (size) per line, downloadable with the same API key for 24 hours. After loading a snapshot, chain/catalog/changesstarting from itsgenerated_at.GET /v1/catalog/changes?since=<ISO-8601>: every change since that time (price, stock, status, identifiers, attributes); how quickly each kind of change arrives is under Update times below.sinceis an ISO 8601 timestamp withZor an explicit offset (URL-encode a+). The answer is{ "items": [ ... ], "next_cursor": "..." | null }, at most 500 items per page. Whilenext_cursoris notnull, repeat the same call withcursor=<next_cursor>instead ofsince;nullmeans you have everything.
{ "items": [ { "sku": "WP-7Q2K9M-36", "status": "active", "price": 303.75, "...": "full record" },
{ "sku": "WP-3D8N4X-38", "status": "removed", "updated_at": "2026-10-19T10:00:00.000Z" } ],
"next_cursor": "eyJ0IjoiMjAyNi0xMC0xOSAx..." }
An active item is a full record you can upsert as it is. A removed item carries only sku, status and updated_at. For the next poll pass
as since the updated_at of the last item you received.
/catalog/changes can return the same item more than once: deduplicate by sku and keep the latest updated_at. A change becomes visible
after a short delay (about 2 minutes), so a page never skips a change that is still being written.
status:activemeans offered;removedmeans no longer offered, delete it. By default only variants in stock are offered: a variant that sells out is sent asremoved, and it comes back asactivewhen it returns to stock. If your account is set up to also receive sold-out variants, they arrive asactivewithinventory_qty: 0.
Update times
- Stock: every stock change is notified to us by Shopify and processed every minute. It normally appears in
/catalog/changeswithin 5 minutes, the 2-minute visibility delay included, and we are alerted when delays persist. If a notification is lost, a later catalogue refresh (next point) corrects the quantity. - Price, status, identifiers and attributes: re-read by a catalogue refresh scheduled every 15 minutes, which also re-reads every stock level. A change appears a few minutes after the refresh that reads it. A refresh can take longer than 15 minutes, be postponed when our server is busy, or fail and be retried; refreshes never overlap, so the next one starts at the first quarter of an hour after the previous one ends.
- Full snapshot: once a day, generation starting at 02:00 UTC.
The stock is the stock Wanan sees, which our vendors rewrite every 1 to 6 hours, and it is
shared with other sales channels. So inventory_qty can lag reality, and the order verifies stock live: an order line can still come back
out_of_stock (see Orders). When the channel is first switched on, the 5 minutes count from the moment our internal queue
has been cleared for the first time.
Identifiers
skuis the key: one per item and size, created for you, and it does not change while the item is offered. Use it in orders and to match changes. If a supplier replaces an item or changes a size, the oldskuarrives asremovedand the new one asactive; aremovedsku may also come back asactivelater.variant_idis our platform's variant reference. It is provided for reference and may change over time for the samesku. Never use it as a key. When you order asku, we translate it into its current variant.product_group_idgroups the sizes of the same item.mpnis the brand's style code.
Fields
Base fields, present for every partner:
| Field | Notes |
|---|---|
sku |
Key. |
variant_id |
Reference only. |
product_group_id |
Same value for every size of an item. |
mpn |
Brand style code; may be shared by several items in different colours; may be null. |
title |
English; may be null. |
brand |
The fashion brand; may be null. |
gender |
women, men or unisex; null when unknown. |
categories |
{ macro, sub, detail, product_type, taxonomy }: our three levels, the item type and the standard product taxonomy path. Any level may be null. |
description_html |
Plus composition and dimensions when available; each may be null. |
season |
Normalised, for example FW26; null when unknown. |
color |
Item colour; may be null. designer_color is reserved and currently always null. |
size, size_family |
For example 36 and FR; either may be null (size_family when the brand does not state it). |
price |
Your purchase price, VAT excluded, in your currency. |
compare_at_price |
Reference value from our store; may be null. |
currency |
As returned by your profile. |
inventory_qty |
Units available; typically 1 to 3 per size. |
barcode |
EAN/UPC when the brand provides it, otherwise null. |
image_urls |
List, the first is the main image. |
country_of_origin |
ISO 3166-1 alpha-2; null when not yet known. |
status, updated_at |
See above. |
Extra fields, only if enabled on your account (listed in extra_fields of the profile): weight_grams, hs_code.
Prices
priceis computed with the rule agreed for your account; it follows our sales, so it goes down when a sale starts and back up when it ends.compare_at_priceis a reference value (full price before sales); please do not show it to consumers as a "was" price.- The assortment offered to you may change at any time (for example brand distribution rules); removals arrive through
changes. - Your currency label applies to the same amount: it is never a conversion.