Guide

Connect your shop to
a wholesale API.

A step-by-step walk through automating wholesale with the Feed API REST API: syncing the catalogue, keeping stock current, placing orders that are safe to retry, and tracking them to delivery.

Last updated 29 SEPTEMBER 2026
Contents

What you can automate

Everything the dashboard does that matters to an integration: read your catalogue, place and manage orders with any supplier, read the stock ledger, list suppliers and categories, and manage webhook subscriptions. That is 23 endpoints across seven resources, at one base URL:

https://api.feedapi.co.uk/v1

This guide is the order to use them in. The API reference has every parameter and response in full.

Step 1: Get an API key

Generate a key in your reseller dashboard, under Settings → API Keys, and send it in the x-api-key header on every request. Keys begin with fapi_ followed by 64 hex characters.

Your first request

curl https://api.feedapi.co.uk/v1/products \
  -H "x-api-key: fapi_your_key_here"
  • Scopes. A new key has every access right. Limit it to the subset of the eight scopes your integration needs, and give it an expiry date if you want one.
  • Rate limit. 60 requests per minute, per account rather than per key.
  • Keep it server-side. Never put a key in client-side code or a public repository.

Details: Authentication.

Step 2: Sync the catalogue

Add the products you sell to your catalogue in the dashboard first: GET /products returns only products in your own catalogue, not the whole marketplace. Each product comes with its category, its supplier, and every active variant with its computed price.

Pull the full list once, then sync incrementally: pass updated_since with the time of your last successful sync and you get only what has changed since.

Incremental sync

curl "https://api.feedapi.co.uk/v1/products?updated_since=2025-06-20T00:00:00Z" \
  -H "x-api-key: fapi_your_key_here"

Reference: Products, Categories.

Step 3: Keep stock current

Stock you sell against has to be right. There are two ways to hear about changes, and most integrations use both:

  • Webhooks, as it happens. Subscribe to stock.low (a variant falls below its low-stock threshold), stock.out, product.updated and product.archived.
  • The stock ledger, as a check. GET /inventory/movements lists every stock change on variants in your catalogue, with the quantity before and after. Pass since with the time of your last sync to poll only what is new.

Reference: Inventory, Webhooks.

Step 4: Place orders safely

POST /ordersplaces an order with one supplier. The delivery address goes on the order, so it can be your customer's — the supplier ships straight to them. Shipping is calculated from the delivery postcode and the order's weight, and stock is decremented immediately.

Create an order

curl -X POST https://api.feedapi.co.uk/v1/orders \
  -H "x-api-key: fapi_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "supplier_id": "5f50e19c-09a0-4b45-8a96-4a9b53a97641",
    "items": [
      { "product_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "variant_id": "var-001", "quantity": 3 }
    ],
    "ship_name": "John Smith",
    "ship_line1": "10 Downing Street",
    "ship_city": "London",
    "ship_postcode": "SW1A 2AA",
    "ship_country": "GB",
    "ship_email": "john@example.com",
    "external_ref": "my-shop-order-9001"
  }'

Always send a reference

This is the one endpoint that takes a payment. Send your own external_ref (or the same value as an Idempotency-Key header) on every call: a retry carrying a reference you have already used returns 409 instead of placing a second order and taking a second payment. Without one, two identical calls place two orders.

The payment is taken from the card saved on your account — with no card on file the API answers 402 PAYMENT_REQUIRED. The money is then held until the order has been delivered and the return window has closed, as the escrow guide explains.

Reference: Orders, Error handling.

Step 5: Track fulfilment

Register an HTTPS endpoint with POST /webhooks and the order tells you where it is, instead of you asking:

  • order.status_updated — the order moves to confirmed or processing.
  • order.shipped — marked as shipped, with tracking.
  • order.delivered, order.cancelled and order.payment_released — the rest of the lifecycle.

Every delivery is signed with HMAC-SHA256 — verify the signature before trusting a payload, and reject any older than the 300-second replay window. Failed deliveries are retried. To look an order up directly, GET /orders/{id}/shipments and GET /orders/{id}/status-history return its tracking and its full history.

Reference: Webhook events.

Step 6: Cancellations and returns

  • Cancel with POST /orders/{id}/cancel. Only orders that are pending or confirmed can be cancelled, and their stock is restocked automatically.
  • Return with POST /orders/{id}/returns, within 14 days of delivery — after that the API refuses the request. Follow it with the return.created and return.status_updated webhooks.

What a cancellation refunds is set out on the pricing page. To start building, create a reseller account and generate a key — the full API reference is public.