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 scanFormId for each scan form you create (used for idempotency; reusing it after success can return 409).

Endpoint

POST https://marketplace.walmartapis.com/v3/shipping/scan-form

Request 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 scanFormId to a deterministic value so retries do not create duplicates (idempotency behavior).
  • Update shipOnDate (format yyyy-MM-dd).
  • Update fromAddress to match the pickup origin address used for the scan form.
  • Update trackingNumbers to include the tracking numbers for the EOD batch (1 - 200).
  • Update documentFormat to 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 document
  • status: outcome of the create request (spec indicates SUCCESS)

Error handling

Status codeDescriptionRemediation
400Invalid requestValidate required fields, ensure trackingNumbers is not empty, and confirm date/address formats.
409Scan form already exists for scanFormIdTreat as idempotency conflict. Do not create another scan form; retrieve the existing scan form using the previously returned manifestId.
429Rate limit exceededRetry with backoff; reduce request rate. Refer to the rate limiting guide for throttling limits.

Best practices

  • Use deterministic scanFormId values 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.





Did this page help you?