Skip to content
For developers · v1

OLY B2B API

Connect your ERP, WMS, or purchasing system directly to our wholesale platform. Pull live inventory, place orders by EAN, and reconcile order status — all over a simple REST API authenticated with a single API key.

<200ms
Inventory response p50
10k
Requests per hour, per key
EU
Hosted, GDPR-compliant

Use cases

Built for real wholesale workflows

Live inventory in your ERP

Poll /inventory every few minutes to keep your stock dashboard in sync. Per-EAN endpoint for low-frequency lookups.

Programmatic re-orders

Schedule orders from your purchasing system. Submit by EAN, get back order number + total + VAT breakdown.

Status reconciliation

GET /orders/{id} returns current status (awaiting_wire → paid → shipped → delivered) so your finance system can match payments.

EAN-first ordering

Skip product mapping — order by GTIN/EAN. Missing leading zeros and other dirty input are auto-normalised.

Reverse-charge ready

VIES-validated companies get 0% VAT automatically. The response includes the full breakdown for your accounting.

PO numbers preserved

Every order accepts your internal PO number. It flows through to invoice + shipping documents.

Quick start

From key to first order in 5 minutes

  1. 1

    Request an API key

    Email hello@ol-y.com with your account number. Keys are issued per company and tied to your wholesale pricing tier — orders use your account's discount automatically.
  2. 2

    Test your key

    curl https://ol-y.com/api/v1/public/ping \
      -H "X-API-Key: $OLY_API_KEY"
  3. 3

    Pull inventory

    curl "https://ol-y.com/api/v1/public/inventory?limit=200" \
      -H "X-API-Key: $OLY_API_KEY"
  4. 4

    Place your first order

    curl https://ol-y.com/api/v1/public/orders \
      -H "X-API-Key: $OLY_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "purchase_order_number": "PO-2026-0418",
        "payment_method": "wire",
        "items": [
          { "ean": "7350012340001", "qty": 24 },
          { "ean": "7350012340018", "qty": 12 },
          { "ean": "7350012340025", "qty": 6 }
        ],
        "shipping": {
          "first_name": "Kevin",
          "last_name":  "Tir",
          "company":    "Acme Wholesale GmbH",
          "street":     "Hauptstrasse 12",
          "postal_code":"10115",
          "city":       "Berlin",
          "country":    "DE",
          "email":      "purchasing@acme.example",
          "phone":      "+49 30 1234567"
        }
      }'

Reference

Endpoints

Base URL: https://ol-y.com · all responses are JSON wrapped in { success, data, error? }.

MethodPathScope
GET/api/v1/public/pingany
GET/api/v1/public/inventoryread:inventory
GET/api/v1/public/inventory/{ean}read:inventory
GET/api/v1/public/productsread:inventory
POST/api/v1/public/orderswrite:orders
GET/api/v1/public/ordersread:orders
GET/api/v1/public/orders/{id}read:orders

Node.js example

// Node.js — place a re-order from your ERP every Monday morning
const res = await fetch("https://ol-y.com/api/v1/public/orders", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.OLY_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    purchase_order_number: "PO-WEEKLY-" + new Date().toISOString().slice(0, 10),
    payment_method: "invoice",        // or "wire"
    items: weeklyReorder,             // [{ ean, qty }, ...]
    shipping: defaultShipTo,
  }),
});
const order = await res.json();
console.log("OLY order created:", order.data.order_number);

Order response shape

{
  "success": true,
  "data": {
    "order_id":             "8e2f...",
    "order_number":         "TG10421",
    "status":               "awaiting_wire",
    "payment_method":       "wire",
    "subtotal":             54000,        // minor units (cents)
    "vat_amount":           10260,
    "vat_rate_pct":         19.0,
    "vat_reverse_charge":   false,
    "total":                64260,
    "currency":             "EUR",
    "purchase_order_number":"PO-2026-0418",
    "items": [
      { "product_id": "...", "sku": "OLY-MAGN-001", "name": "Magnesium Bisglycinate", "quantity": 24, "price": 1500 }
    ]
  }
}

Authentication

X-API-Key header

Every request must include X-API-Key: vlx_live_…. Bearer tokens are also accepted: Authorization: Bearer vlx_live_….

Treat keys as secrets — store in env vars, never commit. Rotate via support if leaked.

Rate limits

10,000 / hour / key

More than enough for typical ERP polling (every 5 minutes = 12 calls/hour). Need higher quota for a marketplace integration? Contact us.

429 responses include a Retry-After header.

Ready to plug in?

We issue keys for active wholesale accounts on request. Your purchasing system, our catalogue — no manual order forms.

B2B API — Real-time inventory & order placement | OLY | Oly