Channel Management API: content attributes
About this article
This article explains how to export and retrieve product content attribute definitions via the Channel Management API, using POST /v1/attributes/data and GET /v1/attributes/data.
Table of contents
How attributes work on ChannelEngine
- Content mappings vs. Pricing
- Validation and the product flow
- Global attributes vs. category-specific attributes
Introduction
The /v1/attributes/data endpoints are specifically for product content attributes - the fields that describe what a product is, such as title, description, brand, colour, material, or category-specific fields like number of seating places or lens strength. These are distinct from offer attributes (price, stock, shipping), which are managed separately via /v1/attributes/offer.
If your channel requires merchants to map their product content to a specific set of fields, you export those attribute definitions here so that every seller connected to your channel sees them on ChannelEngine and can map their product data accordingly. Once mapped, these values populate the MappedFields of products returned by the Channel API.
Overview
Refer to the diagram below to visualise how attribute definitions flow between your channel, ChannelEngine, and connected merchants.
Requirements
- Access to the Channel Management API - not enabled by default. Request it from your ChannelEngine implementation contact.
- A Channel Management API key - separate from your Channel API key.
- Your category hierarchy is already exported - if any attributes are category-specific, submit your categories first via
POST /v1/categories/listso you have the correctChannelNovalues to reference inCategoryChannelNoList.
https://www.channelengine.net/channelmanagement-api/docs/.
How attributes work on ChannelEngine
The Channel Management API works at the channel level - not per merchant. When you export your attribute list, a single call makes those attributes visible to every seller connected to your channel at once. Each seller can then map their own product fields to your attributes inside ChannelEngine.
Attributes can apply globally across your entire catalogue, or be scoped to specific categories you have previously exported via POST /v1/categories/list. Once a seller has completed their mapping, the values flow through to MappedFields in products retrieved via the Channel API.
Content mappings vs. Pricing
Every attribute you define ends up in one of two steps inside the seller's ChannelEngine interface, determined by the AttributeType field:
- STANDARD - the attribute appears in the Content mappings step, where sellers map their product fields to your channel's attributes. This is the correct type for the vast majority of attributes: product title, description, brand, color, material, EAN, and so on.
- PRICE - the attribute is moved to the Pricing step, where sellers can use ChannelEngine's pricing tool (pricing v2). Use this only for attributes that are directly related to pricing logic, such as a recommended retail price field or a minimum advertised price. If you are not using pricing v2, set all attributes to STANDARD.
Once you have submitted your attributes, you can verify them directly on ChannelEngine without calling the GET endpoint. Open the channel on ChannelEngine, go to the Mappings, Content mappings. Your exported product content attributes are listed there, showing their names, types, and whether they are required.
Validation and the product flow
Before a product is sent to your channel, ChannelEngine performs a preliminary validation check against the attributes you have marked as required. The outcome of this check determines whether the product reaches you:
- All required attributes have a value - the product passes validation and is included in the response of
GET /v2/products/data, ready for your channel to consume. - One or more required attributes are missing a value - the product does not reach your channel. The seller sees a validation message on ChannelEngine indicating which fields still need to be completed.
Only mark an attribute as IsRequired: true if your channel genuinely cannot process a listing without it. Being too aggressive with required fields prevents sellers from getting any products live until everything is perfectly filled in, which creates friction during onboarding.
Global attributes vs. category-specific attributes
Not every attribute is relevant for every product. Some fields make sense across your entire catalogue; others only apply to specific categories. The CategoryChannelNoList field controls this scope:
- Leave
CategoryChannelNoListempty - the attribute is global and applies to all products, regardless of category. Use this for attributes that every product needs, such as product title, description, brand, EAN, or main image URL. - Supply one or more
ChannelNovalues - the attribute is scoped to those specific categories only. Sellers only see this attribute when they have mapped products to one of the listed categories.
Examples:
- Number of seating places - only relevant for sofas and chairs. Supply the
ChannelNovalues for your Sofas and Chairs categories. Sellers in other categories never see this field. - Lens strength (dioptre) - only relevant for glasses and optics. Scope this to your Glasses & Optics category. Setting it as a global attribute would create unnecessary noise for every other seller on your channel.
- Product title - relevant for every product on the channel. Leave
CategoryChannelNoListempty so it applies globally.
ChannelNo values in CategoryChannelNoList must match exactly the values you submitted in your category export via POST /v1/categories/list. Export your categories first, then reference those same identifiers here. A mismatch will cause the attribute to not be linked to the intended category.
Available API endpoints
The following endpoints are used to manage product content attribute definitions for your channel.
-
Export or update attribute definitions:
POST /v1/attributes/data
Send your full list of product content attributes to ChannelEngine. Every call replaces the previous export entirely - always submit your complete, current attribute list. -
Retrieve stored attribute definitions:
GET /v1/attributes/data
Retrieve the attributes currently stored for your channel. Primarily useful during development to verify that a POST call landed correctly.
POST /v1/attributes/data is a purge-and-replace - your entire attribute list is overwritten. Always include all of your attributes in every call. Any attribute omitted from the request will be permanently removed from your channel.
POST /v1/attributes/data
Use this endpoint to send your full list of attributes to ChannelEngine. Every call replaces the previous export entirely, so always submit your complete, current attribute list - not just what has changed.
Request body
| Field | Type | Required | Description |
ChannelCategoryAttributeNo |
string | Nullable | The key name you want the mapped category's ChannelNo to appear under in MappedFields when fetching products via the Channel API. Defaults to Category if left empty. |
Items |
array | Nullable | The attributes to export. Each item can be scoped to specific categories or made global. See the attribute item fields below. |
Attribute item fields (inside Items)
| Field | Type | Required | Description |
ChannelNo |
string · max 200 | Nullable | Your unique identifier for this attribute. Must remain the same across exports - this is how ChannelEngine determines whether to update an existing attribute or create a new one. Use a stable, machine-readable value. |
Name |
string · max 200 | Nullable | The display name shown to sellers in the ChannelEngine content mapping interface when they map their product fields to this attribute. |
SystemName |
string · max 200 | Nullable | The key used to identify this attribute when retrieving products via the Channel API. Defaults to the same value as ChannelNo if left empty. |
CategoryChannelNoList |
array of strings | Nullable | Controls which categories this attribute applies to. Each value must be a ChannelNo from your category export (POST /v1/categories/list). One value scopes the attribute to a single category; multiple values apply it to all listed categories simultaneously - you do not need to define it separately per category. Leave empty to make the attribute global, applying to all products regardless of category. |
IsRequired |
boolean | Required | Whether a value is required for this attribute before a product is sent to your channel. When true, ChannelEngine runs a preliminary validation check. If all required attributes have a value, the product is included in GET /v2/products/data. If any required attribute is missing a value, the product is withheld and the seller receives a validation message. Only mark an attribute as required if your channel genuinely cannot create a listing without it. |
Type |
enum | Required | The input type for this attribute in the seller's mapping interface. Accepted values: SELECT, MULTISELECT, TEXT, NUMBER. |
ProductType |
enum | Required | The product type this attribute applies to. Accepted values: SINGLE, PARENT, CHILD, GRANDPARENT, BUNDLE. |
AttributeType |
enum | Nullable | Determines where the attribute appears in the seller's ChannelEngine interface. STANDARD places the attribute in the Content mappings step. PRICE moves it to the Pricing step for use with Pricing V2. If you are not using Pricing V2, set all attributes to STANDARD. |
Options |
array | Nullable | For SELECT and MULTISELECT types: the list of selectable options. Each option has a ChannelNo (your unique code for the value, max 200 chars) and a Name (the display label shown to sellers, max 300 chars). |
DefaultOption |
object | Nullable | For SELECT and MULTISELECT types: the option pre-selected when a seller first opens this channel on ChannelEngine. Use this to reduce configuration effort for values that apply to the majority of sellers. |
DefaultValue |
string | Nullable | The default value pre-filled for TEXT and NUMBER type attributes when a seller opens the channel mapping for the first time. Use this for values that are correct for most sellers without modification. |
Unit |
string | Nullable | The unit of measurement for this attribute, shown alongside the field label to guide sellers. Examples: g, kg, cm, m. Leave empty if not applicable. |
Description |
string | Nullable | Guidance text is shown to sellers as a tooltip on ChannelEngine's mapping interface. Keep it to one or two lines. Explain clearly what the attribute is for and any restrictions it carries - such as a character limit, a required format, or which values are accepted. |
Example request
This example shows three attributes: a global required text field for the product title, a category-scoped select field for the number of seating places, and a global select field with a pre-filled default option for country of production.
{
"ChannelCategoryAttributeNo": null,
"Items": [
{
"ChannelNo": "product-title",
"Name": "Product title",
"SystemName": null,
"CategoryChannelNoList": [],
"IsRequired": true,
"Type": "TEXT",
"ProductType": "SINGLE",
"AttributeType": "STANDARD",
"Options": null,
"DefaultOption": null,
"DefaultValue": null,
"Unit": null,
"Description": "The title shown on the product detail page. Maximum 250 characters."
},
{
"ChannelNo": "seating-places",
"Name": "Number of seating places",
"SystemName": null,
"CategoryChannelNoList": ["sofas", "chairs"],
"IsRequired": false,
"Type": "SELECT",
"ProductType": "SINGLE",
"AttributeType": "STANDARD",
"Options": [
{ "ChannelNo": "1", "Name": "1" },
{ "ChannelNo": "2", "Name": "2" },
{ "ChannelNo": "3", "Name": "3" }
],
"DefaultOption": null,
"DefaultValue": null,
"Unit": null,
"Description": "The total number of people this product can seat."
},
{
"ChannelNo": "country-of-production",
"Name": "Country of production",
"SystemName": null,
"CategoryChannelNoList": [],
"IsRequired": false,
"Type": "SELECT",
"ProductType": "SINGLE",
"AttributeType": "STANDARD",
"Options": [
{ "ChannelNo": "CN", "Name": "China" },
{ "ChannelNo": "DE", "Name": "Germany" },
{ "ChannelNo": "NL", "Name": "Netherlands" }
],
"DefaultOption": { "ChannelNo": "CN", "Name": "China" },
"DefaultValue": null,
"Unit": null,
"Description": "The country where this product was manufactured."
}
]
}GET /v1/attributes/data
Use this endpoint to retrieve the attributes currently stored for your channel. This is primarily useful during development to verify that a POST call landed correctly. It is not required in your regular production flow.
Before your first export, call GET /v1/attributes/data to check whether your channel already has default attributes stored. If it does, include them in your POST payload so they are not overwritten.
Response structure
The response wraps your attribute data inside a standard API envelope. The Content object mirrors the structure used in the POST request body.
| Field | Type | Description |
Content |
object | The stored attribute data for your channel, containing ChannelCategoryAttributeNo and Items in the same structure as the POST request body. |
Success |
boolean | true if the call completed successfully. |
StatusCode |
integer | HTTP-equivalent status code within the response body. |
Message |
string | A human-readable message, if relevant. |
ValidationErrors |
object | Details of any validation failures. Check this field when Success is false. |
RequestId |
string | Unique identifier for this API call. Include when contacting ChannelEngine Support about a specific request. |
LogId |
string | Internal log reference. Include alongside RequestId when raising a support query. |
ExceptionType |
string | Populated if a server-side exception occurred. |
Example response
{
"Content": {
"ChannelCategoryAttributeNo": null,
"Items": [
{
"ChannelNo": "product-title",
"Name": "Product title",
"SystemName": "product-title",
"CategoryChannelNoList": [],
"IsRequired": true,
"Type": "TEXT",
"ProductType": "SINGLE",
"AttributeType": "STANDARD",
"Options": null,
"DefaultOption": null,
"DefaultValue": null,
"Unit": null,
"Description": "The title shown on the product detail page. Maximum 250 characters."
}
]
},
"StatusCode": 1,
"RequestId": null,
"LogId": null,
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": null
}Testing your export
- Check what is already stored - call
GET /v1/attributes/databefore your first export. If default attributes are present and you rely on them inMappedFields, include them in your POST payload. - Send your attribute list - call
POST /v1/attributes/datawith your complete attribute definitions. A successful response returns"Success": truewithValidationErrorsasnull. - Verify the result - call
GET /v1/attributes/dataagain and inspectContent.Items. The returned list should reflect your full export. Note thatSystemNamewill be auto-populated with the value ofChannelNowherever you left it empty. - Check the attributes in the ChannelEngine UI - open the channel on ChannelEngine, go to the Mappings step, and scroll below the Content Mapping section. Your exported attributes should appear with the correct names, types, and required/optional status.
- Test category scoping - verify a category-specific attribute by checking it only appears for the correct category on ChannelEngine's seller interface. Attributes linked to a category should not be visible to sellers who have mapped their products to a different category.
- Record your results - document the request and response in the test script spreadsheet provided by your ChannelEngine contact. Include
RequestIdandLogIdfrom the response for any cases where you have questions.
Common issues
| Issue | Likely cause | Fix |
| Existing default attributes disappear after export | The POST call replaces all stored attributes, including any defaults ChannelEngine had on file. | Use GET /v1/attributes/data before your first export to retrieve existing attributes, then include them in your POST payload. |
| Attribute does not appear for the right category | CategoryChannelNoList contains a value that does not match any ChannelNo in your category export, or categories have not been exported yet. |
Export your category hierarchy first via POST /v1/categories/list, then use the exact same ChannelNo values in CategoryChannelNoList. |
| Products are withheld from the channel even though the seller has mapped everything | One or more attributes marked IsRequired: true have no mapped value for some products. |
On ChannelEngine, check the validation messages on the affected products. They will indicate which required attribute is missing a value. Either help the seller complete the mapping, or review whether the attribute truly needs to be required. |
| Attribute appears in the wrong step on ChannelEngine |
AttributeType is set to PRICE for a content attribute, causing it to appear in the Pricing step instead of the Content mappings step. |
Change AttributeType to STANDARD for all non-pricing attributes and resubmit your export. |
ValidationErrors in the POST response |
A required field is missing, a value exceeds the character limit, or an unsupported enum value has been used for Type, ProductType, or AttributeType. |
Review the validation error details against the field definitions above. Common causes: ChannelNo or Name over 200 characters; enum values not listed in the supported options. |
| 429 Too Many Requests or rate limit error | The rate limit of 2 calls per 15 minutes per endpoint has been exceeded. The POST and GET endpoints each have their own separate limit. | Wait until the 15-minute window has passed before retrying. In production this should not be an issue - your attribute list changes rarely. If you are hitting the rate limit during development, space out your test calls. |
Success: false with no ValidationErrors |
Authentication failure or incorrect API key. | Verify that the API key in the request is the Channel Management API key, not the Channel API key. |
Next steps
- If you have not done so already, export your category hierarchy first via
POST /v1/categories/list- categoryChannelNovalues must exist before you can reference them inCategoryChannelNoList. - Export offer-related attributes (such as pricing and stock fields) via
POST /v1/attributes/offer. - Once sellers have completed their attribute mapping, verify the results by fetching products via
GET /v2/products/dataand inspecting theMappedFieldsobject. - Include
RequestIdandLogIdfrom any response when contacting ChannelEngine Support about a specific API call.
Comments
0 comments
Article is closed for comments.