Skip to content

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:

EndpointPartner key
GET /products, GET /products/{sku}Yes — only products that are sold
GET /stockYes — only products that are sold
GET /feed.csvYes (also with ?key=)
/orders/**No — 403 insufficient_scope
WebhooksNo — 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 ​

FieldPartner key
priceThe 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_priceYour 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_breaksVolume 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.availableYour sellable stock (own warehouses, on hand − reserved, never below 0)
stock.on_handAlways null (internal) — use available
stock.consignmentYour stock held at this partner's consignment warehouse(s) — goods physically at the partner
options[].values[].price_deltaIn the partner's prices (currency and price-list discount applied)
LanguageWithout ?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):

json
{
  "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:

json
{
  "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_currency can differ from currency when 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.