EU Regulatory Updates
To comply with new EU regulatory mandates, EasyPost now supports the required shipping data through the shipment and orders API. Most of the required information was already supported through existing fields; a few new parameters cover specific regulatory additions.
- Most of these parameters are carrier-agnostic and are designed to satisfy the regulations directly rather than any individual carrier's requirements. Any carrier-specific requirements that cannot be covered by these additions (such as UPS's business/consumer classification) are supported separately and detailed in the carrier sections below.
- This guide is organized top-down: the carrier-agnostic, API-level fields you send to EasyPost come first, then carrier-specific behavior, followed by how FedEx and UPS render or transmit them.
Three product identifiers must appear on customs documentation for EU-bound shipments starting November 1, 2026.
They are optional today, but after the deadline qualifying EU-bound shipments without them may not clear customs. EasyPost does not make them mandatory, and most carriers do not currently require them — but you should start sending them ahead of the deadline.
Since July 2026, a €3 customs duty per item line applies to B2C shipments into the EU valued ≤ €150. This is a regulatory customs duty, not a carrier surcharge. EU customs classifies and routes each shipment using data you should already be passing through existing fields, or carrier-specific fields for carriers like UPS:
- Tax identifiers — your IOSS or VAT registration on the commercial invoice.
- IOSS marks a B2C shipment eligible for the flat-fee fast lane.
- VAT marks a B2B shipment routed through full H1 customs processing.
- B2B vs. B2C classification — whether the shipper and consignee are a business or a consumer.
- This is carrier-specific today (see below).
The €3 customs duty is frequently confused with the €2 Union handling fee, a separate administrative charge covering the customs services involved in processing the declaration. The two come from different legal instruments, start on different dates, and both must be paid — neither one replaces the other.
Temporary customs duty | Union handling fee | |
|---|---|---|
| Fee | €3 | €2 |
| Legal basis | Council Regulation (EU) 2026/382 | Article 20(2) of the new Union Customs Code |
| Value scope | Consignments valued €150 or less | Any value, including above €150 |
| Applies from | July 1, 2026 | Expected November 1, 2026 |
| Duration | Temporary, until July 1, 2028 | Permanent |
- Both are assessed per declaration line, not per article.
- A declaration line is goods sharing the same tariff classification, description and, where required, country of origin.
- So fifteen identical T-shirts under a single commodity code are a single line, while adding socks under a second code makes two.
Consignment contents (€150 or less) | Declaration lines | €3 duty | €2 handling fee | Total fixed charges |
|---|---|---|---|---|
| 15 identical T-shirts under a single commodity code | 1 | €3 | €2 | €5 |
| 15 T-shirts plus 6 pairs of socks under a second code | 2 | €6 | €4 | €10 |
| Three products under three different codes | 3 | €9 | €6 | €15 |
These are the shipment-API fields you send to EasyPost, independent of which carrier ultimately moves the package.
Starting November 1, 2026, these identifiers are mandatory on EU customs documentation. They are voluntary in the July 1 → October 31, 2026 window, so you can start sending them now. EasyPost makes these mandatory only when a specific carrier does; see the carrier-specific sections below.
Two new fields on each customs_item, alongside the existing merchant code, carry the three EU product identifiers. These are carrier-agnostic:
codeis the existing merchant product ID field. No change; for EU customs it now doubles as the M-PID (C127).- Only
manufacturer_product_idandstandardized_product_idare new.
How to use it:
{
"customs_item": {
"description": "Women's 100% Cotton T-Shirt, Navy, L",
"quantity": 1,
"value": "12.00",
"hs_tariff_number": "6109.10.0012",
"code": "123456",
"manufacturer_product_id": "SH123456",
"standardized_product_id": "00012345600012"
}
}- All fields are optional / nullable. Max length is 128 for
codeand 64 formanufacturer_product_idandstandardized_product_id. - Carrier-agnostic — the same two fields also serve US CPSC (see the companion CPSC guide).
Note: According to official European Commission DG Trade Guidance(opens in a new tab), if an item does not have a standardized barcode, the electronic customs declaration must include the official TARIC exemption code Y081 ("Declaration that there is no standardized identifier for the product"). Omitting the data entirely will cause the declaration to fail schema validation, as EU border systems expect either a valid S-PID (Code C129) or the Y081 exemption code.
On EasyPost, pass the literal string Y081 in customs_items.standardized_product_id when an item has no standardized identifier, rather than leaving the field empty or null.
The existing shipment.tax_identifiers[] array takes the list of tax registration numbers (VAT, IOSS, EORI, UKIMS, EIN, …) associated with the sender or recipient.
- This array is unchanged.
- If you have an IOSS number (or VAT, if applicable), it's important to add it now.
- For EU-bound shipments these numbers are now surfaced on the commercial invoice where customs expects them (see the carrier-specific sections below), in various places depending on the carrier.
How to use it (unchanged shape):
{
"shipment": {
"tax_identifiers": [
{ "entity": "SENDER", "tax_id": "IM4420000191", "tax_id_type": "IOSS", "issuing_country": "IE" },
{ "entity": "SENDER", "tax_id": "GB362459274", "tax_id_type": "VAT", "issuing_country": "GB" },
{ "entity": "SENDER", "tax_id": "GB205672212000", "tax_id_type": "EORI", "issuing_country": "GB" }
]
}
}EasyPost passes through the numbers you provide and makes sure they appear correctly.
EasyPost does not infer, generate, or choose between your tax IDs.
If you provide both an IOSS and a VAT number for a FedEx shipment entering the EU under the new regulations, EasyPost will not choose between them — both will appear on the commercial invoice. It is your responsibility to understand the constraints and provide the correct information.
A new optional address on each entry of tax_identifiers lets you supply the registered address (and, through it, the registered name) tied to a tax registration — for example, the address behind an IOSS or VAT registration.
- Carriers such as UPS now expect associated information such as
Number + Name + Addressfor eligible EU-bound shipments. Previouslytax_identifiersonly accepted the ID number and type. - It is carrier-agnostic by design (it lives on the shared tax-identifier object, not under
carrier_options), even though UPS IOSS is currently the only carrier that requests it explicitly. You can provide it in two ways:
How to use it:
Inline:
{
"shipment": {
"tax_identifiers": [
{
"entity": "SENDER",
"tax_id": "IM1234567890",
"tax_id_type": "IOSS",
"issuing_country": "DE",
"address": {
"name": "ACME GmbH",
"street1": "Friedrichstraße 1",
"city": "Berlin",
"zip": "10117",
"country": "DE"
}
}
]
}
}Reference an existing saved address, the same convention as to_address:
{
"tax_identifiers": [
{
"tax_id": "IM1234567890",
"tax_id_type": "IOSS",
"issuing_country": "IE",
"address": { "id": "adr_5843b8dd903611f19a3d0022480b361d" }
}
]
}addressreuses EasyPost's standard Address model.- It is optional; omitting it preserves prior behavior.
How each carrier renders or transmits the API-level data above. Nothing here is a new field you send — it describes carrier behavior.
Further reading:
- For more background on the rules driving this, see FedEx's customer guide: FedEx De Minimis Customer Guide (EU)(opens in a new tab).
- For FedEx's own guidance on the product identifier requirements, see Change to EU import rules: Product Identifiers (PIDs)(opens in a new tab).
- For FedEx's running summary of the EU customs changes, see FedEx — Customs Changes(opens in a new tab).
Important — make duty handling explicit.
By default, FedEx bills the recipient for duties and taxes on international shipments. Rather than relying on that default, set who pays and make sure the recipient is reachable:
-
Include the recipient's email in
to_address.emailwhen possible, so FedEx can contact them about any duties and taxes they're responsible for. -
Say who pays duties and taxes with
options.duty_payment— separate fromoptions.payment, which bills shipping, not duties.- Set
typetoSENDER,RECEIVER, orTHIRD_PARTY.
{ "shipment": { "options": { "duty_payment": { "type": "SENDER", "account": "123456789", "country": "US", "postal_code": "94104" } } } } - Set
-
State the terms with the incoterm in
customs_info.incoterm(DDP= shipper pays,DDU/DAP= recipient pays). -
Provide your IOSS number in
tax_identifiers[]if you have one (see Part 1).- The EasyPost equivalent of FedEx's
shipper.tins[].
- The EasyPost equivalent of FedEx's
For shipments into the EU, EasyPost now surfaces your VAT and IOSS numbers on the FedEx commercial invoice in two places:
-
The Tax ID field on the CI (exporter / importer tax ID).
- FedEx prints only the first tax ID on the CI that is sent, so a VAT or IOSS listed after another ID (e.g. an EORI) previously never appeared.
- EasyPost now floats VAT/IOSS to the front of the tax IDs sent to FedEx for EU destinations, so it prints in the exporter or importer tax ID field.
-
Declaration statement line on the CI.
- For EU-bound shipments, VAT and IOSS numbers are included within the commercial invoice's declaration statement. (UKIMS continues to be included on the declaration statement for all destinations, matching previous behavior.)
- Since this field has no character limit, any combination — one, two, or all three identifiers — can be displayed.
- If a shipment contains conflicting tax ID declarations (such as both IOSS and VAT for a flat-fee shipment to the EU), both are printed on the declaration statement. As noted, EasyPost does not make automated determinations on your behalf.
One caveat — US-origin shipments: for shipments originating from the USA, VAT/IOSS still print in the tax ID field on the CI PDF, but not in the declarationStatement field.
This is FedEx's rendering behavior, not an EasyPost limitation. Non-US origins (e.g. GB → DE, FR → DE) print as described.
Note: This change only applies to shipments entering the EU:
- If you don't send
tax_identifiers, nothing changes. - If you already do, you simply start seeing VAT and/or IOSS on the CI for your EU shipments — no code changes required.
When possible, include the recipient's email in to_address.email so UPS can contact them about any duties and taxes they're responsible for.
Two UPS-specific carrier options, shipper_type and consignee_type, classify the shipper (sender) and consignee (recipient) as a business or a consumer. Because this is specific to UPS, it lives inside carrier_options.
- EasyPost maps them to UPS's
GlobalTaxInformation/ShipperTypeValueandGlobalTaxInformation/ConsigneeTypeValue. These are the values UPS has told customers it now requires. - UPS uses them for EU de minimis customs routing and handling, since the B2B/B2C indicator routes the shipment into the correct customs lane. UPS may hold or return EU-bound shipments that omit them.
- They are found under
options.carrier_options.ups; each is independent (send either, both, or neither).
How to use it:
{
"shipment": {
"options": {
"carrier_options": {
"ups": {
"shipper_type": "business",
"consignee_type": "consumer"
}
}
}
}
}- Accepted values (both):
business,consumer,not_applicable. Anything else is rejected with a clear validation error. - Both are optional and independent; omitting both leaves the shipment unchanged (no
GlobalTaxInformationsent). - Shared wire code set:
business→01,consumer→02,not_applicable→NA. UPS-only for now; mirrors the existingcarrier_options.ups.premierpattern. - Capture-and-transmit only — EasyPost passes the values through; it does not infer or override them from your
residential/companyvalues.
How it appears:
<GlobalTaxInformation>
<ShipperTypeValue>02</ShipperTypeValue>
<ConsigneeTypeValue>02</ConsigneeTypeValue>
</GlobalTaxInformation>- The carrier-agnostic
tax_identifiers[].addressfield was added initially for UPS's IOSS requirements. While it is carrier-agnostic, UPS is currently the only carrier using the data. - UPS exposes structured IOSS fields (Number + Name + Address) on the ShipConfirm request. When an IOSS tax identifier carries an
address, EasyPost emits it as anIOSSContactunderShipFrom/VendorInfo.
How to use it:
<ShipFrom>
<VendorInfo>
<VendorCollectIDTypeCode>0356</VendorCollectIDTypeCode> <!-- IOSS -->
<VendorCollectIDNumber>IM1234567890</VendorCollectIDNumber>
<IOSSContact>
<Name>ACME GmbH</Name>
<Address>
<AddressLine1>Friedrichstraße 1</AddressLine1>
<City>Berlin</City>
<PostalCode>10117</PostalCode>
<CountryCode>DE</CountryCode>
</Address>
</IOSSContact>
</VendorInfo>
</ShipFrom>A temporary guard rejects UPS Worldwide Economy duty-unpaid (DDU) rate and buy requests bound for Germany (DE). WWE duty-paid (DDP) and every non-WWE UPS service are unaffected. Under the new EU rules, UPS has communicated that WWE can no longer clear duty-unpaid volume into Germany, and such packages would be returned to sender.
UPS has asked us to stop sending WWE DDU to DE for both BYOA and the DAP program. EasyPost rejects these up front with a 422 at rate/buy time, before any UPS call, so you don't buy labels that would just be returned to sender. UPS has not provided an ETA for when this restriction will be lifted.
What's blocked vs. kept:
- Blocked: WWE duty-unpaid (DDU / DAP incoterm) to DE for 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 WWE DDU / DAP only, not WWE DDP.
Product identifier support rolls out carrier by carrier. You can send code, manufacturer_product_id, and standardized_product_id today for any carrier — EasyPost stores and returns them on the customs item — and they are transmitted to the carriers marked Supported below.
Statuses as of October 20, 2026. If a carrier you ship EU-bound volume with isn't listed and you think it should be, contact our Support team.
- Supported — EasyPost transmits the product identifiers to this carrier today.
- In development — implementation is underway at EasyPost.
- Planned — scheduled, not yet started.
- Awaiting carrier — the carrier has not yet published a way to accept the product identifiers, so there is nothing for EasyPost to send them to.
Supported |
|---|
| Asendia USA |
| DHL eCommerce Solutions |
| DHL Express |
| ePost Global |
| FedEx |
| FedEx Cross Border |
| Passport Global |
| Royal Mail |
| RR Donnelley |
| UPS |
In development |
|---|
| APC |
| Australia Post |
| DHL Paket |
| GLS Group (EU) |
| USA Export PBA |
Planned |
|---|
| DPD UK / Interlink Express |
Awaiting carrier |
|---|
| Canada Post |
| DAI Post |
| Deutsche Post UK |
| Evri |
| Hailify |
| PC Postage |
| Purolator |
| USPS |
Change | Layer | What it does | Why it's required |
|---|---|---|---|
| VAT / IOSS tax identifiers | API (agnostic) | Existing tax_identifiers[]; no new field to send | EU de minimis clearance |
tax_identifiers[].address | API (agnostic) | Optional address on each tax_identifiers[] (inline or { "id": "adr_…" }); reuses Address model | Carrier IOSS name/address requirement |
manufacturer_product_id + standardized_product_id | API (agnostic) | New manufacturer_product_id (NS-PID) + standardized_product_id (S-PID) on customs_item; code = M-PID. | EU PID mandate |
| VAT / IOSS on FedEx CI | FedEx | Floats VAT/IOSS to front of tax IDs (prints in CI Tax ID field) + adds to declaration statement; EU only | EU de minimis clearance |
shipper_type / consignee_type | UPS | carrier_options.ups.shipper_type / consignee_type (business/consumer/not_applicable) → UPS ShipperTypeValue / ConsigneeTypeValue | EU B2B/B2C customs routing |
| Tax Identifier Address → IOSS | UPS | IOSS address → VendorInfo/IOSSContact (Name + Address) on ShipFrom | UPS IOSS name/address |
| WWE → Germany DDU block | UPS | Temporarily blocks WWE duty-unpaid (DDU) rate/buy to DE (422); keeps DDP | UPS WWE DDU clearance into DE |