EU De Minimis (Regulatory Details)
The EU has removed the €150 de minimis duty exemption. For goods sold to a non‑VAT‑registered (B2C) recipient in an EU27 member state, the shipper must provide three product identifiers on each commodity. B2B imports to a VAT‑registered business are out of scope.
Dates. The EU Commission accepts product identifiers from July 1, 2026. EU customs authorities enforce them from November 1, 2026: after that date a shipment without complete identifiers can be delayed, held, or refused release. FedEx makes the fields mandatory in its Ship API on or after November 1, 2026. Carriers recommend sending the identifiers now rather than waiting, so problems surface before enforcement begins.
The requirement applies at any value, not only below €150. The €150 threshold is what was removed; it is not a limit on which shipments need identifiers.
RocketShipIt supports this through per‑commodity regulatory details, which map to
FedEx's customsClearanceDetail.commodities[].regulatoryDetails[] array. This is
supported on the FedEx REST carrier (fedex-rest) and, using the same request fields,
on the DHL Express REST carrier (dhl-rest), the UPS REST carrier (ups-rest) and
Asendia (asendia) — see DHL Express, UPS
and Asendia below.
Adding regulatory details#
Add a regulatory_details array to each entry in your customs lines. For the EU de
minimis requirement set regulation_code to EU_DE_MINIMIS.
| Field | Required | Description |
|---|---|---|
regulation_code |
yes | The regulator. Use EU_DE_MINIMIS for the EU product identifier requirement. |
product_id |
yes | Your alphanumeric product identifier. The EU treats this as the merchant SKU for the consignment. |
product_id_type |
yes | Type of the identifier: SKU, PART_NUMBER, GTIN, UPC, EAN, MPN, or OTHER. |
merchant_product_id |
yes | M‑PID. The merchant's product identifier. Set equal to product_id if you don't use separate merchant‑ and SKU‑level identifiers. |
non_standard_manufacturer_product_id |
yes | NS‑PID. The manufacturer's model, part, or style number (e.g. SH123456-L). |
standard_manufacturer_product_id |
yes | S‑PID. A standard identifier such as GTIN, UPC, EAN, or ISBN. Mandatory when one exists. Send the literal string "NO" when the product has no standard identifier. |
"NO", not"NA". Earlier versions of this page said to send"NA"for a missing S‑PID. FedEx has since published"NO"as the required value. RocketShipIt now normalizes"NA","N/A"and"NONE"to"NO"before sending, so existing integrations keep working, but send"NO"in new code.
A commodity may carry more than one
regulatory_detailsentry (one per applicable regulator). If two entries share the sameregulation_codeon the same commodity, only the last one is respected.
Example#
{
"carrier": "fedex-rest",
"action": "submitshipment",
"params": {
"currency": "EUR",
"customs_value": 120.00,
"ship_country": "US",
"to_country": "DE",
"customs": [
{
"customs_description": "Silicone product",
"customs_quantity": 1,
"customs_quantity_units": "EA",
"customs_line_amount": 120.00,
"customs_weight": 1,
"customs_hs_tariff": "3926.90",
"regulatory_details": [
{
"regulation_code": "EU_DE_MINIMIS",
"product_id": "SKU-123",
"product_id_type": "SKU",
"merchant_product_id": "SKU-123",
"non_standard_manufacturer_product_id": "SH123456-L",
"standard_manufacturer_product_id": "01233456789012"
}
]
}
]
}
}
See the full request in the API Explorer or on the examples site: FedEx-REST - Label International EU De Minimis (under €150 B2C).
IOSS number#
If you are registered for the Import One‑Stop Shop (IOSS), pass your IOSS number using
the shipper tax‑id fields. These populate FedEx's shipper.tins[] array:
"ship_tax_id": "IM1234567890",
"ship_tax_id_type": "BUSINESS_UNION"
Referencing stored profiles (FedEx Regulatory API)#
Instead of sending the identifiers inline on every request, you can store per‑product regulatory data once in FedEx's Regulatory API and reference it at ship time. To do this, send only the join‑key fields and omit the detail fields:
"regulatory_details": [
{
"regulation_code": "EU_DE_MINIMIS",
"product_id": "SKU-123",
"product_id_type": "SKU"
}
]
FedEx merges the stored profile data into the shipment after it is created. If a
regulatory_details entry has no inline details and no matching stored profile, the
shipment may be delayed until the details are provided.
Storing profiles#
Use the createregulatoryprofile action to store per‑product regulatory data in
FedEx's Regulatory API (POST /regulatory/v1/profiles). Profiles are scoped per
destination market via country_of_import and matched to shipments by
regulation_code + product_id + product_id_type. FedEx accepts up to 25
profiles per request.
{
"carrier": "fedex-rest",
"action": "createregulatoryprofile",
"params": {
"regulatory_profiles": [
{
"regulation_code": "EU_DE_MINIMIS",
"product_id": "SKU-123",
"product_id_type": "SKU",
"country_of_import": "DE",
"details": [
{
"merchant_product_id": "SKU-123",
"non_standard_manufacturer_product_id": "SH123456-L",
"standard_manufacturer_product_id": "01233456789012"
}
]
}
]
}
}
See the full request in the API Explorer or on the examples site: FedEx-REST - Create Regulatory Profile (EU De Minimis).
Note: RocketShipIt does not block shipment creation when identifiers are missing. Until November 1, 2026 FedEx does not reject the request either, but the shipment may fail to clear EU customs. From November 1, 2026 FedEx makes the fields mandatory and the Ship API itself will reject a B2C EU shipment without them. Validate against the FedEx test environment before relying on this in production.
FedEx API caveats#
- Use
fedex-rest. Product identifiers are only supported on the FedEx REST Ship API. The legacyfedexcarrier uses FedEx WebServices, which FedEx no longer develops and which will never carry these fields. Customers still onfedexmust move tofedex-restor put the identifiers on the commercial invoice by hand. - Not available on Open Ship or Consolidation. FedEx does not accept product
identifiers through its Open Ship or Consolidation APIs. RocketShipIt's
submitshipmentuses the Ship API, so it is unaffected.
DHL Express (dhl-rest)#
The DHL Express MyDHL API expresses the same manufacturer identifiers as
export‑declaration line‑item references (MyDHL v3.3.1, June 2026) rather than a
regulatory‑details block. RocketShipIt maps the two manufacturer fields from
regulatory_details onto MyDHL's
content.exportDeclaration.lineItems[].customerReferences[]:
regulatory_details field |
MyDHL reference typeCode |
Meaning |
|---|---|---|
standard_manufacturer_product_id |
SRV |
Standardized Manufacturer Product ID (GTIN/UPC/EAN) |
non_standard_manufacturer_product_id |
MF |
Non‑standardized Manufacturer Product ID (internal SKU) |
MyDHL has no reference type code for the merchant identifier (M‑PID), so
merchant_product_id is not transmitted on DHL shipments. Put your SKU in the line
description or in a customer_references entry your DHL account is set up to read.
Because the request shape is identical, the same customs line that drives FedEx also
drives DHL — you do not need a carrier‑specific payload. Send a customs line with
regulatory_details and switch carrier to dhl-rest. Supplying customs lines makes
the shipment customs‑declarable and emits a full export declaration (line items plus a
commercial invoice); an invoice/invoice_date are generated when not provided.
{
"carrier": "dhl-rest",
"action": "submitshipment",
"params": {
"currency": "EUR",
"customs_value": 120.00,
"ship_country": "US",
"to_country": "DE",
"customs": [
{
"customs_description": "Silicone product",
"customs_quantity": 1,
"customs_hs_tariff": "392690",
"regulatory_details": [
{
"regulation_code": "EU_DE_MINIMIS",
"non_standard_manufacturer_product_id": "SH123456-L",
"standard_manufacturer_product_id": "01233456789012"
}
]
}
]
}
}
See the full request in the API Explorer or on the examples site: DHL-REST - Label International EU De Minimis (under €150 B2C).
Tax IDs (EORI / VAT / IOSS)#
Shipper and recipient tax identifiers map to MyDHL's
customerDetails.shipperDetails.registrationNumbers[] and
customerDetails.receiverDetails.registrationNumbers[]. Use the shipper params
(ship_tax_id, ship_tax_id_type, ship_tax_id_country) and the recipient
params (to_tax_id, to_tax_id_type, to_tax_id_country) — the same fields
the legacy XML‑PI dhl carrier accepts. A second number can be sent with the
2 variants (to_tax_id2, etc.), e.g. EORI plus VAT. The type is a MyDHL
typeCode such as VAT, EOR (EORI), or SDT (IOSS/OSS). MyDHL requires an
issuer country on every number; when the *_tax_id_country param is omitted,
the shipper/recipient address country is used.
"ship_tax_id": "IM1234567890",
"ship_tax_id_type": "SDT",
"to_tax_id": "DE123456789012345",
"to_tax_id_type": "EOR"
Other line‑item references#
To send arbitrary MyDHL line‑item references (e.g. AFE/ECCN, PON, MID), add a
customer_references array to the customs line. Each entry is a type_code / value
pair passed through verbatim:
"customer_references": [
{ "type_code": "AFE", "value": "1A999" }
]
UPS (ups-rest)#
Available since version 2.8.2.360 on the UPS REST carrier (ups-rest). UPS
expresses the identifiers through its Customs Detail API as
Product.ProductIdentifier[] entries on each international‑forms product, so the
request must include an international invoice ("customs_forms": "01"). RocketShipIt
maps the regulatory_details fields onto UPS product‑identifier type codes:
regulatory_details field |
UPS ProductIDTypeCode |
Meaning |
|---|---|---|
merchant_product_id (or product_id if not set) |
0100 |
Merchant product ID (your SKU) |
non_standard_manufacturer_product_id |
0200 |
Non‑standardized Manufacturer Product ID (internal SKU) |
standard_manufacturer_product_id |
0300 |
Standardized Manufacturer Product ID (GTIN/UPC/EAN) |
As with the other carriers, use the literal string "NO" for
standard_manufacturer_product_id when the product has no standard identifier (the
older "NA" is still accepted). In that case RocketShipIt omits the 0300
identifier and sets CommodityFieldSpecialConditionCode to 01 on the commodity,
which is how UPS is told that no standardized identifier exists.
Recipient tax ID (EORI / VAT)#
Send the consignee's tax identifier with to_tax_id, plus an optional
to_tax_id_type carrying a UPS IDNumberTypeCode (e.g. 0002 = Importer Tax
ID / EORI; defaults to 1002 = Company/Business Tax ID). This maps to UPS's
GlobalTaxInformation structure with the consignee role — not the deprecated
ShipTo.TaxIdentificationNumber field, which is limited to 15 characters. The
legacy param name tax_id is still accepted for the same field.
B2C indicator#
UPS flags a low‑value B2C consignment with
InternationalForms.EUDeMinimisIndicator = "Y". RocketShipIt sets this automatically
whenever any customs line carries an EU_DE_MINIMIS regulatory detail, or you can set
it explicitly with the top‑level param:
"eu_de_minimis": true
There is no separate B2B indicator — for B2B VAT‑registered imports (which are exempt
from the requirement) simply omit eu_de_minimis and the regulatory_details
entries.
Example#
{
"carrier": "ups-rest",
"action": "submitshipment",
"params": {
"customs_forms": "01",
"currency": "EUR",
"customs_value": 120.00,
"reason_for_export": "SALE",
"invoice_line_total": 120,
"eu_de_minimis": true,
"ship_country": "US",
"to_country": "DE",
"customs": [
{
"invoice_line_number": "1",
"invoice_line_part_number": "SKU-123",
"invoice_line_description": "Silicone product",
"invoice_line_value": "120",
"invoice_line_origin_country_code": "US",
"customs_quantity_units": "EA",
"regulatory_details": [
{
"regulation_code": "EU_DE_MINIMIS",
"merchant_product_id": "SKU-123",
"non_standard_manufacturer_product_id": "SH123456-L",
"standard_manufacturer_product_id": "01233456789012"
}
]
}
]
}
}
See the full request in the API Explorer or on the examples site: UPS-REST - International w/ EU De Minimis.
Asendia (asendia)#
Asendia USA added three item‑level product identifier fields to its Shipping Platform
API for the EU requirement. From November 1, 2026 Asendia fails the label
request if merchantPid or manufacturerPid is missing, so send them on every
customs line. RocketShipIt maps the regulatory_details fields onto each entry in
Asendia's items[]:
regulatory_details field |
Asendia item field | Required |
|---|---|---|
merchant_product_id (or product_id, then the line's invoice_line_part_number) |
merchantPid |
yes |
non_standard_manufacturer_product_id |
manufacturerPid |
yes |
standard_manufacturer_product_id |
standardisedPid |
no, but send it when you have one |
Each value is limited to 32 characters and cannot be empty or a single dot (.).
When merchant_product_id and product_id are both omitted, RocketShipIt sends the
line's invoice_line_part_number (which Asendia also receives as sku) as the
merchantPid. There is no fallback for manufacturerPid: you must supply it.
"customs": [
{
"invoice_line_part_number": "SKU-123",
"customs_description": "Silicone product",
"invoice_line_value": "10.00",
"customs_quantity": 2,
"regulatory_details": [
{
"regulation_code": "EU_DE_MINIMIS",
"merchant_product_id": "SKU-123",
"non_standard_manufacturer_product_id": "SH123456-L",
"standard_manufacturer_product_id": "01233456789012"
}
]
}
]
See the full request in the API Explorer or on the examples site: Asendia - Label.