SendifyAPI docs
Open Sendify

Shipping guides · 4 min read

How to Bill Customs Duties to a Third Party

Bill customs duties and taxes to someone other than the receiver.

This guide walks you through booking an international shipment where customs duties and taxes are billed to a third party (a "sold to" entity) instead of the receiver. We assume you have already completed our Getting Started guide and read How to Handle Shipments Outside of the EU.

Note

All example requests use the sandbox URL https://app.dev.sendify.se/ and will require a sandbox API key.

Prerequisites

  1. Complete the Getting Started guide – you need a valid x-api-key.
  2. You have the third party's carrier account number, and the postal code and country of that account.

1. Understanding the Third-Party Customs Payer

When goods are sold by one company but delivered to another, the company paying customs duties and import taxes is not always the receiver. By setting a third-party customs payer on the shipment, the carrier bills duties and taxes to the third party's carrier account instead of the receiver.

A few things to know:

  • The account number must be a valid account with the carrier of the rate you book (e.g., a UPS account for a UPS rate). Like receiver-pays accounts, Sendify cannot validate the account number up front — an invalid account surfaces as a carrier-side billing failure.
  • Only some carrier products support third-party duties billing. Each rate reports this via third_party_customs_payer_supported, and booking an unsupported rate is rejected while the shipment has a payer set.
  • A third-party customs payer cannot be combined with DDP incoterms (where the sender pays duties). Requests combining both are rejected.
  • The third party does not have to be in the same country as the receiver.
  • The payer only controls who is billed for duties and taxes. If the customs invoice should also name a different delivery address than the buyer, use alternative_to on the shipment.

2. Set the Payer on the Shipment

Include the third_party_customs_payer object when creating (POST /shipments) or updating (PUT /shipments/{id}) the shipment. All three fields are required when the object is present.

Example: POST /shipments request including third_party_customs_payer:

bash
curl --location 'https://app.dev.sendify.se/external/v1/shipments' \
--header 'x-api-key: $YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "enable_bookable_validation": true,
    "from": {
        "name": "Sendify AB",
        "address": {
            "address_line_1": "Östra Larmgatan 16",
            "country_code": "SE",
            "postal_code": "41107",
            "city": "Göteborg"
        },
        "contact": {
            "name": "Support Agent",
            "phone": "0103303091",
            "email": "contact@sendify.se"
        }
    },
    "to": {
        "name": "Receiver Inc",
        "address": {
            "address_line_1": "350 5th Ave",
            "country_code": "US",
            "postal_code": "10118",
            "city": "New York"
        },
        "contact": {
            "name": "Holger",
            "phone": "0707112233",
            "email": "holger@example.com"
        },
        "is_private_individual": false
    },
    "third_party_customs_payer": {
        "account_number": "1234567890",
        "postal_code": "41107",
        "country_code": "SE"
    },
    "customs_information": {
        "invoice_type": "commercial",
        "reason_for_export": "SALE",
        "currency": "SEK",
        "sender_eori_number": "SE1234567890",
        "sender_vat_number": "SE123456789001",
        "terms_of_sale": "DAP",
        "signature": "Support Agent",
        "items": [
            {
                "description": "Swedish Fika",
                "quantity": 1,
                "unit_type": "pcs",
                "unit_weight": 2,
                "unit_value": 100,
                "hs_code": "1905.31",
                "country_of_origin": "SE"
            }
        ]
    },
    "reference_id": "Sendify Shipment",
    "packages": [
        {
            "depth_cm": 20,
            "height_cm": 20,
            "width_cm": 20,
            "weight_kg": 2,
            "quantity": 1,
            "description": "Swedish Fika",
            "type": "PACKAGE",
            "stackable": true
        }
    ],
    "system": "Sendify"
}'

To change the payer later, PUT /shipments/{id} with new values. Omitting third_party_customs_payer on an update keeps the stored payer; sending an empty object ("third_party_customs_payer": {}) removes it.

3. Pick a Rate That Supports It

Request rates as usual with POST /shipments/rates. Each rate reports whether the carrier product can bill duties to a third party:

json
{
  "rates": [
    {
      "price_rank": 1,
      "shipment_id": "YOUR_SHIPMENT_ID",
      "booking_token": "BOOKING_TOKEN",
      "carrier_name": "UPS",
      "product_name": "UPS Standard",
      "third_party_customs_payer_supported": true
    },
    {
      "price_rank": 2,
      "carrier_name": "Another Carrier",
      "product_name": "Another Product",
      "third_party_customs_payer_supported": false
    }
  ]
}

Pick a rate with third_party_customs_payer_supported: true and save its booking_token. Do not request DDP incoterms — a shipment with a third-party customs payer is rejected for DDP rates.

4. Book the Shipment

Book with POST /shipments/book as usual:

bash
curl --location --request POST 'https://app.dev.sendify.se/external/v1/shipments/book' \
--header 'x-api-key: $YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "booking_token": "BOOKING_TOKEN"
}'

If the chosen rate does not support third-party duties billing, the booking is rejected with 422 Unprocessable Entity and an explanatory message — pick a supported rate or remove the payer from the shipment first.

5. Quick Recap

  1. Gather information: the third party's carrier account number, plus the postal code and country of that account.
  2. Create the shipment: include third_party_customs_payer (and customs_information for the customs invoice) in POST /shipments.
  3. Request rates: call POST /shipments/rates and pick a rate with third_party_customs_payer_supported: true.
  4. Book: call POST /shipments/book with the rate's booking_token.
  5. Done! The carrier bills customs duties and taxes to the third party's account.

Need help? Contact api@sendify.com and include the X-Sendify-Request-ID header from the relevant request if available.