Overview
Introduction
Welcome to the DDX Export Implementation Guide. This guide describes the product data files that Distributor Data Solutions (DDS) delivers, and how to load them into your own systems.
DDS offers three standard export formats:
| Format | Best for | Shape |
|---|---|---|
| JSON | Developers loading a PIM, search index or e-commerce platform | One product per line, nested objects |
| Multi CSV | Spreadsheet, database and ETL imports | One file per data type, joined on product_id |
| XML | Systems that expect XML | One <product> element per product |
Every format carries the core product data: item details, pricing, images, documents, specifications, facets and packaging. JSON is the most complete. Some data, such as ETIM classification, related products and the full price list, is only in some formats; each section says what its format leaves out. Each section shows a sample of the data in the dark panel to the right, with a field table alongside.
Conventions
These rules apply to every format:
- Missing data is left out. If a manufacturer does not supply a value, the field is omitted (JSON and XML) or left empty (CSV). Your import must handle a field that is not present. For example, not every manufacturer supplies packaging dimensions. A few lists are written as empty lists instead; see Missing values in each format's section.
- Read numbers defensively. Some numeric values are delivered as text, for example product dimensions and image file sizes in JSON. Parse them as numbers rather than relying on the JSON type.
- Text is UTF-8.
- Media is hosted for you. Images, documents and 360 images are hosted on the DDS content delivery network at
https://media.distributordatasolutions.com, served over HTTPS. You can link to them directly; there is no need to download and re-host them. - Prices are for one region. Pricing fields come from the price region set on your export (USA by default), in that region's currency.
- Identifiers.
product_idis the DDS identifier for a product in JSON and Multi CSV; in XML the product identifier is<code>. If your export is matched to your own product list,distributor_product_idcarries your identifier, and in Multi CSV it replacesproduct_idas the first column of the product files.
JSON Implementation Guide
JSON Files
One JSON object per line
{"product_id":7038860,"manufacturer_catalog_number":"2522-20", ... }
{"product_id":7038861,"manufacturer_catalog_number":"2522-21XC", ... }
{"product_id":7038862,"manufacturer_catalog_number":"2532-20", ... }
A delivered JSON export
files/
part-00000-6572157f-2ecc-4251-a931-23e234280e71-c000.json
part-00000-6572157f-2ecc-4251-a931-23e234280e71-c001.json
part-00000-6572157f-2ecc-4251-a931-23e234280e71-c002.json
_SUCCESS
One product per line
Each file is in JSON Lines format: every line is a complete JSON object describing one product. The file as a whole is not a JSON array, so read it line by line rather than parsing it in one go.
Multi-part files
A JSON export is split into several part files in a files/ folder. Each part holds at most 5,000 products. File names follow the pattern part-00000-{run id}-c{nnn}.json, where the run id is a unique id for that export run. All parts from the same run share it, and c000, c001, c002… number the parts. You may also see an empty _SUCCESS file inside files/; ignore it. Process every .json file in the folder. The order of the parts has no meaning.
Missing values
Fields with no value are left out of the object entirely rather than written as null. For example, primary_image is absent when a product has no image, and alternate_images is absent when there are none. Lists such as facets, certifications and images_360 are present as an empty list [] when there is nothing to report.
Item Details
Item Details (nested objects shortened, values illustrative)
{
"product_id": 7038860,
"distributor_product_id": "1398103",
"distributor_attributes": [
{ "attribute_key": "distributor_category", "attribute_value": "RPL30090600", "weight": 0 }
],
"manufacturer_catalog_number": "2522-20",
"upc": "045242519958",
"unspsc": "23241507",
"name": "M12 FUEL 3\" Compact Cut Off Tool",
"short_description": "M12 FUEL 3\" Compact Cut Off Tool",
"long_description": "The M12 FUEL 3 in. Compact Cut Off Tool delivers multi-material cutting capability in an ergonomic package...",
"manufacturer": { "id": 4, "name": "Milwaukee Tool", "parent_id": 19959, "parent_name": "Techtronic Industries", "image": { ... } },
"country_of_origin": "MEX",
"family_code": "M12FUEL",
"preferred_product": "X",
"rohs_indicator": "Compliant",
"prop_65_message": "WARNING: This product can expose you to chemicals including lead...",
"height": "3.15",
"height_uom": "in",
"length": "7.13",
"length_uom": "in",
"width": "4.72",
"width_uom": "in",
"region_id": "USA",
"currency": "USD",
"list_price": 248.0000,
"price_effective_date": "2026-10-07",
"next_list_price": 259.0000,
"next_effective_date": "2027-01-04",
"order_min": 1,
"order_increment": 1,
"units_qty": 1,
"units_uom": "each",
"discount_code": "DE3D",
"tariff_code": "8467220020",
"stocked": "Y",
"standard_lead_time": "3",
"product_life_cycle_status": "Active",
"business_group": "Power Tools",
"language_code": "en",
"prices": [ { "region_id": "USA", "list_price": 248.0000, "imap": 149.0, ... } ],
"primary_image": { "name": "2522-20_1_Web.jpg", "uri": "https://media.distributordatasolutions.com/...-large.png", "sizes": { ... } },
"alternate_images": [ { "name": "2522-20_2_Web.jpg", ... } ],
"images_360": [ { "cols": "24", "rows": "1", "iframe_url": "https://media.distributordatasolutions.com/assets/magic360/viewer.html?...", ... } ],
"primary_spec_sheet": { "name": "2522-20-spec.pdf", "display_name": "Spec Sheet", ... },
"safety_data_sheet": { "name": "M12-battery-SDS.pdf", "display_name": "Safety Data Sheet", ... },
"downloads": [ { "group_name": "Downloads", "group_items": [ { "display_name": "Warranty Document", ... } ] } ],
"videos": [ { "group_name": "Videos", "group_items": [ { "display_name": "Product Video", ... } ] } ],
"packages": [ { "gtin": "10045242519955", "qty": 10, "qty_uom": "CASE", ... } ],
"facets": [ { "data_key": "blade_diameter", "name": "Blade Diameter", "values": [ ... ] } ],
"certifications": [ { "name": "Blade Diameter", "value": "3 in", "type": "Physical Dimensions & Form Factor" }, ... ],
"features": [ { "group_name": "Features", "group_items": [ { "value": "20,000 RPM for fast and accurate cutting performance", ... } ] } ],
"specifications": [ { "group_name": "Specifications", "group_items": [ { "name": "Blade Diameter", "value": "3 in", ... } ] } ],
"etim": { "class_code": "EC000093", "class_description": "Angle grinder (battery)", "version": 7, ... },
"categories": [ { "category_id": 690237, "name": "Power Tools & Accessories", ... } ],
"manufacturer_categories": [ { "category_id": 2989154, "name": "Tools Cutting", ... } ],
"related_products": { "accessory": ["48-11-2420", "49-94-3000"] },
"dds_normalized_attributes": [ { "manufacturer_attribute_name": "Blade diameter", "manufacturer_value": "3 in.", "highly_normalized": { ... }, "detail_normalized": { ... } } ]
}
Every top-level field that can appear on a product object is listed below. Fields with no data are left out, so a given product will only have some of them. Where a field holds an object or a list, its Data Type links to the section that describes it.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | DDS unique identifier for the product |
distributor_product_id |
String | Your identifier for the product. Only present when your export is matched to your product list |
distributor_attributes |
List of Distributor Attribute Objects | Values from your own product file, each with attribute_key, attribute_value and weight. Only present when your export is matched to your product list |
manufacturer_catalog_number |
String | Uniquely identifies the product within its manufacturer |
upc |
String | UPC-A: 12 digits, can have leading zeros |
unspsc |
String | United Nations Standard Products and Services Code |
name |
String | Product name. Falls back to short_description when the manufacturer gives no name |
short_description |
String | Brief description of the product (often the same as the name) |
long_description |
String | Longer description of the product |
manufacturer |
Manufacturer Object | The manufacturer, its parent company and its logo |
country_of_origin |
String | Country where the product was manufactured |
family_code |
String | Product group or family, defined by the manufacturer |
preferred_product |
String | X when the manufacturer marks the product as preferred |
rohs_indicator |
String | Restriction of Hazardous Substances (RoHS) compliance |
prop_65_message |
String | California Proposition 65 warning text |
height, length, width |
String | Product dimensions |
height_uom, length_uom, width_uom |
String | Unit of measure for each dimension |
region_id |
String | Region of the current price, for example USA. See Pricing |
currency |
String | Currency of the current price |
list_price |
Decimal | Current list price |
price_effective_date |
Date | Date the current list price took effect (YYYY-MM-DD) |
next_list_price |
Decimal | Next scheduled list price, when the manufacturer has announced one |
next_effective_date |
Date | Date the next list price takes effect |
order_min |
Integer | Minimum order quantity |
order_increment |
Integer | Quantity the product must be ordered in multiples of |
units_qty, units_uom |
Integer, String | Number of units the price covers, and their unit of measure |
discount_code |
String | Manufacturer discount code |
tariff_code |
String | Harmonized tariff code |
stocked |
String | Manufacturer stocking status |
standard_lead_time |
String | Standard lead time |
product_life_cycle_status |
String | Life-cycle status, for example Active or Discontinued |
business_group |
String | Manufacturer business group |
language_code |
String | Language of the price record |
prices |
List of Price Objects | Every price record for the region, including fields not lifted to the top level such as msrp and imap |
primary_image |
Image Object | Main product image |
alternate_images |
List of Image Objects | Additional images, sorted by weight |
images_360 |
List of 360 Image Objects | 360-degree spin images |
primary_spec_sheet |
Simple File Object | Main specification sheet. Also listed in downloads |
safety_data_sheet |
Simple File Object | Safety data sheet (SDS). Also listed in downloads |
downloads |
List of File Groups | Downloadable documents, in groups |
videos |
List of File Groups | Videos, in groups |
packages |
List of Package Objects | Packaging levels such as each, box and case |
facets |
List of Facet Objects | Normalized, filterable attributes |
certifications |
List of Certification Objects | Certifications and compliance attributes |
features |
List of Attribute Groups | Marketing features (bullet points) |
specifications |
List of Attribute Groups | Technical specifications (name/value pairs) |
etim |
ETIM Object | ETIM classification |
categories |
List of Category Objects | DDS or distributor categories |
manufacturer_categories |
List of Category Objects | Categories supplied by the manufacturer |
related_products |
Related Products Object | Related, accessory and replacement products |
dds_normalized_attributes |
List of Normalized Attribute Objects | DDS normalized attributes. Only present for subscribers |
Pricing
Pricing
{
"region_id": "USA",
"currency": "USD",
"list_price": 248.0000,
"price_effective_date": "2026-10-07",
"next_list_price": 259.0000,
"next_effective_date": "2027-01-04",
"order_min": 1,
"units_qty": 1,
"units_uom": "each",
"tariff_code": "8467220020",
"product_life_cycle_status": "Active",
"prices": [
{
"region_id": "USA",
"currency": "USD",
"list_price": 248.0000,
"price_effective_date": "2026-10-07",
"imap": 149.0,
"order_min": 1,
"order_min_uom": "EA"
}
]
}
A manufacturer can supply several price records for a product, for different regions and effective dates. DDS picks one to flatten onto the product object:
- Only records for your export's price region are used (USA unless your export is set up otherwise).
- The product's primary price record for that region provides
list_price,currency,order_minand the other pricing fields listed in Item Details. - A record with a future effective date, if there is one, provides
next_list_priceandnext_effective_date.
Every record for the region is also delivered in prices. Use it for fields that are not lifted to the top level, such as msrp, imap, price_group_code or price_expiration_date. Multi CSV names two of these msrp_price and imap_price.
Price Object
Each entry in prices can contain any of these fields:
| Field Name | Data Type | Description |
|---|---|---|
region_id, currency, list_price, price_effective_date |
Same as the top-level fields | |
price_expiration_date |
Date | Date the price stops applying |
order_min, order_min_uom, order_increment |
Order quantity rules | |
units_qty, units_uom |
Integer, String | Units the price covers |
msrp |
Decimal | Manufacturer's suggested retail price |
imap |
Decimal | Internet minimum advertised price |
trade_price, user_price, dist_price |
Decimal | Additional manufacturer price levels |
discount_code, sub_discount_code, price_group_code |
String | Manufacturer pricing codes |
country_of_origin, tariff_code, export_commerce_control_number |
String | Trade classification |
stocked, standard_lead_time, product_life_cycle_status, business_group, language_code |
String | Same as the top-level fields |
Images and Sizes
Image Object
"primary_image": {
"name": "2522-20_1_Web.jpg",
"display_name": "primary_image",
"mime_type": "image/png",
"weight": 0,
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/large/8ee6ad83816f3f3f79d30b109bf570283b4a4953-large.png",
"source_url": "https://www.example-manufacturer.com/images/2522-20_1_Web.jpg",
"sizes": {
"thumb": {
"length": "3645",
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/thumbnails/8ee6ad83816f3f3f79d30b109bf570283b4a4953-thumb.png"
},
"small": {
"length": "35592",
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/small/8ee6ad83816f3f3f79d30b109bf570283b4a4953-small.png"
},
"medium": {
"length": "125059",
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/medium/8ee6ad83816f3f3f79d30b109bf570283b4a4953-medium.png"
},
"large": {
"length": "458701",
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/large/8ee6ad83816f3f3f79d30b109bf570283b4a4953-large.png"
},
"native": {
"length": "1601514",
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/images/native/8ee6ad83816f3f3f79d30b109bf570283b4a4953-native.png"
}
}
}
Every image comes in several sizes so you can pick the right one for each place it appears. All sizes are hosted on the DDS CDN.
Image Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Original file name. Useful as the file name in a Content-Disposition header |
display_name |
String | Label for the image |
mime_type |
String | MIME type of the hosted image |
weight |
Integer | Sort order. Lower numbers come first |
uri |
String | URL of the large image on the DDS CDN |
source_url |
String | Where DDS originally obtained the image, when known |
manufacturer_file_id |
String | Manufacturer's identifier for the file, when supplied |
sizes |
Sizes Object | The image in each available size |
Sizes Object
| Field Name | Data Type | Description |
|---|---|---|
thumb |
Size Object | Small thumbnail (about 64 px), cropped to a square. For search results and lists |
small |
Size Object | Up to 256 × 256 px. For search results, or a small product-page image |
medium |
Size Object | Up to 512 × 512 px. For the main product-page image |
large |
Size Object | Up to 1024 × 1024 px. For a zoomed view |
native |
Size Object | Original size from the manufacturer. Varies |
"Up to" sizes keep the image's original aspect ratio. The thumbnail is cropped to a square.
Size Object
| Field Name | Data Type | Description |
|---|---|---|
uri |
String | URL of the image at this size on the DDS CDN |
length |
String | File size in bytes (not a dimension). Not always present |
Spec Sheet and SDS
Simple File Object
"primary_spec_sheet": {
"name": "SB_Scouring Pads_HACCP INTL_Rev B.pdf",
"display_name": "Spec Sheet",
"mime_type": "application/pdf",
"weight": 0,
"uri": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/documents/608f424ece035b3af473d03030b0412d7185c9fb.pdf"
}
primary_spec_sheet and safety_data_sheet use the same simple file format. Both files are also listed in downloads. They are repeated at the top level so they are easy to find.
| Field Name | Data Type | Description |
|---|---|---|
name |
String | File name |
display_name |
String | Label for the file, as supplied by the manufacturer, for example "Spec Sheet" |
mime_type |
String | Usually application/pdf |
weight |
Integer | Sort order |
uri |
String | URL of the file on the DDS CDN |
360 Images
360 Images
"images_360": [
{
"cols": "24",
"rows": "1",
"initial_image": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/360_images/medium/483ef5ff38ca15b34cd7debe629412e4583b5860-r01-c01-medium.png",
"initial_thumb": "https://media.distributordatasolutions.com/xlsx_3M_synd/2021q1/360_images/thumbnails/483ef5ff38ca15b34cd7debe629412e4583b5860-r01-c01-thumb.png",
"filename": "483ef5ff38ca15b34cd7debe629412e4583b5860-r{row}-c{col}-medium.png",
"filename_large": "483ef5ff38ca15b34cd7debe629412e4583b5860-r{row}-c{col}-native.png",
"format": "row-column",
"iframe_url": "https://media.distributordatasolutions.com/assets/magic360/viewer.html?initial=/xlsx_3M_synd/2021q1/360_images/medium/483ef5ff38ca15b34cd7debe629412e4583b5860-r01-c01-medium.png&filename=483ef5ff38ca15b34cd7debe629412e4583b5860-r{row}-c{col}-medium.png&rows=1&cols=24",
"display_name": "5b953d11faff491882675e9914aea6bf 360 Image"
}
]
Embedding the viewer
<iframe src="https://media.distributordatasolutions.com/assets/magic360/viewer.html?initial=/xlsx_3M_synd/2021q1/360_images/medium/483ef5ff38ca15b34cd7debe629412e4583b5860-r01-c01-medium.png&filename=483ef5ff38ca15b34cd7debe629412e4583b5860-r{row}-c{col}-medium.png&rows=1&cols=24"></iframe>
Some products have 360-degree spin images. The simplest way to show one is to use iframe_url as the src of an <iframe>. That loads a ready-made DDS viewer. In JSON, initial_image and initial_thumb are full URLs; Multi CSV and XML give them as paths relative to the CDN.
To build your own viewer, use the frame files instead. Each frame's file name follows filename, with {row} and {col} replaced by two-digit numbers (r01-c01, r01-c02…).
360 Image Object
| Field Name | Data Type | Description |
|---|---|---|
cols |
String | Number of frames around the product |
rows |
String | Number of vertical rows of frames (usually 1) |
initial_image |
String | URL of the first frame, medium size |
initial_thumb |
String | URL of the first frame, thumbnail size |
filename |
String | File-name pattern for medium frames |
filename_large |
String | File-name pattern for full-size (native) frames |
format |
String | Always row-column |
iframe_url |
String | URL of the hosted 360 viewer for this product |
display_name |
String | Label for the 360 image |
Packages
Packages
"packages": [
{
"code": "58bd53eef0824020bcd8d611f61fd5fd",
"gtin": "10045242519955",
"qty": 6,
"qty_uom": "CASE",
"gross_weight": 28.55,
"gross_weight_uom": "lbs",
"pkg_length": 24.4,
"pkg_length_uom": "in",
"pkg_height": 10.7,
"pkg_height_uom": "in",
"pkg_width": 11.7,
"pkg_width_uom": "in",
"description": "Case"
}
]
Each package object describes one packaging level (each, inner pack, case, pallet). Many packaging fields are optional and are left out when the manufacturer does not supply them.
Package Object
| Field Name | Data Type | Description |
|---|---|---|
code |
String | DDS identifier for the package |
parent_code |
String | code of the package this one is contained in, when known |
gtin |
String | Usually GTIN-14, but can be any GTIN. See gtin.info |
sub_gtin |
String | GTIN of the smaller package inside this one |
sub_qty |
Integer | Number of smaller packages inside this one |
qty |
Integer | Quantity in the package |
qty_uom |
String | Unit of measure for qty |
gross_weight, gross_weight_uom |
Decimal, String | Package weight and its unit |
pkg_length, pkg_length_uom |
Decimal, String | Package length and its unit |
pkg_height, pkg_height_uom |
Decimal, String | Package height and its unit |
pkg_width, pkg_width_uom |
Decimal, String | Package width and its unit |
pkg_volume, pkg_volume_uom |
Decimal, String | Package volume and its unit |
description |
String | Description of the package, for example "Case" |
returnable |
String | Whether the package is returnable |
Manufacturer
Manufacturer
"manufacturer": {
"id": 33,
"name": "Pass & Seymour",
"parent_id": 32,
"parent_name": "Legrand",
"image": {
"name": "primary_image",
"mime_type": "image/png",
"weight": 30,
"uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-large.png",
"sizes": {
"thumb": { "uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-thumb.png" },
"small": { "uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-small.png" },
"medium": { "uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-medium.png" },
"large": { "uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-large.png" },
"native": { "uri": "https://media.distributordatasolutions.com/ManufacturerLogos/Pass+%26+Seymour/_sized/primary_logo-native.png" }
}
}
}
The manufacturer of the product, its parent company where there is one, and the manufacturer's logo.
| Field Name | Data Type | Description |
|---|---|---|
id |
Integer | DDS identifier for the manufacturer |
name |
String | Manufacturer name |
parent_id |
Integer | DDS identifier of the parent company, when there is one |
parent_name |
String | Name of the parent company, when there is one |
image |
Image Object | Manufacturer logo. Logo sizes carry uri only, and a size can be empty |
Categories
Categories
"manufacturer_categories": [
{
"category_id": 2334443,
"code": "a7335bc27671df5fea6b2f004e0e3637",
"name": "Fiber Optic Systems"
},
{
"category_id": 2334497,
"code": "3960d5798a46e3a83f964ceac1728c1f",
"name": "Fiber Optic Cable Assemblies",
"parent_id": 2334443
}
]
"categories": [
{
"category_id": 690156,
"code": "690156",
"name": "Tools & Hardware",
"is_ai_generated": 1
},
{
"category_id": 690237,
"code": "690237",
"name": "Power Tools & Accessories",
"parent_id": 690156,
"is_ai_generated": 1
}
]
Products can carry two category trees:
manufacturer_categories: the manufacturer's own taxonomy, where the manufacturer supplies one.categories: the DDS taxonomy, or your own distributor taxonomy if your export is configured with one.
Each list holds every level of the product's branch. Link levels together with parent_id. The top level has no parent_id.
Category Object
| Field Name | Data Type | Description |
|---|---|---|
category_id |
Integer | Unique identifier for the category |
parent_id |
Integer | category_id of the parent category. Absent for top-level categories |
code |
String | Code that uniquely identifies the category |
name |
String | Category name |
source_id, source_parent_id |
String | Distributor taxonomy only: your own identifiers for the category and its parent |
is_ai_generated |
Integer | Distributor categories only: 1 when the category was assigned by AI. Absent otherwise. Never present in manufacturer_categories |
Facets
Facets
"facets": [
{
"data_key": "blade_diameter",
"name": "Blade Diameter",
"values": [
{
"value": "3",
"value_with_uom": "3 inches",
"uom_unit": "inch",
"uom_unit_plural": "inches",
"uom_abbreviation": "in",
"uom_abbreviation_plural": "in"
}
]
},
{
"data_key": "material",
"name": "Material",
"values": [
{ "value": "ABS", "value_with_uom": "ABS" },
{ "value": "Plastic", "value_with_uom": "Plastic" }
]
}
]
Facets are normalized, filterable attributes curated by the DDS data team. The same facet (data_key) means the same thing across every manufacturer, and units of measure are split from the value. That makes facets a good fit for search filters and comparison tables.
A facet can have several values, for example a product that comes in more than one color. Facets are sorted by data_key, and values are sorted by value.
Facet Object
| Field Name | Data Type | Description |
|---|---|---|
data_key |
String | Stable identifier for the facet |
name |
String | Display name |
values |
List of Facet Value Objects | One or more values |
Facet Value Object
| Field Name | Data Type | Description |
|---|---|---|
value |
String | Value without its unit of measure |
value_with_uom |
String | Value with its unit, pluralized correctly, for display |
uom_unit |
String | Unit of measure, singular. Absent for unitless facets |
uom_unit_plural |
String | Unit of measure, plural |
uom_abbreviation |
String | Unit abbreviation, singular |
uom_abbreviation_plural |
String | Unit abbreviation, plural |
Certifications
Certifications
"certifications": [
{
"name": "Drill Hole Distance",
"value": "466 mm",
"type": "Physical Dimensions & Form Factor"
},
{
"name": "Model Type",
"value": "Special profile",
"type": "Product Identification & Catalog Info"
},
{
"name": "Material Thickness",
"value": "2.5 mm",
"type": "Construction & Materials"
}
]
Certifications are name/value attributes that DDS has classified under a general type. Types seen in current exports include:
- Technical Specifications (Core Performance)
- Physical Dimensions & Form Factor
- Construction & Materials
- Tested Performance & Ratings
- Origin & Trade Classification
- Product Identification & Catalog Info
- Environmental & Material Declarations
- Unclear — cannot classify
The list of types can grow, so do not treat it as a fixed enumeration.
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Attribute name |
value |
String | Attribute value |
type |
String | General type the attribute is classified under |
Features and Specifications
Features and Specifications
"specifications": [
{
"group_name": "Busbar Cover Data",
"group_items": [
{
"name": "Busbar Cover and Shroud",
"value": "Individual Busbar Covers (for 10 mm Busbar)",
"weight": 10
}
]
}
],
"features": [
{
"group_name": "Features",
"group_items": [
{ "value": "Internal flanges provide solid, twist-resistant shaft anchor", "weight": 10 },
{ "value": "Cushion-Grip handle allows for greater torque and comfort", "weight": 20 }
]
},
{
"group_name": "Warnings",
"group_items": [
{ "value": "NOT insulated. Will NOT protect against electrical shock.", "weight": 10 }
]
}
]
Features and specifications come as the manufacturer supplied them, in named groups. Manufacturers often split their data into sections, and the group name keeps that context.
- Features are marketing points, usually shown as a bulleted list. Feature items have no
name. - Specifications are name/value pairs, usually shown as a two-column table or as "Name: value".
Items within a group are sorted by weight.
Attribute Group
| Field Name | Data Type | Description |
|---|---|---|
group_name |
String | Display name of the group |
group_items |
List of Attribute Objects | The attributes in the group |
Attribute Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Attribute name. Specifications only |
value |
String | Attribute value |
weight |
Integer | Sort order |
Downloads and Videos
Downloads and Videos
"downloads": [
{
"group_name": "Manuals",
"group_items": [
{
"name": "22d-qs001_-en-p.pdf",
"display_name": "Quick Start Manual",
"mime_type": "application/pdf",
"uri": "https://media.distributordatasolutions.com/AB-Symmetrix/2018q2/495d211239c5cc2cad89c4b2a4a1562ee0de50b4.pdf",
"ext_hosted": 0,
"weight": 10,
"locale": "en-US"
}
]
}
],
"videos": [
{
"group_name": "Videos",
"group_items": [
{
"name": "Installation Video",
"display_name": "Product Video",
"mime_type": "text/html",
"uri": "https://www.youtube.com/embed/JXzxHWPe2kA",
"ext_hosted": 1,
"weight": 10,
"locale": "en-US",
"description": "Step-by-step installation walkthrough",
"duration": "7 m 20 s"
}
]
}
]
Downloads (documents such as manuals, catalogs and certificates) and videos are delivered in named groups, like features and specifications. Files within a group are sorted by weight.
When ext_hosted is 0, the file is hosted on the DDS CDN. When it is 1, the file is hosted elsewhere, typically a YouTube or Vimeo embed URL that you can use as an <iframe> source.
File Group
| Field Name | Data Type | Description |
|---|---|---|
group_name |
String | Display name of the group |
group_items |
List of File Objects | The files in the group |
File Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | File name |
display_name |
String | Human-readable label for the file |
mime_type |
String | MIME type of the file |
uri |
String | URL of the file |
ext_hosted |
Integer | 1 if the file is hosted outside DDS, otherwise 0 |
weight |
Integer | Sort order |
locale |
String | Language of the file, for example en-US |
description |
String | Longer description of the file |
duration |
String | Videos: running time, for example 7 m 20 s. Downloads: when present, the file size in bytes |
manufacturer_file_id |
String | Manufacturer's identifier for the file, when supplied |
ETIM
ETIM
"etim": {
"group_code": "EG000011",
"group_description": "Cabinet enclosures",
"class_code": "EC002625",
"class_description": "Mounting accessories (switchgear cabinet)",
"version": 7,
"features": [
{
"feature_code": "EF000008",
"feature_name": "Width",
"value_string": "930.00",
"unit_code": "EU570448",
"unit_name": "Millimetre"
},
{
"feature_code": "EF000215",
"feature_name": "Type of accessory/spare part",
"value_code": "EV000154"
}
]
}
ETIM is an international standard for classifying technical products. When a product has been classified, etim holds its group and class, plus a list of feature values. Exports carry one ETIM version, version 7 unless your export is set up otherwise.
ETIM Object
| Field Name | Data Type | Description |
|---|---|---|
group_code |
String | ETIM group the class belongs to |
group_description |
String | Name of the group |
class_code |
String | ETIM class of the product |
class_description |
String | Name of the class |
version |
Integer | ETIM version used to classify the product |
features |
List of ETIM Feature Objects | Feature values |
ETIM Feature Object
| Field Name | Data Type | Description |
|---|---|---|
feature_code |
String | ETIM feature code |
feature_name |
String | Name of the feature |
value_code |
String | ETIM value code, for alphanumeric features |
value_string |
String | Value, for numeric, logical and range features |
unit_code |
String | ETIM unit code |
unit_name |
String | Name of the unit |
DDS Normalized Attributes
DDS Normalized Attributes
"dds_normalized_attributes": [
{
"manufacturer_attribute_name": "Weight",
"manufacturer_value": "1.422000000 lbs",
"highly_normalized": {
"name": "Weight",
"normalized_values": [
{ "name": "Weight", "value": "1.422", "uom_unit": "lb", "value_with_uom": "1.422 lb" }
]
},
"detail_normalized": {
"name": "Weight",
"normalized_value": "1.422 lbs"
}
},
{
"manufacturer_attribute_name": "Surface protection",
"manufacturer_value": "Galvanic/electrolytic zinc plated",
"highly_normalized": {
"name": "Surface Protection",
"normalized_values": [
{ "name": "Surface Protection", "value": "Galvanic Zinc-Plated", "uom_unit": "", "value_with_uom": "Galvanic Zinc-Plated" },
{ "name": "Surface Protection", "value": "Electrolytic Zinc-Plated", "uom_unit": "", "value_with_uom": "Electrolytic Zinc-Plated" }
]
},
"detail_normalized": {
"name": "Surface Protection",
"normalized_value": "Galvanic Zinc-Plated, Electrolytic Zinc-Plated"
}
}
]
DDS normalized attributes take each manufacturer specification and give it a consistent name and value at two levels:
- Highly normalized: a standard attribute name, with the value split into one or more clean values and units. Best for filtering and comparison.
- Detail normalized: a standard attribute name, with a cleaned-up but more complete value. Best for display.
Normalized Attribute Object
| Field Name | Data Type | Description |
|---|---|---|
manufacturer_attribute_name |
String | Attribute name as supplied by the manufacturer. Matches a specification name |
manufacturer_value |
String | Value as supplied by the manufacturer. Matches a specification value |
highly_normalized |
Highly Normalized Object | Standard name and values |
detail_normalized |
Detail Normalized Object | Standard name and display value |
Highly Normalized Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Standard attribute name |
normalized_values |
List of Normalized Value Objects | Usually one value. More than one when the manufacturer's value is a list |
Normalized Value Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Standard attribute name (same as the parent name) |
value |
String | Normalized value without its unit |
uom_unit |
String | Unit of measure. An empty string when the value has no unit |
value_with_uom |
String | Value and unit together, for display |
Detail Normalized Object
| Field Name | Data Type | Description |
|---|---|---|
name |
String | Standard attribute name |
normalized_value |
String | Cleaned-up value for display |
Related Products
Related Products
"related_products": {
"accessory": ["EWF172", "97446C"],
"related": ["LZS8S", "LZS8WSSK"],
"replaced_by": ["2522-21XC"]
}
related_products links a product to others from the same manufacturer. Each key is a relationship type, and its value is a list of manufacturer catalog numbers. Only the relationship types that have data are present. Common types are related, accessory, compatible, cross_sell, up_sell, spare_part, replaces and replaced_by.
Multi CSV Implementation Guide
Multi CSV Files
A delivered Multi CSV export
items.csv
alternate-images.csv
features.csv
specifications.csv
downloads.csv
videos.csv
packaging.csv
manufacturer-categories.csv
facets.csv
facet-keys.csv
image360.csv
manufacturer.csv
_SUCCESS
The Multi CSV export splits product data across several files, one per type of data:
| File | One row per | Contents |
|---|---|---|
items.csv |
product | Item details, pricing, primary image and spec sheet |
alternate-images.csv |
image | Additional product images |
features.csv |
feature | Marketing features |
specifications.csv |
specification | Technical specifications |
downloads.csv |
document | Downloadable documents |
videos.csv |
video | Product videos |
packaging.csv |
package level | Packaging levels and GTINs |
manufacturer-categories.csv |
category level | Manufacturer taxonomy |
facets.csv |
facet value | Normalized, filterable attributes |
facet-keys.csv |
facet | Facets each product has |
image360.csv |
360 image | 360-degree spin images |
manufacturer.csv |
manufacturer | Manufacturer, parent company and logo |
How the files fit together
items.csv has exactly one row per product. The other product files can have many rows per product: a product with five downloads has five rows in downloads.csv. Join them back to items.csv on the first column, product_id.
manufacturer.csv is the exception: it has one row per manufacturer, and its first column holds the manufacturer ID. Join it to items.csv on manufacturer_name. See Manufacturer.
Splitting the data this way means there are no numbered columns such as document1, document2…, no limit on how many images or documents a product can have, and room for useful detail on each item, such as a document's MIME type and display name.
CSV format
Our files follow RFC 4180. Use these settings in your CSV reader:
| Setting | Value | Notes |
|---|---|---|
| Header | Yes | Every file starts with a header row. Read columns by name rather than position |
| Delimiter | , |
Comma |
| Text qualifier | " |
Values are wrapped in double quotes only when needed: when they contain a comma, a double quote or a line break |
| Escape character | " |
A double quote inside a value is doubled ("") |
| Encoding | UTF-8 | |
| Empty values | Treat an empty field and "" the same: no value |
Each data type is normally delivered as a single file. A very large file may be split into numbered parts (items-1.csv, items-2.csv…). Process every part.
Item Details
items.csv
product_id,manufacturer_catalog_number,name,upc,manufacturer_name,product_title,long_description,short_description,...,region_id,list_price,...,primary_image_uri,...
61766,YHO-125,Overhead Compression Tap,781810139059,Burndy,,"Wide range, universal figure H shaped aluminum connector...",Overhead Compression Tap,...,USA,12.34,...,https://media.distributordatasolutions.com/...-large.png,...
Full column list, in order
product_id,manufacturer_catalog_number,name,upc,manufacturer_name,
product_title,long_description,short_description,invoice_description,
rohs_indicator,family_code,preferred_product,length,length_uom,width,
width_uom,height,height_uom,weight,weight_uom,sub_brand,custom_keywords,
prop_65_message,ean,upc_11,retail_flag,country_of_origin,
abc_classification,hazardous_material,manufacturer_product_group,
region_id,list_price,units_qty,units_uom,price_country_of_origin,
order_min,order_min_uom,order_increment,price_effective_date,
price_expiration_date,currency,tariff_code,stocked,discount_code,
price_group_code,sub_discount_code,standard_lead_time,
export_commerce_control_number,business_group,product_life_cycle_status,
language_code,tech_segment,next_effective_date,next_list_price,
trade_price,user_price,dist_price,imap_price,msrp_price,
primary_image_uri,primary_image_name,primary_image_display_name,
primary_image_mime_type,primary_image_thumb_uri,primary_image_small_uri,
primary_image_medium_uri,primary_image_large_uri,primary_image_native_uri,
primary_spec_sheet_uri,primary_spec_sheet_name,
primary_spec_sheet_display_name,primary_spec_sheet_mime_type,
safety_data_sheet_uri,safety_data_sheet_name,
safety_data_sheet_display_name,safety_data_sheet_mime_type
One row per product.
Identity and descriptions
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | DDS unique identifier for the product |
manufacturer_catalog_number |
String | Uniquely identifies the product within its manufacturer |
name |
String | Product name |
upc |
String | UPC-A: 12 digits, can have leading zeros |
manufacturer_name |
String | Manufacturer of the product |
product_title |
String | Product title, when the manufacturer supplies one |
short_description |
String | Brief description of the product |
long_description |
String | Longer description of the product |
invoice_description |
String | Manufacturer's description for invoices and order sheets |
rohs_indicator |
String | RoHS compliance |
family_code |
String | Product group or family, defined by the manufacturer |
preferred_product |
String | X when the manufacturer marks the product as preferred |
length, width, height, weight |
Decimal | Product dimensions and weight |
length_uom, width_uom, height_uom, weight_uom |
String | Unit of measure for each |
sub_brand |
String | Manufacturer sub-brand |
custom_keywords |
String | Manufacturer search keywords |
prop_65_message |
String | California Proposition 65 warning text |
ean |
String | European Article Number |
upc_11 |
String | 11-digit UPC |
retail_flag |
String | Manufacturer retail flag |
country_of_origin |
String | Country where the product was manufactured |
abc_classification |
String | Manufacturer ABC (sales velocity) classification |
hazardous_material |
String | Hazardous material indicator |
manufacturer_product_group |
String | Manufacturer's product group |
Pricing
Pricing columns come from the product's current price in your export's price region (USA unless your export is set up otherwise).
| Field Name | Data Type | Description |
|---|---|---|
region_id |
String | Region the price applies to |
list_price |
Decimal | List price |
currency |
String | Currency of the price |
units_qty, units_uom |
Integer, String | Number of units the price covers, and their unit |
price_country_of_origin |
String | Country of origin on the price record |
order_min, order_min_uom |
Integer, String | Minimum order quantity and its unit |
order_increment |
Integer | Quantity the product must be ordered in multiples of |
price_effective_date |
Date | Date the price took effect (YYYY-MM-DD) |
price_expiration_date |
Date | Date the price stops applying |
next_list_price, next_effective_date |
Decimal, Date | Next scheduled list price and when it takes effect |
tariff_code |
String | Harmonized tariff code |
stocked |
String | Manufacturer stocking status |
discount_code, sub_discount_code, price_group_code |
String | Manufacturer pricing codes |
standard_lead_time |
String | Standard lead time |
export_commerce_control_number |
String | Export control classification |
business_group |
String | Manufacturer business group |
product_life_cycle_status |
String | Life-cycle status, for example Active or Discontinued |
language_code |
String | Language of the price record |
tech_segment |
String | Manufacturer technology segment |
trade_price, user_price, dist_price |
Decimal | Additional manufacturer price levels |
imap_price |
Decimal | Internet minimum advertised price |
msrp_price |
Decimal | Manufacturer's suggested retail price |
Primary image and documents
| Field Name | Data Type | Description |
|---|---|---|
primary_image_uri |
String | URL of the large primary image |
primary_image_name |
String | Original file name of the image |
primary_image_display_name |
String | Label for the image |
primary_image_mime_type |
String | MIME type of the hosted image |
primary_image_thumb_uri … primary_image_native_uri |
String | URL of the image in each size. See Image sizes |
primary_spec_sheet_uri, primary_spec_sheet_name, primary_spec_sheet_display_name, primary_spec_sheet_mime_type |
String | Main specification sheet. Also listed in downloads.csv |
safety_data_sheet_uri, safety_data_sheet_name, safety_data_sheet_display_name, safety_data_sheet_mime_type |
String | Safety data sheet (SDS). Also listed in downloads.csv |
Alternate Images
alternate-images.csv
product_id,manufacturer_catalog_number,name,display_name,uri,mime_type,small_uri,medium_uri,large_uri,native_uri
20108475,WEEB-LUG-6.7,BURN_WEEB-LUG-6.7_PRODIMAGE_180DEG_1200.jpg,alternate_image,https://media.distributordatasolutions.com/325/synd_hubbell/large/ceadedd896135704ae6bbded57b6e441b5276ac7-large.png,image/png,https://media.distributordatasolutions.com/325/synd_hubbell/small/ceadedd896135704ae6bbded57b6e441b5276ac7-small.png,https://media.distributordatasolutions.com/325/synd_hubbell/medium/ceadedd896135704ae6bbded57b6e441b5276ac7-medium.png,https://media.distributordatasolutions.com/325/synd_hubbell/large/ceadedd896135704ae6bbded57b6e441b5276ac7-large.png,https://media.distributordatasolutions.com/325/synd_hubbell/native/ceadedd896135704ae6bbded57b6e441b5276ac7-native.png
One row per additional image, in display order. All images are hosted on the DDS CDN.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the image belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
name |
String | Original file name of the image |
display_name |
String | Label for the image |
uri |
String | URL of the large image |
mime_type |
String | MIME type of the hosted image |
small_uri, medium_uri, large_uri, native_uri |
String | URL of the image in each size |
Image sizes
| Size | Dimensions | Good for |
|---|---|---|
| thumb | Small thumbnail (about 64 px), cropped to a square | Search results and lists |
| small | Up to 256 × 256 px | Search results, small product-page image |
| medium | Up to 512 × 512 px | Main product-page image |
| large | Up to 1024 × 1024 px | Zoomed view |
| native | Original size from the manufacturer | Full-resolution zoom |
"Up to" sizes keep the image's original aspect ratio. The thumbnail is cropped to a square. alternate-images.csv has no thumbnail column; only the primary image has primary_image_thumb_uri.
Features and Specifications
features.csv
product_id,manufacturer_catalog_number,group_name,name,value,weight
2909371,U27D1,Features,,Durable Stainless Steel Material,0
2909371,U27D1,Features,,Corrosion resistant,10
specifications.csv
product_id,manufacturer_catalog_number,group_name,name,value
2909371,U27D1,Specifications,Die Index,14
2909371,U27D1,Specifications,Material,Stainless Steel
Features and specifications come as the manufacturer supplied them, in named groups. Each row is one attribute. group_name keeps the manufacturer's sections.
- Features are marketing points, usually shown as a bulleted list.
nameis always empty. Sort byweight. - Specifications are name/value pairs, usually shown as a two-column table.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the attribute belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
group_name |
String | Name of the group the attribute belongs to |
name |
String | Attribute name. Empty for features |
value |
String | Attribute value |
weight |
Integer | Features only: sort order |
Downloads and Videos
downloads.csv / videos.csv
product_id,manufacturer_catalog_number,group_name,name,display_name,mime_type,uri,ext_hosted,weight,description,duration,embed_html
2909371,U27D1,Downloads,BRDY-U27D1-SPEC-EN.pdf,Spec Sheet,application/pdf,https://media.distributordatasolutions.com/325/synd_hubbell/07efe77d8c58369faeb4a1753cedab06bd896d96.pdf,0,0,,,
62945,PAT750CLI,Videos,Product Video 2,Product Video 2,text/html,https://www.youtube.com/embed/GFPgSdDaHQE,1,10,,,
One row per document or video, in named groups. downloads.csv and videos.csv have the same columns.
When ext_hosted is 0, the file is hosted on the DDS CDN. When it is 1, the file is hosted elsewhere, typically a YouTube or Vimeo embed URL that you can use as an <iframe> source.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the file belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
group_name |
String | Name of the group the file belongs to |
name |
String | File name |
display_name |
String | Human-readable label for the file |
mime_type |
String | MIME type of the file |
uri |
String | URL of the file |
ext_hosted |
Integer | 1 if the file is hosted outside DDS, otherwise 0 |
weight |
Integer | Sort order |
description |
String | Longer description of the file |
duration |
String | Always empty in Multi CSV. Video running time is only delivered in JSON and XML |
embed_html |
String | Always empty |
Packaging
packaging.csv
product_id,manufacturer_catalog_number,gtin,sub_gtin,sub_qty,qty,qty_uom,gross_weight,gross_weight_uom,pkg_length,pkg_length_uom,pkg_height,pkg_height_uom,pkg_width,pkg_width_uom,description,returnable
2909371,U27D1,50781810008060,00781810008065,,1,,0.32,lbs,2.69,in,2.75,in,1.94,in,,
One row per packaging level (each, inner pack, case, pallet).
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the package belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
gtin |
String | Usually GTIN-14, but can be any GTIN. See gtin.info |
sub_gtin |
String | GTIN of the smaller package inside this one |
sub_qty |
Integer | Number of smaller packages inside this one |
qty |
Integer | Quantity in the package |
qty_uom |
String | Unit of measure for qty |
gross_weight, gross_weight_uom |
Decimal, String | Package weight and its unit |
pkg_length, pkg_length_uom |
Decimal, String | Package length and its unit |
pkg_height, pkg_height_uom |
Decimal, String | Package height and its unit |
pkg_width, pkg_width_uom |
Decimal, String | Package width and its unit |
description |
String | Description of the package, for example "Case" |
returnable |
String | Whether the package is returnable |
Manufacturer Categories
manufacturer-categories.csv
product_id,manufacturer_catalog_number,category_id,parent_id,code,name
22017267,RC-3X3,1293941,,75a590f43c0627b38b8c3e6f7c557313,Objects
22017267,RC-3X3,1293942,1293941,049e3087778fb9a172b31b19dd442a0e,Cubes
22017267,RC-3X3,1293943,1293942,d0e32a31200e8055acf38eacf420a022,Puzzle Cubes
The manufacturer's own taxonomy, where the manufacturer supplies one. Each row is one level of the product's category branch. Link levels together with parent_id. The top level has an empty parent_id.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the category belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
category_id |
Integer | Unique identifier for the category |
parent_id |
Integer | category_id of the parent category. Empty for top-level categories |
code |
String | Code that uniquely identifies the category |
name |
String | Category name |
Facets
facets.csv
product_id,name,value,value_with_uom,data_key,uom_unit,uom_unit_plural,uom_abbreviation,uom_abbreviation_plural
99999,Overall Length,25.4,25.4 millimeters,overall_length,millimeter,millimeters,mm,mm
88888,Material,ABS,ABS,material,,,,
88888,Material,Plastic,Plastic,material,,,,
facet-keys.csv
product_id,manufacturer_catalog_number,data_key,name
99999,AB-100,overall_length,Overall Length
88888,CD-200,material,Material
Facets are normalized, filterable attributes curated by the DDS data team. The same facet (data_key) means the same thing across every manufacturer, and units of measure are split from the value.
- facets.csv has one row per facet value. A facet can have several values (a product that comes in black and yellow has two
colorrows), so a product can have several rows for the samedata_key. - facet-keys.csv has one row per facet per product, without values. Some customers load this first to map each
data_keyto their own attribute IDs, then load the values.
facets.csv
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the facet value belongs to |
name |
String | Display name of the facet |
value |
String | Value without its unit of measure |
value_with_uom |
String | Value with its unit, pluralized correctly, for display |
data_key |
String | Stable identifier for the facet |
uom_unit, uom_unit_plural |
String | Unit of measure, singular and plural. Empty for unitless facets |
uom_abbreviation, uom_abbreviation_plural |
String | Unit abbreviation, singular and plural |
facet-keys.csv
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product that has the facet |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
data_key |
String | Stable identifier for the facet |
name |
String | Display name of the facet |
360 Images
image360.csv
product_id,manufacturer_catalog_number,cols,rows,initial_image,filename,initial_thumb,filename_large,format,iframe_url,display_name
17954343,10031S,24,1,xlsx_southwire/2020q2/360_images/medium/3ac2417883084a414d43c43411417663dc130c81-r01-c01-medium.png,3ac2417883084a414d43c43411417663dc130c81-r{row}-c{col}-medium.png,xlsx_southwire/2020q2/360_images/thumbnails/3ac2417883084a414d43c43411417663dc130c81-r01-c01-thumb.png,3ac2417883084a414d43c43411417663dc130c81-r{row}-c{col}-native.png,row-column,https://media.distributordatasolutions.com/assets/magic360/viewer.html?initial=/xlsx_southwire/2020q2/360_images/medium/3ac2417883084a414d43c43411417663dc130c81-r01-c01-medium.png&filename=3ac2417883084a414d43c43411417663dc130c81-r{row}-c{col}-medium.png&rows=1&cols=24,576703f347b44abb80b1c9d9073d7a88 360 Image
Embedding the viewer
<iframe src="https://media.distributordatasolutions.com/assets/magic360/viewer.html?initial=/xlsx_southwire/2020q2/360_images/medium/3ac2417883084a414d43c43411417663dc130c81-r01-c01-medium.png&filename=3ac2417883084a414d43c43411417663dc130c81-r{row}-c{col}-medium.png&rows=1&cols=24"></iframe>
Some products have 360-degree spin images. The simplest way to show one is to use iframe_url as the src of an <iframe>. That loads a ready-made DDS viewer. Note that initial_image and initial_thumb are paths relative to https://media.distributordatasolutions.com/, not full URLs.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the 360 image belongs to |
manufacturer_catalog_number |
String | Manufacturer catalog number of the product |
cols |
Integer | Number of frames around the product |
rows |
Integer | Number of vertical rows of frames |
initial_image |
String | Path of the first frame, medium size, relative to https://media.distributordatasolutions.com/ |
filename |
String | File-name pattern for medium frames. {row} and {col} are two-digit numbers |
initial_thumb |
String | Path of the first frame, thumbnail size, relative to https://media.distributordatasolutions.com/ |
filename_large |
String | File-name pattern for full-size (native) frames |
format |
String | Always row-column |
iframe_url |
String | URL of the hosted 360 viewer for this product |
display_name |
String | Label for the 360 image |
Manufacturer
manufacturer.csv
product_id,manufacturer_name,parent_manufacturer,manufacturer_logo
17790,CGW Abrasives,,https://media.distributordatasolutions.com/ManufacturerLogos/CGW/_sized/primary_logo-large.png
One row per manufacturer in the export.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | DDS manufacturer ID |
manufacturer_name |
String | Manufacturer name, as in items.csv |
parent_manufacturer |
String | Parent company, when there is one |
manufacturer_logo |
String | URL of the manufacturer's logo |
DDS Normalized Attributes
normalize-attributes.csv
product_id,name,value,uom,value_with_uom
20108475,Size,8.5,mm,8.5 mm
20108475,Material,Stainless Steel,,Stainless Steel
DDS normalized attributes give each manufacturer specification a consistent name, with the value split from its unit. There is one row per attribute value.
| Field Name | Data Type | Description |
|---|---|---|
product_id |
Integer | Product the attribute belongs to |
name |
String | Normalized attribute name |
value |
String | Normalized value without its unit |
uom |
String | Unit of measure, when there is one |
value_with_uom |
String | Value and unit together, for display |
XML Implementation Guide
XML Files
File structure
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<products>
<product>...</product>
<product>...</product>
<product>...</product>
</products>
An XML export is delivered as a single file, part-00000.xml. It is UTF-8 encoded, with one root <products> element holding one <product> element per product. Exports set up as multi-file are split into numbered part files of up to 25,000 products, each with the same structure; process every .xml file in the folder.
The XML carries most of the data in the JSON export. It does not include the manufacturer object and logo, the full prices list, related products, distributor attributes or DDS normalized attributes, and it has a single category list. Differences in individual fields are noted below.
Missing values
Elements with no value are left out rather than written empty. For example, <packages> is absent when the manufacturer supplies no packaging. A few list elements, such as <categories/> and <certifications/>, are written as an empty element when there is nothing to report.
Repeated elements
Lists are written in one of three shapes:
| Shape | Used by | Example |
|---|---|---|
| One wrapper around all items | packages, certifications, facets, categories, features, specification and file groups | <facets><facet>…</facet><facet>…</facet></facets> |
| One wrapper per item | alternate images, facet values | <alternate_images><alternate_image>…</alternate_image></alternate_images> repeated |
| Repeated element, no inner item | 360 images, ETIM features | <images_360>…</images_360> repeated |
An XML parser that collects every matching element handles all three.
Product
Product
<product>
<manufacturer_name>Panduit</manufacturer_name>
<code>9a79d95442b0f01916f4a33a43f65e1a</code>
<manufacturer_catalog_number>UTP28SP2MGY</manufacturer_catalog_number>
<name>CU Patch Crd,Cat 6,SD,2m,GY</name>
<upc>074983960095</upc>
<price>...</price>
<primary_image>...</primary_image>
<alternate_images>...</alternate_images>
<primary_spec_sheet>...</primary_spec_sheet>
<packages>...</packages>
<certifications/>
<facets>...</facets>
<categories>...</categories>
<features>...</features>
<specifications>...</specifications>
<downloads>...</downloads>
<etim>...</etim>
<long_description>The TX6-28 Cat 6 UTP Patch Cord is a 2-meter...</long_description>
<short_description>CU Patch Crd,Cat 6,SD,2m,GY</short_description>
<invoice_description>CU Patch Crd,Cat 6,SD,2m,GY</invoice_description>
<rohs_indicator>Compliant</rohs_indicator>
<length>14.3</length>
<length_uom>Inch</length_uom>
<sub_brand>Pan-Net</sub_brand>
<custom_keywords>Patch Cord|Patch cord copper|Data cable</custom_keywords>
<ean>00074983960095</ean>
<country_of_origin>MEX, CHN, ROU</country_of_origin>
</product>
| Element | Data Type | Description |
|---|---|---|
manufacturer_name |
String | Manufacturer of the product |
code |
String | DDS identifier for the product |
manufacturer_catalog_number |
String | Uniquely identifies the product within its manufacturer |
name |
String | Product name |
upc |
String | UPC-A: 12 digits, can have leading zeros |
price |
Price | Current price |
primary_image |
Image | Main product image |
alternate_images |
Image (repeated) | Additional images |
primary_spec_sheet |
Simple File | Main specification sheet |
safety_data_sheet |
Simple File | Safety data sheet (SDS) |
packages |
Package list | Packaging levels |
certifications |
Certification list | Manufacturer certification records. Not the same data as JSON certifications |
facets |
Facet list | Normalized, filterable attributes |
categories |
Category list | Product categories |
images_360 |
360 Image (repeated) | 360-degree spin images |
features |
Feature list | Marketing features |
specifications |
Specification groups | Technical specifications |
downloads |
File groups | Downloadable documents |
videos |
File groups | Product videos |
etim |
ETIM | ETIM classification |
The product's descriptive fields follow as simple text elements:
| Element | Description |
|---|---|
product_title |
Product title, when the manufacturer supplies one |
long_description |
Longer description of the product |
short_description |
Brief description of the product |
invoice_description |
Manufacturer's description for invoices and order sheets |
rohs_indicator |
RoHS compliance |
family_code |
Product group or family, defined by the manufacturer |
preferred_product |
X when the manufacturer marks the product as preferred |
length, width, height, depth, weight |
Product dimensions and weight |
length_uom, width_uom, height_uom, depth_uom, weight_uom |
Unit of measure for each |
sub_brand |
Manufacturer sub-brand |
custom_keywords |
Manufacturer search keywords, separated by the pipe character |
prop_65_message |
California Proposition 65 warning text |
ean |
European Article Number |
upc_11 |
11-digit UPC |
gtin |
GTIN of the product |
retail_flag |
Manufacturer retail flag |
country_of_origin |
Country or countries where the product was manufactured |
abc_classification |
Manufacturer ABC (sales velocity) classification |
hazardous_material |
Hazardous material indicator |
manufacturer_product_group, product_group_code, manufacturer_group_code |
Manufacturer product grouping codes |
reach_status, reach_list_date |
EU REACH regulation status and the date it was listed |
Price
Price
<price>
<region_id>USA</region_id>
<list_price>248.0000</list_price>
<order_min>10</order_min>
<price_effective_date>2026-10-01</price_effective_date>
<currency>USD</currency>
<tariff_code>8544422000</tariff_code>
<business_group>CTO</business_group>
</price>
The product's current price in your export's price region (USA unless your export is set up otherwise).
| Element | Data Type | Description |
|---|---|---|
region_id |
String | Region the price applies to |
list_price |
Decimal | List price |
currency |
String | Currency of the price |
units_qty, units_uom |
Integer, String | Number of units the price covers, and their unit |
country_of_origin |
String | Country of origin on the price record |
order_min |
Integer | Minimum order quantity |
order_increment |
Integer | Quantity the product must be ordered in multiples of |
price_effective_date |
Date | Date the price took effect (YYYY-MM-DD) |
next_list_price, next_effective_date |
Decimal, Date | Next scheduled list price and when it takes effect |
tariff_code |
String | Harmonized tariff code |
stocked |
String | Manufacturer stocking status |
discount_code |
String | Manufacturer discount code |
standard_lead_time |
String | Standard lead time |
business_group |
String | Manufacturer business group |
language_code |
String | Language of the price record |
Images and Sizes
Images
<primary_image>
<name>111885243.jpg</name>
<display_name>primary_image</display_name>
<mime_type>image/png</mime_type>
<uri>https://media.distributordatasolutions.com/209/panduit/large/1e195309331f4536a4c7ffaa82f0d2f6b2a062f3-large.png</uri>
<sizes>
<thumb>
<length>1738</length>
<uri>https://media.distributordatasolutions.com/209/panduit/thumbnails/1e195309331f4536a4c7ffaa82f0d2f6b2a062f3-thumb.png</uri>
</thumb>
<small>...</small>
<medium>...</medium>
<large>...</large>
<native>...</native>
</sizes>
</primary_image>
<alternate_images>
<alternate_image>
<name>101885669.jpg</name>
<display_name>alternate_image</display_name>
<mime_type>image/png</mime_type>
<weight>0</weight>
<uri>https://media.distributordatasolutions.com/209/panduit/large/...-large.png</uri>
<sizes>...</sizes>
</alternate_image>
</alternate_images>
<alternate_images>
<alternate_image>...</alternate_image>
</alternate_images>
Every image comes in several sizes, all hosted on the DDS CDN. Each alternate image is wrapped in its own <alternate_images> element. Unlike JSON, the primary image has no weight.
Image
| Element | Data Type | Description |
|---|---|---|
name |
String | Original file name of the image |
display_name |
String | Label for the image |
mime_type |
String | MIME type of the hosted image |
weight |
Integer | Alternate images only: sort order |
uri |
String | URL of the large image |
manufacturer_file_id |
String | Alternate images only: manufacturer's identifier for the file, when supplied |
sizes |
Sizes | The image in each size: thumb, small, medium, large and native |
Size
| Element | Data Type | Description |
|---|---|---|
uri |
String | URL of the image at this size |
length |
Integer | File size in bytes (not a dimension). Not always present |
| Size | Dimensions |
|---|---|
| thumb | Small thumbnail (about 64 px), cropped to a square |
| small | Up to 256 × 256 px |
| medium | Up to 512 × 512 px |
| large | Up to 1024 × 1024 px |
| native | Original size from the manufacturer |
Spec Sheet and SDS
Simple File
<primary_spec_sheet>
<name>111891321.pdf</name>
<display_name>Spec Sheet</display_name>
<mime_type>application/pdf</mime_type>
<uri>https://media.distributordatasolutions.com/209/panduit/...pdf</uri>
<weight>0</weight>
</primary_spec_sheet>
<primary_spec_sheet> and <safety_data_sheet> use the same format. Both files are also listed in <downloads>.
| Element | Data Type | Description |
|---|---|---|
name |
String | File name |
display_name |
String | Label for the file |
mime_type |
String | Usually application/pdf |
uri |
String | URL of the file on the DDS CDN |
weight |
Integer | Sort order |
Packages
Packages
<packages>
<package>
<gtin>00074983960095</gtin>
<qty>1</qty>
<qty_uom>Piece</qty_uom>
<gross_weight>0.14</gross_weight>
<gross_weight_uom>lbs</gross_weight_uom>
<pkg_length>9.00</pkg_length>
<pkg_length_uom>in</pkg_length_uom>
<pkg_height>1.50</pkg_height>
<pkg_height_uom>in</pkg_height_uom>
<pkg_width>5.00</pkg_width>
<pkg_width_uom>in</pkg_width_uom>
<code>58bc64ae47194afc8cfc6ffb828ec092</code>
</package>
</packages>
One <package> per packaging level. The elements are the same as the JSON Package Object: code, parent_code, gtin, sub_gtin, sub_qty, qty, qty_uom, gross_weight, pkg_length, pkg_height, pkg_width, pkg_volume (each with a matching _uom), description and returnable.
Certifications
Certifications
<certifications>
<certification>
<agency>UL</agency>
<name>UL Listed</name>
<cert_number>E129886</cert_number>
</certification>
</certifications>
Certifications as supplied by the manufacturer.
| Element | Data Type | Description |
|---|---|---|
agency |
String | Certifying agency |
name |
String | Certification name |
cert_number |
String | Certificate or file number |
Facets
Facets
<facets>
<facet>
<data_key>overall_thickness</data_key>
<name>Overall Thickness</name>
<values>
<value>
<facet_value>0.017</facet_value>
<value_with_uom>0.017 inches</value_with_uom>
<uom_unit>inch</uom_unit>
<uom_unit_plural>inches</uom_unit_plural>
<uom_abbreviation>in</uom_abbreviation>
<uom_abbreviation_plural>in</uom_abbreviation_plural>
</value>
</values>
<values>
<value>
<facet_value>0.4</facet_value>
<value_with_uom>0.4 millimeters</value_with_uom>
...
</value>
</values>
</facet>
<facet>
<data_key>color</data_key>
<name>Color</name>
<values>
<value>
<facet_value>Gray</facet_value>
<value_with_uom>Gray</value_with_uom>
</value>
</values>
</facet>
</facets>
Facets are normalized, filterable attributes curated by the DDS data team. See Facets in the JSON guide for how to use them. Each value of a facet is wrapped in its own <values> element.
Facet
| Element | Data Type | Description |
|---|---|---|
data_key |
String | Stable identifier for the facet |
name |
String | Display name |
values |
Facet Value (repeated) | One or more values |
Facet Value
| Element | Data Type | Description |
|---|---|---|
facet_value |
String | Value without its unit of measure |
value_with_uom |
String | Value with its unit, pluralized correctly, for display |
uom_unit, uom_unit_plural |
String | Unit of measure, singular and plural. Absent for unitless facets |
uom_abbreviation, uom_abbreviation_plural |
String | Unit abbreviation, singular and plural |
In XML the value element is named facet_value; JSON and Multi CSV call it value.
Categories
Categories
<categories>
<category>
<category_id>2334443</category_id>
<code>a7335bc27671df5fea6b2f004e0e3637</code>
<name>Fiber Optic Systems</name>
</category>
<category>
<category_id>2334497</category_id>
<code>3960d5798a46e3a83f964ceac1728c1f</code>
<name>Fiber Optic Cable Assemblies</name>
<parent_id>2334443</parent_id>
</category>
</categories>
Each <category> is one level of the product's category branch. Link levels together with parent_id. The top level has no parent_id. Depending on how your export is set up, these are DDS categories or the manufacturer's own taxonomy.
| Element | Data Type | Description |
|---|---|---|
category_id |
Integer | Unique identifier for the category |
parent_id |
Integer | category_id of the parent category. Absent for top-level categories |
code |
String | Code that uniquely identifies the category |
name |
String | Category name |
360 Images
360 Images
<images_360>
<cols>24</cols>
<rows>1</rows>
<initial_image>209/panduit/medium/ad707ea18ce91bd217586467c4864d326b5c661c-r01-c01-medium.png</initial_image>
<filename>ad707ea18ce91bd217586467c4864d326b5c661c-r{row}-c{col}-medium.png</filename>
<initial_thumb>209/panduit/thumbnails/ad707ea18ce91bd217586467c4864d326b5c661c-r01-c01-thumb.png</initial_thumb>
<filename_large>ad707ea18ce91bd217586467c4864d326b5c661c-r{row}-c{col}-native.png</filename_large>
<format>row-column</format>
<iframe_url>https://media.distributordatasolutions.com/assets/magic360/viewer.html?initial=/209/panduit/medium/ad707ea18ce91bd217586467c4864d326b5c661c-r01-c01-medium.png&filename=ad707ea18ce91bd217586467c4864d326b5c661c-r{row}-c{col}-medium.png&rows=1&cols=24</iframe_url>
<display_name>F3X3LG6_R01_C01.jpg</display_name>
</images_360>
Each 360 image is a separate <images_360> element. The simplest way to show one is to use iframe_url as the src of an <iframe>. That loads a ready-made DDS viewer. Note that & in the URL is escaped as & in the XML; your parser will unescape it.
| Element | Data Type | Description |
|---|---|---|
cols |
Integer | Number of frames around the product |
rows |
Integer | Number of vertical rows of frames |
initial_image |
String | Path of the first frame, medium size, relative to https://media.distributordatasolutions.com/ |
filename |
String | File-name pattern for medium frames. {row} and {col} are two-digit numbers |
initial_thumb |
String | Path of the first frame, thumbnail size, relative to https://media.distributordatasolutions.com/ |
filename_large |
String | File-name pattern for full-size (native) frames |
format |
String | Always row-column |
iframe_url |
String | URL of the hosted 360 viewer for this product |
display_name |
String | Label for the 360 image |
Features and Specifications
Features and Specifications
<features>
<feature>Standards Met: RoHS Compliant, UL Recognized, CE Compliant</feature>
<feature>Lead-free PVC</feature>
</features>
<specifications>
<group>
<group_name>Specifications</group_name>
<group_items>
<item>
<name>Overall Width (In.)</name>
<value>3.25</value>
<weight>20</weight>
</item>
<item>
<name>Note</name>
<value>Cover sold separately</value>
<weight>30</weight>
</item>
</group_items>
</group>
</specifications>
- Features are marketing points, usually shown as a bulleted list. In XML they are a flat list of
<feature>text elements, without groups. - Specifications are name/value pairs in named groups, usually shown as a two-column table. Sort items within a group by
weight.
Specification Group
| Element | Data Type | Description |
|---|---|---|
group_name |
String | Display name of the group |
group_items |
Items | The <item> elements in the group |
Specification Item
| Element | Data Type | Description |
|---|---|---|
name |
String | Attribute name |
value |
String | Attribute value |
weight |
Integer | Sort order |
Downloads and Videos
Downloads and Videos
<downloads>
<group>
<group_items>
<item>
<name>101714999.pdf</name>
<display_name>Certifications 1</display_name>
<mime_type>application/pdf</mime_type>
<uri>https://media.distributordatasolutions.com/209/panduit/66a6fa66a537b986dbf2ad30d8078d39b971e926.pdf</uri>
<ext_hosted>0</ext_hosted>
<weight>50</weight>
<locale>en-US</locale>
</item>
</group_items>
</group>
</downloads>
<downloads> and <videos> hold every file in a single <group>. Sort files by weight. When ext_hosted is 0, the file is hosted on the DDS CDN. When it is 1, the file is hosted elsewhere, typically a YouTube or Vimeo embed URL.
| Element | Data Type | Description |
|---|---|---|
name |
String | File name |
display_name |
String | Human-readable label for the file |
mime_type |
String | MIME type of the file |
uri |
String | URL of the file |
ext_hosted |
Integer | 1 if the file is hosted outside DDS, otherwise 0 |
weight |
Integer | Sort order |
locale |
String | Language of the file, for example en-US |
description |
String | Longer description of the file |
duration |
String | Videos: running time |
manufacturer_file_id |
String | Manufacturer's identifier for the file, when supplied |
ETIM
ETIM
<etim>
<group_code>EG000011</group_code>
<group_description>Cabinet enclosures</group_description>
<class_code>EC002625</class_code>
<class_description>Mounting accessories (switchgear cabinet)</class_description>
<version>7</version>
<features>
<feature_code>EF000008</feature_code>
<feature_name>Width</feature_name>
<value_string>930.00</value_string>
<unit_code>EU570448</unit_code>
<unit_name>Millimetre</unit_name>
</features>
<features>
<feature_code>EF000215</feature_code>
<feature_name>Type of accessory/spare part</feature_name>
<value_code>EV000154</value_code>
</features>
</etim>
The product's ETIM classification, when it has one. Each ETIM feature is a separate <features> element. The elements match the JSON ETIM Object and ETIM Feature Object.
File Delivery
What a Delivery Contains
Uncompressed delivery on the DDS SFTP server
from-dds/ddx/en-US/{export name}/{date and time}/
JSON: files/part-00000-...-c000.json
files/part-00000-...-c001.json
Multi CSV: items.csv, features.csv, ...
XML: part-00000.xml
Compressed delivery
from-dds/ddx/en-US/{export name}-{date and time}.zip
Each delivery is a complete snapshot of your export at the time it ran, in its own dated folder. Exports can be delivered uncompressed, or as a single .zip or .tbz2 (bzip2) archive. Your DDS contact can tell you which your export uses.
Completion flag
Some exports include an empty _SUCCESS file, written after every other file in the delivery. If yours does, wait for _SUCCESS to appear before you start processing.
Incremental exports
If your export is set up as incremental, each delivery also contains files that describe what changed since the previous delivery.
JSON
| File | Contents |
|---|---|
new-products.csv |
Products that were not in the previous delivery |
deleted-products.csv |
Products that were in the previous delivery and are no longer in your export |
incremental-files/ |
Complete records for every new or changed product, in the same JSON format as the main export |
Multi CSV
Each data file is compared on its own, row by row, so every file gets its own set of change files:
| File | Contents |
|---|---|
{file}-new-products.csv, for example items-new-products.csv |
Identifiers that have rows in this file now but did not in the previous delivery |
{file}-deleted-products.csv, for example features-deleted-products.csv |
Identifiers that had rows in this file in the previous delivery and no longer do |
incremental/{file}.csv, for example incremental/features.csv |
Only the rows of that file that are new or changed |
Because each file is compared separately, a product whose only change is a new feature appears in incremental/features.csv but not in incremental/items.csv. To rebuild a product completely, use the full files in the same delivery.
The first incremental delivery has no previous delivery to compare against, so every product appears as new. In JSON deleted-products.csv and Multi CSV items-deleted-products.csv, "deleted" means the product is no longer in your export, not necessarily that the manufacturer discontinued it. In other Multi CSV change files, it means the identifier no longer has rows in that particular data file; the product may still be present in items.csv.
SFTP Access
DDS hosts an SFTP server at sftp.distds.com, port 22. DDS will give you a username and password.
| Folder | Use |
|---|---|
from-dds |
Files DDS delivers to you, including your exports |
to-dds |
Files you send to DDS. Your DDS contact will tell you which subfolder to use, for example to-dds/customer-products for a product file to match |
Connecting with FileZilla
Any SFTP client will work. FileZilla is a good free option.
- Start FileZilla and click the Site Manager button.

- In the Site Manager, click New Site.

Name the site something memorable, such as "DDS", and press Enter. Then fill in the connection details:
- Protocol: SFTP - SSH File Transfer Protocol
- Host:
sftp.distds.com - Port:
22 - Logon Type: Normal
- User and Password: the credentials DDS gave you
Click Connect.

FileZilla asks whether to save your password. Follow your company's policy:
- Save passwords is the most convenient and least secure option.
- Do not save passwords means you re-enter the password each time you connect.
- Save passwords protected by a master password saves all your FileZilla passwords behind one master password of your own.

The first time you connect, FileZilla shows the server's host key. Check that the fingerprint matches the one above, tick Always trust this host, and click OK.

You are now connected. Your exports are in
from-dds.
To reconnect later, open the Site Manager, select the DDS site, and click Connect.
Sending Product Files to DDS
Acadia Product File Upload
You can upload your product file to DDS through Acadia. This suits a first match run, or teams that cannot yet send their product file automatically.
- From the PRODUCT MANAGEMENT menu, click PRODUCT FILE UPLOAD.

- On the Product Match File Upload page, choose your file and upload it.

The upload accepts .csv, .txt and .tsv files.
To send product files automatically instead, upload them over SFTP to the to-dds subfolder your DDS contact gives you.