UPS — EU Regulatory Updates
- EasyPost is rolling out changes so you can supply the data UPS requests for the new EU regulation changes through the existing shipment API.
- Separately, UPS has temporarily suspended one Worldwide Economy lane it can no longer clear under the new rules. This guide covers all of these changes.
- For the broad, cross-carrier picture of the EU regulatory changes, see the EU Regulatory Updates guide.
What it is: two UPS carrier options, shipper_type and consignee_type, that classify the shipper (sender) and the consignee (recipient) of a shipment as a business or a consumer. EasyPost maps them to UPS's GlobalTaxInformation/ShipperTypeValue and GlobalTaxInformation/ConsigneeTypeValue fields on the shipment request.
Why it matters: UPS uses these classifications for EU de minimis customs handling. Providing them helps ensure shipments clear customs correctly; UPS may hold or return shipments into the EU that omit them.
EasyPost only passes the values through to UPS if set, and does not infer these values from other values (such as residential flags on an address).
How to use them: set them under options.carrier_options.ups when creating a shipment. Each is independent — send either one, both, or neither:
{
"shipment": {
"options": {
"carrier_options": {
"ups": {
"shipper_type": "business",
"consignee_type": "consumer"
}
}
}
}
}- Accepted values (both fields):
business,consumer. Anything else is rejected with a clear validation error. - Both are optional and independent. Omitting a field leaves that classification unsent; omitting both leaves the shipment unchanged from prior behavior (no
GlobalTaxInformationsent).
These values are sent on the GlobalTaxInformation block on the UPS ShipConfirm request. ShipperTypeValue always precedes ConsigneeTypeValue per the UPS schema sequence. For example, shipper_type: "consumer" + consignee_type: "consumer" produces:
<GlobalTaxInformation>
<ShipperTypeValue>02</ShipperTypeValue>
<ConsigneeTypeValue>02</ConsigneeTypeValue>
</GlobalTaxInformation>What it is: an optional address on each entry of a shipment's tax_identifiers, so you can supply the address (and, through it, the name) tied to a tax registration — e.g. the registered address behind an IOSS/VAT registration.
Why it matters: UPS exposes structured IOSS fields — Number + Name + Address — for shipments into the EU. Previously EasyPost's tax_identifiers only accepted the ID number and type, so there was no way to pass the registered name/address UPS wants. This change closes that gap.
{
"shipment": {
"tax_identifiers": [
{
"tax_id": "IM1234567890",
"tax_id_type": "IOSS",
"issuing_country": "DE",
"address": {
"name": "ACME GmbH",
"street1": "Friedrichstraße 1",
"city": "Berlin",
"zip": "10117",
"country": "DE"
}
}
]
}
}Or, referencing an existing saved address:
{
"tax_identifiers": [
{
"tax_id": "IM1234567890",
"tax_id_type": "IOSS",
"issuing_country": "IE",
"address": {
"id": "adr_5843b8dd903611f19a3d0022480b361d"
}
}
]
}addressaccepts either a reference to an existing saved address ({ "id": "adr_..." }) or a full address object- Optional; omitting it preserves current behavior.
- Fields are not specific to UPS and may be used by other carriers
When an IOSS tax identifier carries an address, EasyPost emits it as an IOSSContact under ShipFrom/VendorInfo on the UPS request:
<ShipFrom>
<CompanyName>Example Shipper LLC</CompanyName>
<AttentionName>Example Shipper</AttentionName>
<Address>
<AddressLine1>123 Example St</AddressLine1>
<AddressLine2>Suite 100</AddressLine2>
<City>Anytown</City>
<StateProvinceCode>CA</StateProvinceCode>
<PostalCode>90210</PostalCode>
<CountryCode>US</CountryCode>
</Address>
<PhoneNumber>5555550100</PhoneNumber>
<TaxIdentificationNumber>IMDEU1234567</TaxIdentificationNumber>
<TaxIDType>
<Code>IOSS</Code>
</TaxIDType>
<VendorInfo>
<VendorCollectIDNumber>IMDEU1234567</VendorCollectIDNumber>
<VendorCollectIDTypeCode>0356</VendorCollectIDTypeCode>
<IOSSContact>
<Name>ACME IOSS Ltd</Name>
<Address>
<AddressLine1>10 Rue de Rivoli</AddressLine1>
<City>Paris</City>
<PostalCode>75001</PostalCode>
<CountryCode>FR</CountryCode>
</Address>
</IOSSContact>
</VendorInfo>
</ShipFrom>What it is: a temporary guard that rejects UPS Worldwide Economy duty-unpaid (DDU) rate and buy requests destined for Germany (DE). WWE duty-paid (DDP) and every non-WWE UPS service are unaffected.
Why it matters: UPS asked EasyPost to temporarily stop sending WWE DDU to DE for both BYOA and the DAP program. EasyPost rejects these up front — a 422 at rate/buy time, before any UPS call — so you don't buy labels that would just be returned to sender. UPS currently has no ETA for when this service will be restored.
What's blocked vs. kept:
- Blocked: WWE duty-unpaid (DDU / DAP incoterm) to DE — all account types (BYOA and the DAP program).
- Kept: WWE duty-paid (DDP) to DE, and all non-WWE UPS services.
What you'll see:
- Rating or buying a WWE DDU shipment to DE returns a 422:
UPS Worldwide Economy is temporarily unavailable for duty-unpaid (DDU) shipments to Germany (DE). - On the DAP-program rate path the same rejection surfaces as
SHIPMENT.RATES.UNAVAILABLE.
A note on the two "DAP"s: "duty-unpaid" here is the incoterm (DDU / DAP = "Delivered At Place"), not the UPSDAP account type. The block keys off destination + duty status only, so it applies to BYOA and the DAP program alike, and never touches WWE DDP.
This is a temporary restriction and will be removed once UPS lifts it.
| Change | What it adds | Driver |
|---|---|---|
| Shipper & Consignee Type | carrier_options.ups.shipper_type / consignee_type (business/consumer) → UPS ShipperTypeValue / ConsigneeTypeValue | EU de minimis customs classification |
| Tax Identifier Address | optional address on tax_identifiers[] → UPS IOSS Name / Address | EU IOSS registered name/address |
| Worldwide Economy → Germany | temporarily blocks WWE duty-unpaid (DDU) rate/buy to DE (422); keeps DDP | UPS cannot clear WWE DDU volume into DE |