Fulfill Order
POST/api/3pl/orders/:fulfillmentOrder/fulfill
Report a shipment for a fulfillment order — the partner confirms what it shipped. Creates one SalesOrderFulfillment against the FO (inventory + COGS post at ship-time), decrements each line's remaining, and advances the FO Open → Incomplete ("Partially shipped") → Closed.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Body:
lines(required, min 1):{id, quantity_fulfilled}whereidis the FULFILLMENT ORDER LINE id (from List Orders),quantity_fulfillednumeric ≥ 0 (clamped to remaining).fulfilled_at(required date): the actual shipped timestamp (drives COGS dating).shipping_method,tracking_number(optional).provider_shipment_id(optional): idempotent dedup — a retried fulfill never records a duplicate shipment.
All-zero report → 422.
Auth: 3PL Integration Token (Bearer).
A line the warehouse holds no stock for (a backordered / made-to-order item shipped anyway) returns 422 naming the blocking SKU — receive or adjust stock for it, then re-send.
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 — 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.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Unprocessable Entity
Response Headers
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.