Receive Warehouse Transfer Shipment
POST/api/warehouses/transfers/:transfer/receive
Records a receipt against a warehouse transfer, adding the received quantities to stock at the destination warehouse.
warehouses:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Fields: products (required array of {id: warehouse transfer line ID, quantity, shipment_line_id}), shipment_id (the shipment being received), receipt_date (defaults to now), blemished (array of {product_id, sku, quantity, condition, reference} - received units in damaged condition are booked in as a new blemished product with the given SKU), condition and integration_unique_id.
The transfer must be open.
Shipping is handled for you per line: any line in the request that has NOT been dispatched yet has a shipment created for the quantity being received, so a transfer can be received without calling the shipment endpoint first. This applies per line, so it still works when other lines on the same transfer already shipped.
A line that is only PARTLY dispatched is not auto-shipped — a receipt cannot be split across two shipments — so such a line yields only its already-dispatched remainder. Read quantity_shipped and quantity_receivable on the transfer's lines to see what a receipt can take. Requesting a receipt where nothing at all is receivable returns 422 rather than silently recording nothing.
Auto-shipping does not apply to channel-managed destinations (Amazon FBA/AWD, Walmart WFS), whose dispatch and receipt are driven by the channel.
Authentication: Requires Bearer token.
rechain_affected(optional bool, default false) — when the entry is dated earlier than existing consumption in an affected product/warehouse pool, opt in to re-anchor those later transactions to the oldest available stock (true FIFO) after the save commits. Runs as a background job; pools in a locked accounting period or with unsupported shapes are skipped and reported.
Serial numbers. products[].serials (optional array of strings) names the serials received on a serialized line. They must be In Transit on this shipment; otherwise the call returns 422. Without them, the oldest serials in transit are received. Received serials become In Stock at the destination. Deleting the receipt puts them back In Transit. Closing the transfer with a receiving discrepancy scraps the serials that never arrived, with the reason "Lost in transit".
Request
Responses
- 201
- 400
- 401
- 403
- 404
- 422
- 429
Created
Response Headers
Bad Request
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.