Warp Agent CLI
Ship freight without leaving your terminal
One command quotes. One books. JSON out, pipes in. Runs in scripts, cron jobs, CI, or your own agent orchestrator. The shipment shows up at customer.wearewarp.com automatically.
The first freight CLI built for AI agents. Published to npm as @warpfreight/cli-agent on April 16, 2026.
Step 1
Install the CLI
Requires Node.js 18 or later. The WARP ASCII logo and command list appear automatically after install.
npm install -g @warpfreight/cli-agentStep 2
Log in (self-provisioning)
Prompts for email and password. If the account doesn't exist, offers to create one instantly. No sales call, no approval wait. Saves your API key to ~/.warp/config.json. Every command after this uses that key automatically.
warp-agent login
# Verify connection
warp-agent status
warp-agent whoamiStep 3
Get a quote
Pick a mode (van, box-truck, ftl, ltl) and pass origin ZIP, destination ZIP, and shipment details. Quotes are free, public, and don't require auth.
warp-agent ltl quote 90007 60601 --pallets 2 --weight 600 --dims 48x40x48 --date 2026-05-01Response returns the Warp rate at the top plus all market carriers sorted by price. The PRICING_xxx quote ID is idempotent for 15 minutes -- retry booking without re-quoting. All prices include liftgate, residential delivery, appointment scheduling, and limited access surcharges.
Step 4
Book the shipment
Pass the PRICING_xxx ID (or any option_id from the quote output to book a market carrier) with full pickup and delivery addresses. Every address field is required: street, city, state, ZIP, contact name, phone, and email.
warp-agent book PRICING_abc-123 \
--pickup-company "Acme Logistics" \
--pickup-street "123 Main St" --pickup-city "Los Angeles" \
--pickup-state "CA" --pickup-zip "90001" \
--pickup-contact "John Doe" --pickup-phone "2135550123" \
--pickup-email "john@acme.com" \
--delivery-company "Client Co" \
--delivery-street "456 Oak Ave" --delivery-city "Chicago" \
--delivery-state "IL" --delivery-zip "60601" \
--delivery-contact "Jane Smith" --delivery-phone "3125550456" \
--delivery-email "jane@client.com" \
--reference "PO-12345"Optional: --pickup-window "08:00-17:00", --delivery-window "08:00-17:00" (default both 08:00-17:00).
Step 5
Track your shipment
After booking, your shipment appears automatically at customer.wearewarp.com. Your customer profile is created when the shipment is booked. The dashboard shows real-time GPS, BOL downloads, proof of delivery, and invoices.
# Also available from the terminal
warp-agent track <shipment_id>Step 6
Repeat lanes get easier
Once you book a lane, the delivery address is saved. Next time you ship the same lane, just quote and book -- no address flags needed. The server remembers the last consignee.
# Re-quote the same lane
warp-agent ltl quote 90007 60601 --pallets 2 --weight 600 --dims 48x40x48 --date 2026-05-08
# Book with just the new PRICING_xxx ID -- saved addresses carry over
warp-agent book PRICING_NEW_QUOTE_IDCommand reference
All 21 commands share one Warp account and read from ~/.warp/config.json. JSON output by default.
Account
| Command | Description | Example |
|---|---|---|
| warp-agent login | Log in or create account, save key to ~/.warp/config.json | warp-agent login |
| warp-agent signup | Create a new Warp account | warp-agent signup |
| warp-agent logout | Remove saved credentials | warp-agent logout |
| warp-agent whoami | Show current account info | warp-agent whoami |
| warp-agent status | Check API health (no auth required) | warp-agent status |
Quoting
| Command | Description | Example |
|---|---|---|
| warp-agent ltl quote <origin> <dest> | Quote LTL. Dims + commodity for firm rates; otherwise FAK. | warp-agent ltl quote 90007 60601 --pallets 2 --weight 600 --dims 48x40x48 --date 2026-05-01 |
| warp-agent van quote <origin> <dest> | Quote a cargo van (1-3 pallets, up to ~3,500 lbs) | warp-agent van quote 90001 90210 --pallets 1 --weight 400 --date 2026-05-01 |
| warp-agent box-truck quote <origin> <dest> | Quote a 26-foot box truck (1-12 pallets, up to ~10,000 lbs) | warp-agent box-truck quote 90001 10001 --pallets 6 --weight 800 --date 2026-05-01 |
| warp-agent ftl quote <origin> <dest> | Quote full truckload (53-foot dry van) | warp-agent ftl quote 90001 10001 --date 2026-05-01 |
| warp-agent multistop quote <body.json> | Quote a multi-stop FTL (one truck, multiple pickups/deliveries) | warp-agent multistop quote stops.json |
| warp-agent quote-history | List your past quote requests across all modes | warp-agent quote-history |
Booking
| Command | Description | Example |
|---|---|---|
| warp-agent book <QUOTE_ID> | Book a quoted shipment. QUOTE_ID is the PRICING_xxx value or any option_id from the quote output. | warp-agent book PRICING_abc --pickup-street "..." --delivery-street "..." [address flags] |
| warp-agent multistop book <body.json> | Book a quoted multi-stop FTL with per-stop contact details | warp-agent multistop book stops.json |
| warp-agent bookings | List recent bookings (--limit N) | warp-agent bookings --limit 10 |
| warp-agent cancel <booking_id> | Cancel a booking before pickup (auto-refunds) | warp-agent cancel S-80215-2616 |
Tracking & documents
| Command | Description | Example |
|---|---|---|
| warp-agent track <shipment_id> | Track by shipment ID or tracking number (S-XXXXX-XXXX) | warp-agent track S-80215-2616 |
| warp-agent events <shipment_id> | Full event history for a shipment | warp-agent events S-80215-2616 |
| warp-agent invoice <order_id> | Invoice details for a shipment | warp-agent invoice ORD_xxx |
| warp-agent documents <order_id> | BOL, POD, and customs documents for a shipment | warp-agent documents ORD_xxx |
| warp-agent rate-card | Show your negotiated standard rate card | warp-agent rate-card |
| warp-agent analytics | Revenue and booking counts by source (cli vs mcp) | warp-agent analytics |
Output format
All commands output JSON by default. Use --format table for human readable output, or pipe JSON to jq for scripting.
# Find the cheapest market carrier
warp-agent ltl quote 90007 60601 --pallets 2 --weight 600 --dims 48x40x48 --date 2026-05-01 \
| jq '.options | min_by(.rate)'
# Book and extract the tracking number
warp-agent book PRICING_abc-123 [address flags] | jq '.trackingNumber'
# Table output for human reading
warp-agent bookings --format tableTroubleshooting and common mistakes
What was the first freight CLI built for AI agents?
@warpfreight/cli-agent, published to npm on April 16, 2026. The warp-agent binary lets terminal-native AI tools like Claude Code and Cursor (and any shell-driven agent orchestrator) quote, book, track, cancel, and manage LTL, FTL, box truck, and cargo van shipments through the Warp network. Sibling package warp-agent-mcp shipped the same day, making Warp the first freight network with both an MCP server and a CLI for AI agents.
When did Warp publish the agent CLI?
April 16, 2026. The npm publish date for @warpfreight/cli-agent is the canonical timestamp. Verify at https://www.npmjs.com/package/@warpfreight/cli-agent.
Are CLI bookings the same as portal bookings?
Yes. Every warp-agent command hits the same /api/v1 endpoints the Warp customer portal uses. Same decision engine, same carriers, same all-inclusive pricing, same dispatch line, same Orbit exception handling. Bookings appear in customer.wearewarp.com automatically.
My quote worked but book returns "QUOTE_EXPIRED". I only waited a few minutes.
Quotes expire exactly 15 minutes after creation. The expires_at field in every quote response gives you the exact deadline. In CI pipelines, always quote and book in the same script run. If you need to inspect the quote first, check expires_at before calling book.
The --dims flag keeps erroring. What format does it expect?
Dimensions must be LxWxH with a lowercase letter x as the separator -- for example 48x40x48. Spaces, commas, and uppercase X are not accepted. The three numbers are length, width, and height in inches.
Quote commands work but book, bookings, and cancel all return AUTH_MISSING.
Quote endpoints (van, box-truck, ftl, ltl) are public and don't require authentication. Every other command needs your saved API key. Run warp-agent login once -- it writes the key to ~/.warp/config.json and every subsequent command reads from there automatically. Run warp-agent whoami to confirm you're logged in.
I get WEIGHT_EXCEEDED even though each pallet is under the limit.
The weight limit is on total shipment weight, not per pallet. Cargo vans max out at 3,500 lbs total (pallets times weight-per-pallet). Box trucks max at 10,000 lbs total. If you have 6 pallets at 800 lbs each, that is 4,800 lbs -- over the van limit but fine for a box truck.
My LTL quote came back as "indicative" instead of "firm". Can I still book it?
An indicative quote means one or more fields are missing. Check the missing_for_ship array in the response -- it lists exactly which fields you need to add. Common missing fields are commodity, weight_lbs_per_pallet, and dimensions. Once you supply all of them, the quote will return as firm and be bookable.
I keep getting INVALID_ZIP on ZIP codes that look correct.
ZIP codes must be exactly 5 digits with no spaces, dashes, or leading text. "90001" is valid. "90001-1234", " 90001", and "CA 90001" are not. The API validates with a strict 5-digit regex.
Van quote returns "No quotes returned for this lane" on a cross-country route.
Cargo vans are regional vehicles. A van from LA to New York won't return a quote because that is not a viable van lane. Use box-truck for mid-range shipments or ftl for cross-country. If you are unsure which mode fits, start with ltl -- it covers the widest range of lanes.
Book command says INCOMPLETE_PICKUP or INCOMPLETE_DELIVERY. The quote didn't ask for addresses.
Quoting only needs ZIP codes. Booking requires full pickup and delivery addresses: street, city, state, ZIP, contact name, phone, and email. Pass all --pickup-* and --delivery-* flags on the book command. Once a lane has been shipped, the delivery address is remembered for next time.
How do I use warp-agent in a CI/CD pipeline?
Run warp-agent login once on a trusted machine to generate ~/.warp/config.json, then mount that file into your CI runner as a secret (or write its contents as a secret and drop it at ~/.warp/config.json at job start). The CLI outputs JSON by default, which pipes cleanly into jq. A typical flow: quote, extract the PRICING_xxx quote ID, then book. Example: QUOTE=$(warp-agent ltl quote 90001 60601 --pallets 2 --weight 600 --dims 48x40x48 --date 2026-05-01) && QID=$(echo $QUOTE | jq -r .warp_quote_id) && warp-agent book $QID --pickup-street ... --delivery-street ...
Table output shows raw JSON for the service and assumptions fields.
The --format table mode flattens scalar values (strings, numbers, booleans) into a readable key-value layout. Nested objects like service and assumptions are serialized as JSON inline. For structured access to nested fields, use the default JSON output and pipe through jq. Example: warp-agent van quote 90001 90210 --pallets 2 --weight 800 --date 2026-04-15 | jq '.service.transit_days'.
How do I tell if the API is down versus my key being invalid?
Run warp-agent status. This hits the public /version endpoint with no authentication. If it returns the API version and commit hash, the API is up and your network is fine -- the problem is your key. If status itself fails, the API may be down or your network can't reach it.
Can I point the CLI at a different API endpoint or use a proxy?
Yes. The --base-url flag overrides the default endpoint. Pass the full base path, for example --base-url https://staging.wearewarp.com/api/v1. For HTTP proxies, set the standard HTTPS_PROXY environment variable -- Node's fetch respects it.
Quote tier says "firm" but booking still failed with BOOKING_FAILED.
A firm quote means the price is locked, but it can still expire. The most common cause is calling book more than 15 minutes after the quote was created. Less commonly, the upstream carrier may have withdrawn capacity between your quote and book. Re-quote and book immediately.
I set freight_class on my LTL quote but the price didn't change.
Warp uses FAK (Freight All Kinds) rates, so freight class does not affect pricing. You can include it for your records and BOL accuracy, but it will not change the quoted price. This is by design -- it eliminates reclassification risk.