REST API · stock and prices

Connect over the API

Push stock and prices straight from your own systems. One request is enough for Veloseller to start calculating shortages, lost revenue, dead inventory and purchase recommendations.

base urlhttps://veloseller.com
bash
$ curl -X POST https://veloseller.com/api/v1/ingest \
  -H "Authorization: Bearer vs_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "items": [
        { "sku": "ART-001", "stock_quantity": 42, "price": 590 }
      ] }'

← 200 OK
{ "ok": true, "parsed": 1, "inserted": 1 }
POST
/api/v1/ingestsend stock
GET
/api/v1/stockread stock
GET
/api/v1/metricsanalytics for every SKU
GET
/api/v1/summarywarehouse summary
GET
/api/v1/reorderreorder recommendations
GET
/api/v1/dynamicssales velocity trend
GET
/api/v1/sku/{sku}one SKU in detail
Quick start · 3 steps
1

Create an “API source” warehouse

In the app → Warehouses → Add warehouse → “API source”.

2

Get a token

On the warehouse page press “Generate token”. It is shown once — save it.

3

Send stock

POST to /api/v1/ingest with the token in the header. Every call is a fresh snapshot; we work out the movement ourselves.

Endpoints

Ingest, read and the whole analytics

Machine-readable OpenAPI 3.1 spec — /api/v1/openapi.json (import into Postman/Insomnia, generate clients). The lists /stock and /metrics support pagination (?limit&offset, fields has_more/next_offset).

POST/api/v1/ingest

Send stock

The token goes into the Authorization: Bearer … header. The body carries an items array — up to 50,000 items per call.

Response: { "ok": true, "parsed": N, "inserted": M }

curl -X POST https://veloseller.com/api/v1/ingest \
  -H "Authorization: Bearer vs_live_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "sku": "ART-001", "stock_quantity": 42, "price": 590 }
    ]
  }'
GET/api/v1/stock

Read stock

Pull back what Veloseller currently sees in your warehouse — the latest stock level and price for every SKU. Same token, handy for reconciling against your own system.

request
curl https://veloseller.com/api/v1/stock \
  -H "Authorization: Bearer vs_live_YOUR_TOKEN"
response · json
{
  "warehouse": "8f3c1a2b-…",
  "count": 128,
  "items": [
    {
      "sku": "ART-001",
      "product_name": "Mug",
      "stock_quantity": 42,
      "price": 590,
      "updated_at": "2026-07-16T12:00:00Z"
    }
  ]
}
GET/api/v1/metrics

Analytics for every SKU

The whole engine turned outwards: for each product — real sales velocity (TVelo), how many days the stock will last, out-of-stock days, lost revenue, segment, health, confidence and the “time to reorder” flag. ?needs_reorder=1 — only what has to be reordered.

request
curl "https://veloseller.com/api/v1/metrics?needs_reorder=1" \
  -H "Authorization: Bearer vs_live_YOUR_TOKEN"
response · json
{
  "warehouse": "8f3c1a2b-…",
  "period_days": 30,
  "count": 128,
  "items": [
    {
      "sku": "ART-001",
      "product_name": "Mug",
      "stock_quantity": 42,
      "price": 590,
      "velocity_per_day": 3.2,
      "days_of_cover": 13.1,
      "stockout_days_30d": 2,
      "lost_revenue": 1180,
      "segment": "fast",
      "health_score": 82,
      "confidence": 0.9,
      "needs_reorder": true,
      "updated_at": "2026-07-16"
    }
  ]
}
GET/api/v1/summary

Warehouse summary

Dashboard KPIs in a single request: warehouse health, inventory value, cash frozen in dead stock, lost and potential revenue, SKU counters (running low / out of stock / dead).

response · json
{
  "warehouse": "8f3c1a2b-…",
  "period_days": 30,
  "health_score": 76,
  "inventory_value": 3450000,
  "frozen_value": 820000,
  "lost_revenue": 142000,
  "potential_revenue": 320000,
  "sku_counts": {
    "total": 1883, "low_stock": 7, "out_of_stock": 3,
    "dead_inventory": 12, "inactive": 24, "frequently_oos": 5
  },
  "updated_at": "2026-07-16T02:40:00Z"
}
GET/api/v1/reorder

Reorder recommendations

A ready purchase list: how many units to order per SKU so that stock covers the horizon you need, lead time included. ?days=30 — how many days to buy for, ?lead_time=14 — lead time. Perfect for automated purchasing.

response · json
{
  "warehouse": "8f3c1a2b-…",
  "days": 30,
  "lead_time": 14,
  "count": 2,
  "items": [
    {
      "sku": "AB-100", "product_name": "Coffee 250g",
      "current_stock": 8, "velocity_per_day": 3.2,
      "days_of_cover": 2.5, "recommended_qty": 133,
      "reorder_now": true
    }
  ]
}
GET/api/v1/dynamics

Sales velocity trend

Who sped up and who slowed down: the two latest TVelo recalculations compared, with the change in percent. ?direction=up|down and ?limit=50. Trigger reordering on rising demand and markdowns on falling demand.

response · json
{
  "warehouse": "8f3c1a2b-…",
  "count": 2,
  "items": [
    {
      "sku": "AB-100", "product_name": "Coffee 250g",
      "velocity_now": 4.1, "velocity_prev": 2.6,
      "delta_pct": 57.7, "direction": "up"
    }
  ]
}
GET/api/v1/sku/{sku}

One SKU in detail

Everything about a single product: current metrics, velocity history in 30-day windows (for the sparkline) and the latest significant warehouse events (replenishments, anomalies, recalculations).

response · json
{
  "warehouse": "8f3c1a2b-…",
  "sku": "AB-100",
  "product_name": "Coffee 250g",
  "metrics": {
    "stock_quantity": 8, "price": 590,
    "velocity_per_day": 3.2, "days_of_cover": 2.5,
    "stockout_days_30d": 4, "lost_revenue": 12400,
    "segment": "fast", "health_score": 72,
    "confidence": 88, "needs_reorder": true,
    "updated_at": "2026-07-16"
  },
  "velocity_history": [
    { "date": "2026-06-16", "velocity_per_day": 2.6 },
    { "date": "2026-07-16", "velocity_per_day": 3.2 }
  ],
  "recent_events": [
    { "date": "2026-07-10", "type": "replenishment_like", "delta_stock": 200 }
  ]
}
Item fields
skuReq.yes

Product code — the key we recognise the item by.

stock_quantityReq.yes

Current stock, an integer ≥ 0.

priceReq.no

Price. If omitted, we keep the last known one.

product_nameReq.no

Product title. Updated when supplied.

Response codes
200

Success — { ok, parsed, inserted } or { items }

400

Bad data — the response names the offending sku

401

Token missing, invalid or revoked

429

Too often (limit 10 requests/min) — retry later

5xx

Temporary failure — retry with a delay (backoff)

Every call is a fresh snapshot

Send current stock once a day or every hour — as you like. Movement is derived between snapshots.

A token is a password

Shown once at creation, we store only the hash. Leaked — reissue it, the old one is revoked.

Plans and limits

The API is in every plan

There is no separate charge for the API. An “API source” is an ordinary warehouse: it counts against the warehouse limit of your plan, and so does the number of SKUs. Need more — take a higher plan.

Trial
35 days free
  • · 3 warehouses
  • · 10,000 SKUs per warehouse
  • · Full feature set, free
Starter
$29 /mo
  • · 2 warehouses
  • · 1,000 SKUs per warehouse
Growth
$79 /mo
  • · 5 warehouses
  • · 2,000 SKUs per warehouse
Pro
$149 /mo
  • · 15 warehouses
  • · 10,000 SKUs per warehouse

All plans →

10 / min
API requests — above that you get 429
50,000
items in one POST /api/v1/ingest
2,000
SKUs in one GET /api/v1/stock
Who it is for

Your own online store

Push stock and prices straight over the API — no files, no manual exports.

ERP / accounting system

Send stock and prices from your accounting system automatically, on a schedule or on an event.

Till / POS

Send stock and sales of offline stores to be analysed in one place.

In-house software

Integrate Veloseller with any system over the API. One request is enough to hand over the data.

Ready to connect?

Create an API warehouse, get a token — and the first POST can go out right now.

Start for free
Veloseller API — send stock with a token — Veloseller