Create each Shipment with its own carrier, service, and carrier_accounts array before adding it to the Batch.
POST to /v2/batches with the array of shipment IDs; shipments in a Batch may use different carriers and carrier accounts.
Call the Batch buy endpoint to trigger asynchronous label purchase for all shipments in the Batch.
Poll the Batch status until all shipments reach purchased state, then retrieve the combined label PDF.
If you need a ScanForm (manifest), note that ScanForms require all included shipments to share the same carrier account — create separate ScanForms per carrier account if your Batch spans multiple accounts.
Known gotchas
A Batch itself does not require all shipments to share one carrier account; the same-carrier-account constraint applies to ScanForms (manifests), not to the Batch label-purchase workflow — treat any broader claim cautiously and verify against current EasyPost docs.
Each individual Shipment must have its carrier_accounts field set before being added to a Batch; shipments without a selected rate will fail at buy time.
EasyPost Batch label retrieval is asynchronous; poll the Batch object's status field and handle partial failures where individual shipments may error independently.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp