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.
https://veloseller.com$ 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 }
/api/v1/ingestsend stock/api/v1/stockread stock/api/v1/metricsanalytics for every SKU/api/v1/summarywarehouse summary/api/v1/reorderreorder recommendations/api/v1/dynamicssales velocity trend/api/v1/sku/{sku}one SKU in detailCreate an “API source” warehouse
In the app → Warehouses → Add warehouse → “API source”.
Get a token
On the warehouse page press “Generate token”. It is shown once — save it.
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.
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).
/api/v1/ingestSend 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 }
]
}'/api/v1/stockRead 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.
curl https://veloseller.com/api/v1/stock \ -H "Authorization: Bearer vs_live_YOUR_TOKEN"
{
"warehouse": "8f3c1a2b-…",
"count": 128,
"items": [
{
"sku": "ART-001",
"product_name": "Mug",
"stock_quantity": 42,
"price": 590,
"updated_at": "2026-07-16T12:00:00Z"
}
]
}/api/v1/metricsAnalytics 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.
curl "https://veloseller.com/api/v1/metrics?needs_reorder=1" \ -H "Authorization: Bearer vs_live_YOUR_TOKEN"
{
"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"
}
]
}/api/v1/summaryWarehouse 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).
{
"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"
}/api/v1/reorderReorder 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.
{
"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
}
]
}/api/v1/dynamicsSales 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.
{
"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"
}
]
}/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).
{
"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 }
]
}skuReq.yesProduct code — the key we recognise the item by.
stock_quantityReq.yesCurrent stock, an integer ≥ 0.
priceReq.noPrice. If omitted, we keep the last known one.
product_nameReq.noProduct title. Updated when supplied.
| Field | Req. | Description |
|---|---|---|
| sku | yes | Product code — the key we recognise the item by. |
| stock_quantity | yes | Current stock, an integer ≥ 0. |
| price | no | Price. If omitted, we keep the last known one. |
| product_name | no | Product title. Updated when supplied. |
Success — { ok, parsed, inserted } or { items }
Bad data — the response names the offending sku
Token missing, invalid or revoked
Too often (limit 10 requests/min) — retry later
Temporary failure — retry with a delay (backoff)
| 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.
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.
- · 3 warehouses
- · 10,000 SKUs per warehouse
- · Full feature set, free
- · 2 warehouses
- · 1,000 SKUs per warehouse
- · 5 warehouses
- · 2,000 SKUs per warehouse
- · 15 warehouses
- · 10,000 SKUs per warehouse
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.