Partner product feed
Resellers can show your catalog on their website with their prices. A partner gets a read-only feed key in the partner portal and uses the same API as your own shop — with partner prices, retail prices and consignment stock.
Partner feed keys
- Created by the partner, not by you: a partner user opens Product feed in the partner portal and clicks Create feed key. They get a ready CSV link (
https://zerpy.app/api/v1/feed.csv?key=sk_feed_…) for shop importers and spreadsheets, and the key itself for their developer. - Key prefix
sk_feed_. The full key is shown once. - At most 5 active keys per partner.
- You stay in control: owners and admins see every partner key (labelled "Partner feed: partner name") in Integrations → API keys and can revoke it. Archiving the partner disables all their keys immediately (
401 invalid_api_key).
What a partner key can do
A partner key always has exactly products:read and stock:read:
| Endpoint | Partner key |
|---|---|
GET /products, GET /products/{sku} | Yes — only products that are sold |
GET /stock | Yes — only products that are sold |
GET /feed.csv | Yes (also with ?key=) |
/orders/** | No — 403 insufficient_scope |
| Webhooks | No — partners poll GET /stock or GET /products?updated_since=… |
Internal items such as raw materials are never visible, not even with include_inactive=true.
Differences from a company key
| Field | Partner key |
|---|---|
price | The partner's own price: their price list (fixed price or general discount) in the partner's sales currency. VAT rate 0 when sales to the partner are VAT-free (EU business with a VAT number, or outside the EU). null = price on request |
retail_price | Your standard price { net, vat_rate, gross, currency } in your company currency — usable as the recommended retail price. null if the standard price is 0 |
quantity_breaks | Volume discounts of the partner's price list: [{ "min_qty": 3, "discount_pct": 5 }]. Empty = none. In the portal the discount is applied to the order line when the partner orders that many |
stock.available | Your sellable stock (own warehouses, on hand − reserved, never below 0) |
stock.on_hand | Always null (internal) — use available |
stock.consignment | Your stock held at this partner's consignment warehouse(s) — goods physically at the partner |
options[].values[].price_delta | In the partner's prices (currency and price-list discount applied) |
| Language | Without ?lang=, name, description and option names are in the partner's document language (partner setting, else your company language for home-country partners and English abroad), when translated |
Example product (shortened):
{
"sku": "P1",
"name": "Widget",
"price": { "net": "8.00", "vat_rate": "24", "gross": "9.92", "currency": "EUR" },
"retail_price": { "net": "10.00", "vat_rate": "24", "gross": "12.40", "currency": "EUR" },
"quantity_breaks": [{ "min_qty": 10, "discount_pct": 5 }],
"stock": { "available": "6", "on_hand": null, "consignment": "4" },
"active": true
}GET /stock with a partner key:
{
"data": [{ "sku": "P1", "available": "6", "on_hand": null, "consignment": "4" }],
"page": 1, "limit": 500, "total": 1, "has_more": false
}CSV feed
GET /feed.csv?key=sk_feed_… returns the catalog as one CSV file (see Products → feed.csv). With a partner key:
price_net,price_gross,vat_rate,currency= the partner's price (empty = price on request).retail_price_net,retail_price_gross,retail_currency= your standard price.retail_currencycan differ fromcurrencywhen the partner buys in another currency.consignment= your stock at the partner.- Names and descriptions in the partner's document language unless
&lang=is given.
It works with shop import plugins, Google Sheets (=IMPORTDATA("https://zerpy.app/api/v1/feed.csv?key=…")) and Excel.
Keep the link private
Anyone who has the key or the feed link sees the partner's purchase prices. Do not publish the link on a public web page. If it leaks, revoke the key and create a new one.
Sync tips for the partner's developer
- Full sync: page through
GET /products?limit=200. A product that is no longer sold disappears from the response — deactivate products in the shop that are not in the latest full sync. - Changes:
GET /products?updated_since=<last updated_at>for product data,GET /stock(up to 500 products per call) every few minutes for stock. - Option prices and option changes do not change
updated_at— include options in the periodic full sync.