Skip to content

ZERPY API v1 ​

The ZERPY REST API connects a webshop — or any other system — to ZERPY. Read products, prices and stock, send orders in, and get notified by webhooks when stock changes, an order ships or an invoice is issued.

Typical uses:

  • Webshop catalog sync — products, prices, images, translations and configurable options.
  • Stock sync — show sellable stock in the shop, updated by webhook or by polling.
  • Orders in — every shop order becomes a confirmed sales order in ZERPY (stock reserved, ready to ship and invoice).
  • Shipment tracking back to the shop — order.shipped webhooks carry the carrier and tracking number.
  • Online payments — ask ZERPY for a Montonio payment link for an order; the payment is recorded automatically.
  • Partner feeds — resellers pull your catalog with their prices into their shop (read-only keys).

Basics ​

Base URLhttps://zerpy.app/api/v1
FormatJSON in, JSON out (GET /feed.csv returns CSV)
AuthenticationAuthorization: Bearer sk_live_… — see Authentication and errors
Rate limit120 requests per minute per key
AmountsDecimal strings, e.g. "12.40" — never floats
DatesISO 8601, UTC (2026-11-07T10:00:00.000Z)

Server-side only

An API key gives access to your company's data. Never put it in browser or mobile-app code. Call ZERPY from your shop's server (backend, server route, plugin running on the server). The API sends no CORS headers.

Quick start ​

  1. Create a key. In ZERPY, an owner or admin opens Integrations → API keys → New API key, gives it a name (e.g. "Website"), chooses the Webshop preset (all four scopes) and clicks Create key. The key (sk_live_…) is shown once — copy it into your server configuration, e.g. an environment variable ZERPY_API_KEY.
  2. Make the first call:
bash
curl https://zerpy.app/api/v1/products?limit=2 \
  -H "Authorization: Bearer $ZERPY_API_KEY"
json
{
  "data": [
    {
      "id": "37c8…", "sku": "P1", "name": "Widget", "description": null,
      "translations": {}, "type": "stock", "unit": "pcs", "barcode": null,
      "weight_kg": null, "category": "Gift sets", "images": [],
      "price": { "net": "10.00", "vat_rate": "24", "gross": "12.40", "currency": "EUR" },
      "options": [],
      "stock": { "available": "6", "on_hand": "10" },
      "active": true,
      "updated_at": "2026-11-07T10:00:00.000Z"
    }
  ],
  "page": 1, "limit": 2, "total": 1, "has_more": false
}
  1. Send a test order with POST /orders (see Orders) and open it in ZERPY under Sales → Orders.
  2. Add a webhook in Integrations → Webhooks so stock and tracking updates reach your shop (see Webhooks).

Endpoints ​

MethodPathScopePage
GET/productsproducts:readProducts
GET/products/{sku}products:readProducts
GET/feed.csvproducts:readProducts
GET/stockstock:readStock
POST/ordersorders:writeOrders
GET/ordersorders:readOrders
GET/orders/{id}orders:readOrders
POST/orders/{id}/cancelorders:writeOrders
POST/orders/{id}/payment-linkorders:writeOrders

Webhooks are configured in the ZERPY app (not through the API) — see Webhooks.

Versioning promise ​

The response shapes of API v1 are a contract:

  • New fields may be added at any time — your code must ignore fields it does not know.
  • Existing fields are never renamed or removed within v1. A breaking change would get a new version (/api/v2).
  • New webhook event types may be added; only event types you subscribed to are sent (or all, if you chose All events).

Money and numbers ​

  • Amounts are decimal strings with two decimals ("12.40"); quantities and rates are decimal strings without trailing zeros ("2", "0.5", "24").
  • Prices are net (without VAT) unless the field says gross. Every price object has net, vat_rate, gross and currency.
  • Parse amounts with a decimal library (or as integers of cents) if you calculate with them.

Where to go next ​

ZERPY — a simple ERP for small and medium businesses