How to Insure a Shipment

Protect parcels against loss and damage in transit. Insure shipments you create with Easyship, or insure parcels you ship with labels from other providers.

What it does
Buys an insurance policy for a parcel
Works with
Easyship labels and labels from other providers
Price
Easyship labels: the insurance fee shown on the rate · Other providers: 1% domestic, 1.5% international (min USD 0.49)
Max cover
USD 10,000 per shipment (or equivalent)

Choose your flow

Start with one question: is the label for this shipment from Easyship or another provider?

FLOW A
I buy labels through Easyship

Turn on insurance when you create the shipment, or add it within 24 hours of the label being generated.

Go to Flow A →

FLOW B
I buy labels from other providers

Get a price now (valid for 48 hours). Convert it to a policy once you have the tracking number.

Go to Flow B →

Before you start

ItemValue
Base URLhttps://public-api.easyship.com/2024-09
Sandbox: https://public-api-sandbox.easyship.com/2024-09
Flow A scopepublic.insurance_policy:write
Flow B scopespublic.insurance_quote:write, public.insurance_policy_from_quote:write
List / cancel scopespublic.insurance_policy:read / public.insurance_policy_from_quote:write
PaymentFees are charged to your Easyship balance. Easyship labels are charged when the label is bought; labels from other providers are charged once cover is confirmed
Both flows must be enabled for your account. Flow A (/insure) is available on request, and Flow B requires an updated contract. Contact your account manager or Easyship Support before you start building.

Flow A: Shipment with an Easyship label

Step 1
Create shipment
with insurance enabled
→
Step 2
Buy label
policy is created
  1. Option 1: Turn on insurance when you create the shipment (recommended)

    Add an insurance object to Create a Shipment (or Update a Shipment before the label is bought). The policy is created automatically when the label is bought, and the fee charged is the insurance_fee shown on the rate. If you leave out insured_amount, Easyship uses the total customs value of the items.

    Request bodyPOST /2024-09/shipments (excerpt)
    "insurance": { "is_insured": true, "insured_amount": 250, "insured_currency": "USD" }
  2. Option 2: Add insurance after the label is bought

    Call this endpoint within 24 hours of label generation. The label must already be generated, and the shipment must not be cancelled or already insured. The request has no body.

    cURLPOST /2024-09/shipments/ESUS100000001/insure
    curl -X POST https://public-api-sandbox.easyship.com/2024-09/shipments/ESUS100000001/insure \ -H "Authorization: Bearer $EASYSHIP_TOKEN"
    Response201 Created
    { "success": { "message": "Insurance successfully purchased" } }

Flow B: Shipment with a label from another provider

Step 1
Get a quote
POST /insurances/quotes
→
Step 2
Show the fee
total_insurance_fee
→
Step 3
Create the policy
POST /insurances/policies-from-quote
  1. Create a quote

    No tracking number is needed. Easyship checks the route and each product's category, then returns the fee.

    cURLPOST /2024-09/insurances/quotes
    curl -X POST https://public-api-sandbox.easyship.com/2024-09/insurances/quotes \ -H "Authorization: Bearer $EASYSHIP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "quote": { "insured_value": 200, "currency": "USD", "origin_country": "US", "destination_country": "GB", "products": [ { "category": "Fashion", "price": 100, "quantity": 2, "description": "T-shirt" } ] } }'
    Response201 Created
    { "insurance_quote": { "quote_id": "af8f1016-6910-4f1b-b909-49a8fc48919c", "total_insurance_fee": 3.0, "insurance_fee_currency": "USD", "valid_until": "2026-10-17T12:21:00Z", "products": [{ "insured_eligibility": true, "insured_fee": 3.0 }] } }
    FieldRule
    insured_valueTotal amount to insure. Must be greater than 0, no more than the sum of price × quantity, and no more than USD 10,000 (or equivalent)
    currencyRequired. ISO 4217 code, for example USD. Must be a currency Easyship supports — if it isn't, the quote fails with Currency not supported. Contact your account manager if you need a currency added
    origin_country / destination_countryISO 3166-1 alpha-2 codes. Insurance must be available for both countries
    products[].categoryRequired. Use a name from List all Item Categories
    products[].priceRequired. Unit price
    products[].quantityOptional, defaults to 1
    products[].platform_product_idOptional. If it matches a product saved in Easyship, its saved category is used

    Show total_insurance_fee to the buyer. Products in categories that can't be insured are returned with insured_eligibility: false and insured_fee: 0, and their value is left out of the cover.

  2. Convert the quote into a policy

    Do this once you have a tracking number and before valid_until. A quote can be used only once.

    When you're charged. Creating the policy doesn't charge you straight away. Easyship first checks that your balance covers the fee, then creates the policy as pending (awaiting) and begins tracking the parcel. Once the first tracking update arrives — usually within a few hours — Easyship confirms whether the parcel is eligible for cover:
    • Eligible — the policy becomes active and the fee is deducted from your balance.
    • Not eligible — the policy is canceled, the quote is voided, and you are not charged.
    • Balance no longer sufficient — the policy stays awaiting and nothing is deducted. Top up your balance and the policy can still activate on a later tracking update.
    Use a tracking number the courier already recognises. If Easyship can't start tracking the parcel, both the policy and the quote are voided. Because a quote can only be used once, that quote_id can't be retried — you'll need to create a new quote and convert that one instead.
    cURLPOST /2024-09/insurances/policies-from-quote
    curl -X POST https://public-api-sandbox.easyship.com/2024-09/insurances/policies-from-quote \ -H "Authorization: Bearer $EASYSHIP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "policy": { "quote_id": "af8f1016-6910-4f1b-b909-49a8fc48919c", "tracking_number": "1Z999AA10123456784", "courier_service_name": "DHL Express Worldwide", "policy_holder_type": "merchant", "email_address": "[email protected]", "first_name": "John", "last_name": "Doe" } }'
    Response201 Created
    { "insurance_policy": { "policy_id": "IPUS10000103", "insured_value": 200.0, "insurance_fee": 3.0, "currency": "USD", "tracking_number": "1Z999AA10123456784", "status": "Policy Created Successfully" } }
    FieldRule
    quote_id, tracking_number, email_address, first_name, last_nameRequired
    courier_service_nameRequired. Must be one of the courier names listed in the API reference, for example, DHL Express Worldwide
    policy_holder_typemerchant (default) or buyer
    Optionalorder_number, order_date, ship_date, phone, send_email, shipping and billing address fields
    Where to find these policies. Quote-based policies don't appear on the Easyship dashboard. Once a policy is active, Easyship emails the policyholder a link to the claims portal, where they can file claims.

List and cancel policies

TaskEndpoint
List policies (filter by policy_type, easyship_shipment_id, state, recipient, source)GET /insurances/policies
Cancel a policy created from a quote. This works only while the policy is still pending (awaiting) — that is, before cover is confirmed. Policies for Easyship labels can't be cancelled here (the request returns 404)POST /insurances/policies/{policy_id}/cancel

FAQ and common errors

What happens if I miss the 24-hour window to add insurance?
/insure works only within 24 hours of label generation. Next time, turn insurance on when you create the shipment.
Can I insure a parcel worth more than USD 10,000?
No. The cap is USD 10,000, or its equivalent in the currency you send. Above this limit, the request fails with Insured value exceeds the maximum allowed for the specified currency.
Why is a product marked as not eligible?
Its category can't be insured. Check the category you sent. If the route itself isn't covered, the quote fails with Insurance is not available for shipments originating from / destined to the specified country.
My quote expired. Can I still use it?
No. Quotes are valid for 48 hours and can be used only once. An expired quote returns Your insurance quote has expired, create a new quote to continue.
Why did my request fail with an insufficient balance error?
Easyship checks your balance before creating the policy. For Easyship labels the fee is taken when the label is bought; for labels from other providers it's taken once cover is confirmed. Top up your balance and try again.
What does Unable to identify courier service mean?
courier_service_name must match one of the names in the API reference exactly.

Did this page help you?