Create scan form for labels
Overview and use cases
Create a scan form (also called a shipping manifest) that groups multiple labels so the carrier can scan a single document at pickup. The scan form consolidates shipments using tracking numbers for end-of-day (EOD) pickup and processing. Scan forms are generated for labels that ship on the seller-specified ship date (shipOnDate). Currently, only USPS supports scan forms.
Use this endpoint to:
- Generate a daily USPS manifest for pickup
- Consolidate up to 200 shipments into a single scan form
- Support EOD workflows and carrier handoff processes
- Enable automated scan form creation as part of shipping operations
Before you start
- You must be onboarded for Ship With Walmart (SWW).
- You need a valid access token for authentication.
- Keep a unique
scanFormIdfor each scan form you create (used for idempotency; reusing it after success can return 409).
Endpoint
POST https://marketplace.walmartapis.com/v3/shipping/scan-formRequest sample
curl --request POST \ --url 'https://marketplace.walmartapis.com/v3/shipping/scan-form' \ --header 'WM_QOS.CORRELATION_ID: b3261d2d-028a-4ef7-8602-633c23200af6' \ --header 'WM_MARKET: US' \ --header 'WM_SVC.NAME: Walmart Marketplace' \ --header 'WM_SEC.ACCESS_TOKEN: <Your_access_token>' \ --header 'WM_GLOBAL_VERSION: 3.1' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '{ "scanFormId": "SF-20250823-CA-001", "carrierName": "USPS", "shipOnDate": "2025-08-23", "fromAddress": { "contactName": "John Doe", "companyName": "Walmart", "addressLine1": "1375 Crossman Ave", "addressLine2": "Suite 100", "city": "Sunnyvale", "state": "CA", "postalCode": "94089", "country": "US", "phone": "6172012456", "email": "[email protected]" }, "trackingNumbers": [ "100044481029", "100044481030" ], "documentFormat": "PDF" }'import requests url = "https://marketplace.walmartapis.com/v3/shipping/scan-form" headers = { "WM_QOS.CORRELATION_ID": "b3261d2d-028a-4ef7-8602-633c23200af6", "WM_MARKET": "US", "WM_SVC.NAME": "Walmart Marketplace", "WM_SEC.ACCESS_TOKEN": "<Your_access_token>", "WM_GLOBAL_VERSION": "3.1", "Accept": "application/json", "Content-Type": "application/json",
} payload = { "scanFormId": "SF-20250823-CA-001", "carrierName": "USPS", "shipOnDate": "2025-08-23", "fromAddress": { "contactName": "John Doe", "companyName": "Walmart", "addressLine1": "1375 Crossman Ave", "addressLine2": "Suite 100", "city": "Sunnyvale", "state": "CA", "postalCode": "94089", "country": "US", "phone": "6172012456", "email": "[email protected]" }, "trackingNumbers": [ "100044481029", "100044481030" ], "documentFormat": "PDF"
} response = requests.post(url, headers=headers, json=payload) print(response.status_code)
print(response.text)Modify your code
You can customize the request to generate scan forms for different EOD batches:
- Update
scanFormIdto a deterministic value so retries do not create duplicates (idempotency behavior). - Update
shipOnDate(formatyyyy-MM-dd). - Update
fromAddressto match the pickup origin address used for the scan form. - Update
trackingNumbersto include the tracking numbers for the EOD batch (1 - 200). - Update
documentFormatto your preferred output format (description implies PDF, ZPL, PNG, BLOB).
Example customization
{ "scanFormId": "SF-20250824-CA-001", "carrierName": "USPS", "shipOnDate": "2025-08-24", "fromAddress": { "contactName": "Pickup Desk", "companyName": "My Warehouse", "addressLine1": "123 Warehouse Way", "city": "Sunnyvale", "state": "CA", "postalCode": "94089", "country": "US", "phone": "5551234567" }, "trackingNumbers": ["100044481029", "100044481030", "100044481031"], "documentFormat": "PDF"
}Response sample
{ "data": { "manifestId": "599010122", "status": "SUCCESS" }
}Results
A successful response returns:
manifestId: store this value to download the scan form documentstatus: outcome of the create request (spec indicatesSUCCESS)
Error handling
| Status code | Description | Remediation |
|---|---|---|
| 400 | Invalid request | Validate required fields, ensure trackingNumbers is not empty, and confirm date/address formats. |
| 409 | Scan form already exists for scanFormId | Treat as idempotency conflict. Do not create another scan form; retrieve the existing scan form using the previously returned manifestId. |
| 429 | Rate limit exceeded | Retry with backoff; reduce request rate. Refer to the rate limiting guide for throttling limits. |
Best practices
- Use deterministic
scanFormIdvalues for safe retries. - Persist
{scanFormId, manifestId}in your EOD run metadata. - Split into multiple scan forms if you exceed 4,000 tracking numbers.
- Use tracking numbers that correspond to the same ship date (
shipOnDate) and origin address (fromAddress) to avoid carrier pickup issues.. - Create scan forms once per ship date and pickup location to avoid operational confusion.
Next Steps
The Create label API lets you buy labels from Walmart to ship orders.
The Shipping estimates API provides the best rate to ship an order.
The Label details by purchase order ID API procures shipping label information on multiple orders such as label generation, carrier service type, shipment tracking, shipment protection, and signature protection.
The Supported carriers API provides a list of Walmart's approved carriers to ship orders.
The Download label API retrieves a carrier label by the carrier and tracking number.
The Discard label API removes shipping labels.
The Supported carrier package types API provides package types the carrier offers.
The Download scan form API downloads a scan form document from the manifestId.
The Get ship-on-date API provides recommendations for the default ship-on-date and maximum ship-on-date on seller orders.
Updated 14 days ago

