Create WFS Inbound Shipment
POST/api/walmart/:integrationInstance/wfs/inbound-shipments
Create a WFS inbound shipment from SKU.io — send the chosen SKUs/quantities into Walmart Fulfillment Services from a warehouse OR a supplier (exactly one). SKU.io enriches each SKU with the GTIN/UPC + description Walmart requires, generates a unique inboundOrderId, builds Walmart's Create-Inbound-Shipment-Order payload (returnAddress from the chosen warehouse's or supplier's address + orderItems), POSTs it to Walmart (POST /v3/fulfillment/inbound-shipments), and persists the shipment(s) Walmart returns — Walmart may split one inbound order across fulfillment centers, so data is an array. Typically driven from the inbound builder or the WFS Replenishment grid's cart ("Send to WFS").
Any valid API token can call this endpoint — no specific scope required. Manage tokens.
Request body:
- source_warehouse_id (integer) — the warehouse the stock ships from. Required unless source_supplier_id is given.
- source_supplier_id (integer) — the supplier the stock ships from (drop-ship into WFS). Required unless source_warehouse_id is given. Send exactly one of the two.
- items (required, array, min 1) — each: { sku (required string), quantity (required integer >= 1) }.
- items[].packing_type (optional, 'individual' | 'case_packed', default 'individual') — Seller Center's "Packing setup". Individual: each outer box holds one sellable unit. Case-packed: master cases of N units.
- items[].units_per_case (optional, integer >= 1, default 1) — sellable units per master case (Walmart's innerPackQty). Only meaningful for case_packed; quantity MUST divide evenly into cases (422 otherwise). SKU.io maps vendorPackQty = quantity / units_per_case (the case count).
- items[].prep_services (optional, array of 'LABEL' | 'BAG') — WFS Prep Services Walmart performs on receipt, sent as the order item's addOnServices. LABEL = item labeling ($0.45/unit), BAG = poly bagging ($0.60/unit) — billed by Walmart off its fixed rate card (the API carries no price field). Omit (or send []) for "Do it myself". Prep and packing are LOCKED once the IO is submitted — changing them means cancelling and recreating the inbound.
- items[].kit_fulfillment_mode (optional): for kit/bundle SKUs — 'kit_stock' (ship pre-built) or 'components' (assemble from components at the source; the build is deferred until the 3PL confirms 'Kits Built').
- expected_delivery_date (optional, date Y-m-d, must be today or later) — when the stock is expected to reach Walmart's fulfillment center. Walmart requires a non-null estimate; when omitted SKU.io defaults it to 7 days out and Walmart revises it on receipt.
Notes on the Walmart payload SKU.io builds: returnAddress.countryCode is sent as a 2-letter uppercase code (e.g. US), and per Walmart each item's itemQty must equal vendorPackQty × innerPackQty — individually packed items ship with innerPackQty 1, case-packed items with innerPackQty = units_per_case.
Each SKU must have a GTIN/UPC; a SKU without one is rejected (422) before any call to Walmart. Requires a Bearer token.
Request
Responses
- 201
- 401
- 403
- 404
- 422
- 429
Created
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.