Skip to content
Syncore

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.