Push Inventory
POST/api/storefront/instances/:id/inventory/push-tracked
Queue an outbound inventory push for this connection and return immediately with the id of the tracked run, so progress can be polled.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
What gets sent: available quantity per SKU, variance-only. A SKU is included when its computed quantity or its backorder flag differs from what the store was last told, or when its last push did not succeed; everything already matching is skipped. The quantity is the sum over the connection's selected warehouses (or the tenant-wide total when none are selected), less the inventory buffer, floored at 0 — the same formula the comparison list shows as inventory.sku_quantity. SKUs the store does not recognise come back flagged as unknown; their listing is stamped with an unknown inventory push status, which the comparison then reports as unknown_on_store.
Request body (all fields optional):
force(boolean, optional, default false) — re-send every SKU, including the ones already in sync. Use it after changing the buffer or the selected warehouses, or to repair a store whose quantities were edited outside SKU.io.
Refusals. The run still starts and is recorded, but pushes nothing and finishes failed with a reason, when: the connection has no store URL or API key; the connection's master of stock is not SKU.io (a manual push does NOT override this — it is a statement about who owns the quantity); or outbound inventory sync is switched off for the connection. Outside production, scheduled pushes are additionally skipped unless explicitly enabled for the environment — a manual call through this endpoint is not affected.
Requires the integrations.sync permission. The response tracked_job_log_id identifies the run and its recorded results (items considered, pushed, skipped unchanged, batches sent, unknown SKUs).
Authentication: Bearer token (session or PAT).
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden
Response Headers
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.