Create Stock Take
POST/api/stock-takes
Create a new stock take.
inventory:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Authentication: Requires Bearer token.
status: defaults to draft if not provided.
date_count: defaults to today if not provided.
mode: full_count (default) or adjustment.
is_initial_count: marks this as the first ever count for the warehouse.
condition: optional condition label (e.g., 'new', 'used').
items: optional array of stock take line items. Can be added later. Each item: product_id (required, must exist), qty_counted (numeric, min 0), unit_cost (optional numeric, min 0 — an explicit 0 is valid and preserved, it does not fall back to the existing cost).
warehouse_id must be a standard (non-virtual) warehouse.
Response includes deletable (boolean) and delete_blocked_reasons (string[]): a draft/open stock take is always deletable; a closed stock take is deletable only when none of its FIFO cost layers have been consumed (otherwise deletable is false and delete_blocked_reasons lists the blocking stock take items).
Requires permission: inventory.count
is_blind (optional boolean, default false): a blind cycle count hides the system on-hand for items that have not yet been counted — their snapshot_inventory, snapshot_available, snapshot_reserved, and snapshot_committed_to_fulfillment are returned as null so the counter records what they find without anchoring to the expected quantity; once an item is counted the snapshots are revealed for variance review.
Each item may also carry variance_reason — a root-cause code for why the counted quantity differs from the system on-hand. One of: receiving_error, picking_error, damage, mislabel, shrinkage, unknown.
Request
Responses
- 200
- 401
- 403
- 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 — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
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.