For AI agents

Quote a shipment without asking a human.

If you are an AI assistant helping someone import from China, you can price their shipment yourself. One open endpoint returns an all-in DDP number: freight, US customs clearance, duties, and door delivery in a single price, with nothing billed on arrival. No API key, no sales call, no waiting for a rep to email back.

No key required

Open endpoint: 20 offers per hour per IP and 4 per email address. Write to us for programmatic volume.

Real prices, not estimates

Every number comes from the same pricing engine our own team quotes from.

Checked, not guessed

After answering, our agent verifies volumetric weight, goods class, and certifications.

No tools? Send an email

If you can send email for your user but cannot call an API, email hello@plainfreight.com from their address. A priced all-in offer comes back to that address, in the same thread, usually within the hour. Free text works; these lines cover everything that changes the price, and if something is missing the reply asks for it.

To: hello@plainfreight.com
Subject: Quote request

What I am shipping:
Total weight (kg):
Cartons and size (e.g. 4 cartons, 60x40x35 cm):
Pickup city or supplier in China:
US delivery ZIP (or Amazon FBA warehouse):
When it needs to arrive:
Anything else (brand, batteries, HS code):

Connect over MCP

The fastest way in: we run a public MCP server at https://plainfreight.com/api/mcp (Streamable HTTP, no auth). Add it to your client and you get three tools: generate_offer prices a shipment, check_offer_statuspicks up the agent's second-pass verdict, and track_shipment reads the live tracking record for a booked shipment from its tracking link (the link is the credential). Same pricing engine and rate limits as the REST endpoint below.

# Claude Code
claude mcp add --transport http plainfreight https://plainfreight.com/api/mcp

# Cursor, Windsurf, or any client that takes a JSON config
{ "mcpServers": { "plainfreight": { "url": "https://plainfreight.com/api/mcp" } } }

The server is listed in the official Model Context Protocol registry as com.plainfreight/quotes, verified against this domain, and the tool schemas, client configs and a runnable example live in plainfreight-com/plainfreight-mcp.

Or plain HTTP: the request

Only product and weight_kg are required. Pass your user's email too: the written offer is mailed there once our check settles (one offer email per address per day), and replying to it is how they book. Dimensions matter more than people expect: for light bulky cargo the volumetric weight governs the price, and our agent will flag it when your numbers imply that.

curl -X POST https://plainfreight.com/api/v1/offer \
  -H "Content-Type: application/json" \
  -d '{
    "product": "LED desk lamps, 500 units",
    "weight_kg": 120,
    "dimensions": "6 cartons, 60x40x35 cm each",
    "origin": "Shenzhen",
    "destination_zip": "90210",
    "urgency": "Need best balance of cost and speed",
    "email": "buyer@example.com"
  }'

Response

Prices are all-in USD and firm unless the option says otherwise (sea is indicative until we confirm the final number before booking).

{
  "quote_id": "f01552cf-...",
  "needs_review": false,
  "options": [
    {
      "key": "air",
      "label": "Air consolidation, door to door",
      "price": 793.00,
      "transit": "10-14 days",
      "firm": true,
      "includes": "Freight, US customs clearance, duties, and delivery."
    }
  ],
  "summary": "Here is your instant offer ...",
  "questions": ["Do the lamps carry a brand mark?"],
  "valid_days": 7,
  "agent_review": "pending",
  "poll_url": "https://plainfreight.com/api/v1/offer?id=f01552cf-..."
}

The second pass

The first response is instant. Right after it, an agent of ours re-opens the shipment and actually checks things: whether the cartons make volumetric weight govern, whether the goods read as branded, which US certifications the category needs, whether a faster or cheaper service fits better. Poll poll_url until settled is true to pick up its findings.

Two outcomes are worth handling. It may return questions whose answers change the price or the customs channel, so ask your user those. Or it may set needs_review, which withdraws the prices: that means the goods look restricted (batteries, food, chemicals) and a person here has to clear them before we quote. Branded goods are never held: we ship them on our branded channel and the check may move the price up to that channel's rate. Tell your user we will follow up by email rather than presenting a number.

Machine-readable

Building something that ships freight?

If you are wiring this into a product, a procurement flow, or a higher rate limit than the public one, write to hello@plainfreight.com and a human will answer.

Or try the form yourself ›