Send version for optimistic concurrency (409 version_conflict on a stale one). Line quantities are totals and stay within the order line's open quantity and at or above what was fulfilled; the reservation follows every change (a warehouse change moves it to the new queue; a hold releases it; releasing the last hold reserves the open quantity again). Nothing changed: outcome unchanged, nothing written. Closed and canceled fulfillment orders refuse (409), except jobStatus open or scheduled, which reopens a canceled one.
Scope: fulfillment:write, channel:write or admin. A permission group made before the Channel API scopes existed grants it as fulfillment-orders:manage.
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.
