Customs authorities, marketplaces, and carriers increasingly ask for identifiers that pin down exactly which product is in a shipment. From 1 November 2026, EU customs declarations for e-commerce imports must carry three of them for every product:
EU product identifier↕
What it is↕
Field↕
Merchant product identifier (M-PID)
Your own reference for the product, such as the ID on your product page.
An internationally standardised code, such as a UPC, EAN, or ISBN barcode number.
A value from globalTradeItemNumbers
Your own reference is easy to supply. The other two often aren't. Catalogs are full of missing manufacturer product IDs, seller SKUs entered in their place, placeholders such as "N/A," and barcodes copied from a different size or color.
Zonos product identifiers helps in two ways:
Infer. You send product details. Zonos returns the product's manufacturer product ID and the GTINs it knows for it, or tells you why it can't.
Validate. You send product details with a manufacturer product ID, a GTIN, or both. Zonos tells you how likely each one is to belong to that product, and suggests likelier products when it doesn't.
Note: An empty globalTradeItemNumbers list means Zonos doesn't know a GTIN for the product, not that none exists. Check the product or its packaging before declaring that it has no barcode.
Note: Zonos product identifiers will be available via API only. Each request accepts up to 25 products. Results come back in the same order as the input, and each result echoes the input fields you sent (name, brand, description, and so on), so you can store it without joining it back to your request.
Every identified product has one manufacturerProductId, and manufacturerProductIdType tells you what kind of ID it is:
manufacturerProductIdType↕
What it is↕
Example↕
MANUFACTURER
The manufacturer's own part or model number.
MK2K3LL/A
COMPOSITE
The product has no part number, so the ID is built from the attributes that define it. See Composite product IDs.
tc:pkm:sv3pt5:199:en
GLOBAL_TRADE_ITEM_NUMBER
The product has no other ID, so its GTIN is used. Only returned when you have enabled using GTINs as manufacturer product IDs for your account.
195925223587
All three can be declared as the non-standardised manufacturer product identifier (NS-PID). manufacturerProductId is null only when a product is known by its GTINs alone and you haven't enabled the GTIN fallback.
GTINs are returned as issued: 8, 12, 13, or 14 digits, most common first. A product can have several, for example a UPC for North America and an EAN for Europe.
Some products have no manufacturer part number. A trading card, a coin, or a comic book issue is identified by its attributes instead. For these products, Zonos returns a composite product ID: a short, readable ID built from the attributes that define the product. The same product always gets the same ID, so you can use it as a catalog key and compare it across sellers.
A composite product ID is a family prefix followed by fixed segments, separated by colons:
Product family↕
Prefix↕
Segments↕
Example↕
Trading card
tc
game, set, card number, language, and finish if not standard
tc:pkm:sv3pt5:199:en
Coin
cn
issuing country, denomination, year, mint mark, variety
cn:us:0.01usd:1909:s:vdb
Banknote
bn
issuing country, denomination, series, variety
bn:us:100usd:2017a
Comic book
cm
publisher, series and start year, issue, printing, cover
cm:dc:batman-2016:50:2:b
Book without ISBN
bk
author, title, year, edition
bk:tolkien:hobbit:1937:1
IDs are lowercase and case is ignored on input. Optional trailing segments are left out when they have their default value. Condition and grading, such as near mint or PSA 10, are not part of the ID: two copies of the same card in different condition share one composite product ID.
Every inference returns exactly one status. Branch on status, not on whether product is null.
Status↕
What it means↕
Recommended action↕
MATCHED
One product was identified with confidence. It is returned in product.
Use the identifiers. Route results with a low confidenceScore to review.
NO_MATCH
The details describe a specific product, but its identifiers couldn't be determined with confidence.
Review alternates, add more product details, or ask the manufacturer.
INSUFFICIENT_INFORMATION
The details are too generic to identify a specific product, for example an unbranded listing with no model or size.
Add the brand, a GTIN, or more specific details, then try again.
Note:NO_MATCH is not a finding that the product has no manufacturer product ID. It means Zonos couldn't confidently identify it. If you receive a status your integration doesn't recognize, treat it as NO_MATCH.
Every inference includes a confidenceScore between 0.0 and 1.0. It is the probability that the status is correct and, when a product is returned, that it is the right one. Scores are calibrated, so you can read them literally: among results with a confidenceScore of 0.9, about 9 in 10 are correct.
When other products came close, they are returned in alternates, most likely first, each with a probabilityMass: the probability that it is the product. Alternates are often the same product in another size, color, or regional version. Use them to speed up manual review, but never treat an alternate as the answer.
You can set thresholds that fit your risk tolerance. For example, accept MATCHED results at 0.85 or above automatically and send the rest to review.
Use the manufacturerProductIdsInfer mutation with your product details. Only name is required, but the brand, the category, and a GTIN significantly improve results.
The example below sends three products in one request: an iPad, a Samsung smartwatch, and a Nikon camera lens.
1mutationManufacturerProductIdsInfer(
2$input: [ManufacturerProductIdInferInput!]!
3){
4 manufacturerProductIdsInfer(input:$input) {
5 alternates {
6 probabilityMass
7 product {
8 brand
9 globalTradeItemNumbers
10 manufacturerProductId
11 manufacturerProductIdType
12}
13}
14 confidenceScore
15 id
16 name
17 product {
18 brand
19 globalTradeItemNumbers
20 manufacturerProductId
21 manufacturerProductIdType
22}
23 productId
24 status
25}
26}
In the example above:
The iPad is MATCHED to MK2K3LL/A, Apple's part number for the 64 GB Wi-Fi model in Space Gray. No other product came close, so alternates is empty. globalTradeItemNumbers is empty because Zonos doesn't know a GTIN for this part number, not because it has none.
The Galaxy Watch5 is MATCHED, but with a confidenceScore of only 0.66. The listing describes the 44 mm Bluetooth Graphite watch, which Samsung sells under a different part number in each region. The alternates are the base model SM-R910 and the US version SM-R910NZAAXAA, with its UPC. A result like this is a good candidate for review: if you sell in the US, SM-R910NZAAXAA is probably the one you want.
The Nikon lens is NO_MATCH. The lens is clearly identified, but the listing doesn't say which version it is, and the alternates (2199 and 2214, each with its own UPC) received little probability. The confidenceScore of 0.93 is the probability that NO_MATCH is the right answer, not that a lens was found. Add the version or the UPC from the box, then try again.
See an INSUFFICIENT_INFORMATION example
This listing is for a pair of earbuds, but it has no brand, model, or GTIN. Many different products fit this description, so no single product can be identified.
10"name":"Wireless Bluetooth Earbuds with Charging Case",
11"productId":"sku-1004"
12}
13]
14}
Ask the supplier for the brand and model, or the barcode number on the packaging, and request again.
See a COMPOSITE example
A trading card has no manufacturer part number. It is identified by its game, set, card number, and language, so it gets a composite product ID. The values in this example are illustrative.
11"name":"Pokemon 151 Charizard ex 199/165 Special Illustration Rare",
12"productId":"sku-1005"
13}
14]
15}
The same card in another language, such as Japanese, gets a different ID. The same card graded PSA 10 gets the same ID: grading and condition are not part of it.
A manufacturer product ID or GTIN can be real and still belong to a different product. Use the manufacturerProductIdsValidate mutation to check the identifiers you have. Send a manufacturerProductId, a globalTradeItemNumber, or both. Each one is checked independently and gets its own result, in manufacturerProductIdMatch and globalTradeItemNumberMatch, with a verdict and a probability that the identifier belongs to the product.
Verdict↕
What it means↕
Recommended action↕
DEFINITELY_SAME
The identifier belongs to the product.
Accept.
LIKELY_SAME
The identifier probably belongs to the product.
Accept, or review if your tolerance for error is low.
UNLIKELY_SAME
The identifier probably belongs to a different product.
Review. Check suggestions for a better fit.
DEFINITELY_NOT_SAME
The identifier belongs to a different product.
Reject. Use suggestions, or ask the supplier for the correct identifier.
INDETERMINATE
No verdict: the identifier is malformed, a placeholder such as "N/A," or a seller SKU, or the details are too generic.
Ask for the identifier printed on the product or its packaging.
Case, spaces, and hyphens are ignored, so MK2K3LL/A, mk2k3ll-a, and MK2K3LLA are checked as the same manufacturer product ID. For a manufacturer product ID, manufacturerProductIdType tells you how the value was read. When an identifier doesn't belong to the product, likelier products are returned in suggestions.
The example below checks three manufacturer product IDs a supplier might give you for the iPad from Infer product identifiers.
1mutationManufacturerProductIdsValidate(
2$input: [ManufacturerProductIdValidateInput!]!
3){
4 manufacturerProductIdsValidate(input:$input) {
5 globalTradeItemNumber
6 globalTradeItemNumberMatch {
7 probability
8 verdict
9}
10 id
11 manufacturerProductId
12 manufacturerProductIdMatch {
13 probability
14 verdict
15}
16 manufacturerProductIdType
17 name
18 productId
19 suggestions {
20 probabilityMass
21 product {
22 brand
23 globalTradeItemNumbers
24 manufacturerProductId
25 manufacturerProductIdType
26}
27}
28}
29}
In the example above:
MK2K3LL/A is DEFINITELY_SAME. It is the part number for the 64 GB Wi-Fi model in Space Gray.
MK663LL/A is DEFINITELY_NOT_SAME. It is a real Apple part number, but for the Wi-Fi + Cellular version of the same iPad. The listing says Wi-Fi, so the correct part number is returned in suggestions.
N/A is INDETERMINATE. It is a placeholder, not an identifier, so manufacturerProductIdType is null. The product is still identified, so suggestions gives you the part number to use instead.
No GTIN was sent, so globalTradeItemNumberMatch is null. Send one in globalTradeItemNumber and it is checked the same way, independently of the manufacturer product ID.
Coming soon: Inference and validation will also be available as steps in catalog item workflows, so you can identify products in the same request that validates their categories and classifies them.
Product identifiers is designed to enhance, not replace, your catalog review. A practical setup:
Automate the clear cases. Accept MATCHED results above your confidence threshold, along with DEFINITELY_SAME verdicts, and reject DEFINITELY_NOT_SAME.
Review the rest. Send NO_MATCH, LIKELY_SAME, UNLIKELY_SAME, and low-confidence results to a reviewer, using alternates or suggestions as a starting point.
Go back to the source. For INSUFFICIENT_INFORMATION or INDETERMINATE, ask the supplier for the brand, the part number printed on the product, or its barcode.
Keep identifiers with the product. Store manufacturerProductId together with manufacturerProductIdType, so you know later whether you are holding a part number, a composite product ID, or a GTIN.
Start with conservative thresholds, and loosen them as you compare results against your reviewers' decisions.
Product identifiers
Product identifiers
Identify a product's manufacturer product ID and GTINs, or check whether the identifiers you have actually belong to it.
Why product identifiers matter
Customs authorities, marketplaces, and carriers increasingly ask for identifiers that pin down exactly which product is in a shipment. From 1 November 2026, EU customs declarations for e-commerce imports must carry three of them for every product:
productId, which you send and get back unchanged.manufacturerProductIdglobalTradeItemNumbersYour own reference is easy to supply. The other two often aren't. Catalogs are full of missing manufacturer product IDs, seller SKUs entered in their place, placeholders such as "N/A," and barcodes copied from a different size or color.
Zonos product identifiers helps in two ways:
How it works
You submit the product details you have. Zonos identifies the product and returns:
status(for inference) or averdictfor each identifier you sent (for validation) that tells you which case applies.Statuses and verdicts are advisory: you decide what each one means for your workflow.
namebrandcategoriesdescriptionglobalTradeItemNumberproductIdmanufacturerProductIdFor every type, field, and enum value, see the Product identifiers schema.
Identifier types
Every identified product has one
manufacturerProductId, andmanufacturerProductIdTypetells you what kind of ID it is:manufacturerProductIdType↕MANUFACTURERMK2K3LL/ACOMPOSITEtc:pkm:sv3pt5:199:enGLOBAL_TRADE_ITEM_NUMBER195925223587All three can be declared as the non-standardised manufacturer product identifier (NS-PID).
manufacturerProductIdis null only when a product is known by its GTINs alone and you haven't enabled the GTIN fallback.GTINs are returned as issued: 8, 12, 13, or 14 digits, most common first. A product can have several, for example a UPC for North America and an EAN for Europe.
Composite product IDs
Some products have no manufacturer part number. A trading card, a coin, or a comic book issue is identified by its attributes instead. For these products, Zonos returns a composite product ID: a short, readable ID built from the attributes that define the product. The same product always gets the same ID, so you can use it as a catalog key and compare it across sellers.
A composite product ID is a family prefix followed by fixed segments, separated by colons:
tctc:pkm:sv3pt5:199:encncn:us:0.01usd:1909:s:vdbbnbn:us:100usd:2017acmcm:dc:batman-2016:50:2:bbkbk:tolkien:hobbit:1937:1IDs are lowercase and case is ignored on input. Optional trailing segments are left out when they have their default value. Condition and grading, such as near mint or PSA 10, are not part of the ID: two copies of the same card in different condition share one composite product ID.
Inference statuses
Every inference returns exactly one
status. Branch onstatus, not on whetherproductis null.MATCHEDproduct.confidenceScoreto review.NO_MATCHalternates, add more product details, or ask the manufacturer.INSUFFICIENT_INFORMATIONConfidence scores
Every inference includes a
confidenceScorebetween 0.0 and 1.0. It is the probability that thestatusis correct and, when a product is returned, that it is the right one. Scores are calibrated, so you can read them literally: among results with aconfidenceScoreof 0.9, about 9 in 10 are correct.When other products came close, they are returned in
alternates, most likely first, each with aprobabilityMass: the probability that it is the product. Alternates are often the same product in another size, color, or regional version. Use them to speed up manual review, but never treat an alternate as the answer.You can set thresholds that fit your risk tolerance. For example, accept
MATCHEDresults at 0.85 or above automatically and send the rest to review.Infer product identifiers
Use the
manufacturerProductIdsInfermutation with your product details. Onlynameis required, but the brand, the category, and a GTIN significantly improve results.The example below sends three products in one request: an iPad, a Samsung smartwatch, and a Nikon camera lens.
mutation ManufacturerProductIdsInfer($input: [ManufacturerProductIdInferInput!]!) {manufacturerProductIdsInfer(input: $input) {alternates {probabilityMassproduct {brandglobalTradeItemNumbersmanufacturerProductIdmanufacturerProductIdType}}confidenceScoreidnameproduct {brandglobalTradeItemNumbersmanufacturerProductIdmanufacturerProductIdType}productIdstatus}}In the example above:
MATCHEDtoMK2K3LL/A, Apple's part number for the 64 GB Wi-Fi model in Space Gray. No other product came close, soalternatesis empty.globalTradeItemNumbersis empty because Zonos doesn't know a GTIN for this part number, not because it has none.MATCHED, but with aconfidenceScoreof only 0.66. The listing describes the 44 mm Bluetooth Graphite watch, which Samsung sells under a different part number in each region. The alternates are the base modelSM-R910and the US versionSM-R910NZAAXAA, with its UPC. A result like this is a good candidate for review: if you sell in the US,SM-R910NZAAXAAis probably the one you want.NO_MATCH. The lens is clearly identified, but the listing doesn't say which version it is, and the alternates (2199and2214, each with its own UPC) received little probability. TheconfidenceScoreof 0.93 is the probability thatNO_MATCHis the right answer, not that a lens was found. Add the version or the UPC from the box, then try again.See an INSUFFICIENT_INFORMATION example
This listing is for a pair of earbuds, but it has no brand, model, or GTIN. Many different products fit this description, so no single product can be identified.
{"input": [{"categories": ["Consumer Electronics","Portable Audio & Headphones","Headphones"],"description": "Connectivity: Bluetooth\nColor: White","name": "Wireless Bluetooth Earbuds with Charging Case","productId": "sku-1004"}]}Ask the supplier for the brand and model, or the barcode number on the packaging, and request again.
See a COMPOSITE example
A trading card has no manufacturer part number. It is identified by its game, set, card number, and language, so it gets a composite product ID. The values in this example are illustrative.
{"input": [{"brand": "Pokémon","categories": ["Toys & Hobbies","Collectible Card Games","CCG Individual Cards"],"description": "Set: Scarlet & Violet—151\nCard Number: 199/165\nLanguage: English\nGraded: No","name": "Pokemon 151 Charizard ex 199/165 Special Illustration Rare","productId": "sku-1005"}]}The same card in another language, such as Japanese, gets a different ID. The same card graded PSA 10 gets the same ID: grading and condition are not part of it.
Validate product identifiers
A manufacturer product ID or GTIN can be real and still belong to a different product. Use the
manufacturerProductIdsValidatemutation to check the identifiers you have. Send amanufacturerProductId, aglobalTradeItemNumber, or both. Each one is checked independently and gets its own result, inmanufacturerProductIdMatchandglobalTradeItemNumberMatch, with averdictand aprobabilitythat the identifier belongs to the product.DEFINITELY_SAMELIKELY_SAMEUNLIKELY_SAMEsuggestionsfor a better fit.DEFINITELY_NOT_SAMEsuggestions, or ask the supplier for the correct identifier.INDETERMINATECase, spaces, and hyphens are ignored, so
MK2K3LL/A,mk2k3ll-a, andMK2K3LLAare checked as the same manufacturer product ID. For a manufacturer product ID,manufacturerProductIdTypetells you how the value was read. When an identifier doesn't belong to the product, likelier products are returned insuggestions.The example below checks three manufacturer product IDs a supplier might give you for the iPad from Infer product identifiers.
mutation ManufacturerProductIdsValidate($input: [ManufacturerProductIdValidateInput!]!) {manufacturerProductIdsValidate(input: $input) {globalTradeItemNumberglobalTradeItemNumberMatch {probabilityverdict}idmanufacturerProductIdmanufacturerProductIdMatch {probabilityverdict}manufacturerProductIdTypenameproductIdsuggestions {probabilityMassproduct {brandglobalTradeItemNumbersmanufacturerProductIdmanufacturerProductIdType}}}}In the example above:
MK2K3LL/AisDEFINITELY_SAME. It is the part number for the 64 GB Wi-Fi model in Space Gray.MK663LL/AisDEFINITELY_NOT_SAME. It is a real Apple part number, but for the Wi-Fi + Cellular version of the same iPad. The listing says Wi-Fi, so the correct part number is returned insuggestions.N/AisINDETERMINATE. It is a placeholder, not an identifier, somanufacturerProductIdTypeis null. The product is still identified, sosuggestionsgives you the part number to use instead.No GTIN was sent, so
globalTradeItemNumberMatchis null. Send one inglobalTradeItemNumberand it is checked the same way, independently of the manufacturer product ID.Catalog item workflows
Implementation
Product identifiers is designed to enhance, not replace, your catalog review. A practical setup:
MATCHEDresults above your confidence threshold, along withDEFINITELY_SAMEverdicts, and rejectDEFINITELY_NOT_SAME.NO_MATCH,LIKELY_SAME,UNLIKELY_SAME, and low-confidence results to a reviewer, usingalternatesorsuggestionsas a starting point.INSUFFICIENT_INFORMATIONorINDETERMINATE, ask the supplier for the brand, the part number printed on the product, or its barcode.manufacturerProductIdtogether withmanufacturerProductIdType, so you know later whether you are holding a part number, a composite product ID, or a GTIN.Start with conservative thresholds, and loosen them as you compare results against your reviewers' decisions.
Was this page helpful?