Create a Shippo Shipment object via POST /shipments with parcel dimensions/weight and from/to address objects; set async=false for synchronous rate retrieval
Retrieve the rates array from the response; each rate contains carrier, servicelevel.token, amount, estimated_days, and days_in_transit
Filter rates by estimated_days <= your SLA threshold, then sort ascending by amount to find the cheapest eligible option
Present the top N options to the consumer or automatically select the lowest-cost option that meets the SLA
Purchase the selected rate via POST /transactions using the rate object_id; retrieve the label_url and tracking_number from the response
Cache the Shipment object_id so you can re-rate without re-submitting address and parcel data if the user changes service preference
Known gotchas
Rates expire; the rate object_id is only valid for a short window (typically 5 minutes) so purchase must follow rate retrieval promptly
estimated_days is carrier-reported and not guaranteed; for SLA enforcement use days_in_transit which reflects actual transit time excluding same-day cutoffs
Shippo passes through carrier surcharges; the displayed amount may differ from the final invoiced amount if dimensional-weight recalculation occurs at carrier induction
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