APIFor developers at ecommerce brands, marketplaces and 3PLs

A shipping API for sellers.

Rates, labels with customs docs, tracking and webhooks, and address validation, as plain REST endpoints. Build UPS, FedEx, USPS, and DHL shipping into your store, marketplace tooling, or warehouse system.

covers
Rates · Labels · Tracking · Addresses
carriers
UPS · FedEx · USPS · DHL
style
REST + JSON, webhooks
POST/rates
// example request: compare rates, then buy a label
const rates = await ex.rates.create({
  from:   { country: 'ES', city: 'Barcelona' },
  to:     { country: 'US', city: 'Atlanta', state: 'GA' },
  parcel: { weight_oz: 8, length_in: 10, width_in: 8, height_in: 3 },
})

// buy the cheapest one, customs docs included
const label = await ex.labels.create({ rate: rates[0].id })
200rates from your carriers, cheapest firstexample request · exact fields in the API reference

how it fits

Your system on one side, the carriers on the other.

Your code talks to one API. ExperShip handles each carrier, returns rates and labels, and pushes tracking updates back to you as shipments move.

WHERE THE API SITSschematic

what you can build

Four building blocks for shipping in code.

The same features as the ExperShip web app, available through the API. Use one, or wire up the whole flow from order to doorstep.

rates

Multi-carrier rates

Send an origin, a destination, and a parcel. Get back live rates from the carriers on your account, cheapest first, so your code or your checkout can pick the right service.

  • Compare UPS, FedEx, USPS, and DHL in one call
  • Domestic U.S. and cross-border into the U.S.
  • Pick by price, delivery time, or your own rules
RATES Shopify #7323 → Philadelphiaexample response
#CarrierServiceNote
0FedExHome Deliverycheapest on-time
1USPSGround Advantagecompared
2UPSGroundcompared
3USPSPriority Mailcompared
rates[0] is the one your rules picked
labels

Labels, with customs docs for cross-border

Turn the rate you picked into a printable label. For parcels crossing into the U.S., the customs documents come back in the same step, so nothing is filled in by hand.

  • One label, or many in a batch
  • Customs paperwork alongside the label
  • The same call for every carrier
Amazon order · Barcelona → Atlantaexample request
// rates came back cheapest first; buy rates[0]
const label = await ex.labels.create({ rate: rates[0].id })

// cross-border parcel: label + customs form
// UPS Worldwide Expedited · Barcelona, Spain → Atlanta, GA
200label ready to print, customs docs included
tracking & webhooks

Tracking and webhooks

Every shipment you create can be tracked. Ask for its status any time, or register a webhook and let status updates come to you, in order, as the parcel moves.

  • Status updates pushed to your system
  • Keep your order records current automatically
  • Use them to notify buyers your own way
How webhooks work →
SHIPMENT Shopify #7323 · FedEx Home Deliveryexample
status
In transit
carrier
FedEx
destination
Philadelphia, PA
buyer
notified
address validation

Address validation

Check an address before you buy a label. Catching a typo at checkout or in your warehouse is cheaper than a returned parcel or a carrier correction later.

  • Validate at checkout or before printing
  • Get a corrected address back where possible
  • Stop bad addresses before they ship
ADDRESS CHECKexample
as entered

1200 main st
philadelphia pa

validated

1200 Main St
Philadelphia, PA 19103

deliverable · ready to label

api reference

Endpoints at a glance.

A plain-English map of what the API covers. Exact paths, fields, and responses are in the full API reference.

ENDPOINTS by areaillustrative · not the spec
AreaYou sendYou get backExample
RatesOrigin, destination, and parcel size and weightRates from your connected carriers, cheapest firstPOST /rates
LabelsThe rate you pickedA printable label, plus customs documents for cross-border parcelsex.labels.create(...)
TrackingA shipment you createdIts current status and historysee reference
WebhooksA URL on your sideStatus updates pushed to it as each shipment movessee reference
Address validationAn addressWhether it is deliverable, with a corrected version where possiblesee reference
Want the full reference? Get an API key, or ask us for access.Get an API key →Talk to us →

webhooks

Status updates come to you.

Instead of polling each carrier, give ExperShip a URL. As a shipment moves, its status updates are pushed to that URL in order, so your order records, dashboards, and buyer emails stay current.

  1. Register an endpoint

    A URL on your server that accepts JSON.

  2. Receive updates in order

    Each shipment's status changes arrive in the order they happened.

  3. Update your system

    Write the status to the order, trigger a buyer email, or flag a problem for your team.

STATUS UPDATES Shopify #7323example shipment
  1. 01
    Label createdFedEx Home Delivery
  2. 02
    Picked up by carrierfirst carrier scan
  3. 03
    In transitmoving through the network
  4. 04
    Out for deliveryPhiladelphia, PA
  5. 05
    Deliveredfinal status
plain-English labels · exact status names are in the API reference
your webhook handlerexample sketch
// your server: receive a status update, save it
app.post('/shipping-updates', async (req, res) => {
  const update = req.body
  await saveShipmentStatus(update)  // your code
  res.sendStatus(200)
})

Build shipping into your stack.

Get an API key and start with rates and labels. Planning a bigger integration, or shipping cross-border into the U.S.? Talk to us first.