Inventory
Your own stock per SKU (separate from the supplier's stock). Every change is logged as a stock movement and sends a stock.changed webhook — and stock.low when it drops to the low-stock threshold.
| Endpoint | Ability |
|---|---|
GET /inventory |
inventory:read |
PUT /inventory/{sku} |
inventory:write |
POST /inventory/bulk |
inventory:write |
List
curl -s "https://app.syncore.gr/api/v1/inventory?search=ABC" -H "Authorization: Bearer $SYNCORE_TOKEN"
{
"data": [
{ "product_id": 1201, "sku": "ABC-1001", "name": "Sample product", "quantity": 12, "reserved": 2, "last_sync_at": "2026-10-29T10:00:00+02:00" }
],
"meta": { "current_page": 1, "per_page": 25, "total": 1, "last_page": 1 }
}
reserved is the number of units reserved by open orders.
One SKU
curl -s -X PUT "https://app.syncore.gr/api/v1/inventory/ABC-1001" \
-H "Authorization: Bearer $SYNCORE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"quantity": 40, "notes": "Received at warehouse"}'
quantity is required (integer ≥ 0), notes optional. Answers with the new stock row; 404 if the SKU is not in your catalog.
Bulk (up to 500)
curl -s -X POST "https://app.syncore.gr/api/v1/inventory/bulk" \
-H "Authorization: Bearer $SYNCORE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"items": [{"sku": "ABC-1001", "quantity": 40}, {"sku": "ABC-1002", "quantity": 0}, {"sku": "NOPE-1", "quantity": 3}]}'
{
"data": {
"updated": ["ABC-1001", "ABC-1002"],
"failed": [],
"not_found": ["NOPE-1"]
}
}
The request does not fail as a whole for one unknown SKU: check the failed and not_found lists.