Up to 500 entries, ONE insert in one transaction. Each entry is a movement that already happened in the source system: a ledger row is written with the entry's occurredAt as its timestamp, its externalId as hid and publicId (the idempotency key within the tenant: an entry whose publicId exists answers unchanged and is not touched), the product (by id or sku), the sides (a warehouseId addresses its floor location) and the balances as the counter snapshots. No stock counter, product embed or stock level is changed, no hid counter is allocated, and no event, legacy message or outbox row is written. Requires X-Import-Mode: historical (422 validation_failed, headers.x-import-mode, import_mode_required otherwise). Links (order, shipment, vendor) are best effort: an unresolved one is a warning (entries[i].links.<name>, not_found) and the row is written without it. 201 when any entry was created, 200 when every entry was unchanged; 400 validation_failed (shape, sign and side rules, a repeated externalId); 422 unresolved_reference (a product, warehouse or location that does not resolve).
Scope: products:write, channel:write or admin.
Idempotency: send Idempotency-Key; a retry with the same key replays the first answer.
Rate limit: write class, 1,200 requests per minute per tenant by default (read class 6,000). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a refusal is 429 rate_limited with Retry-After.
