Products API
Manage products in your catalog.
Endpoints Overview
| Method | Endpoint | Description |
|---|---|---|
| POST | /products/create |
Create a single product |
| POST | /products/bulk-create |
Create multiple products |
| POST | /products/get |
List products with pagination |
| POST | /products/{product_id}/get |
Get a single product |
| POST | /products/{product_id}/update |
Update a product |
| POST | /products/{product_id}/delete |
Delete a product |
| POST | /products/{product_id}/update-attributes |
Update product attributes |
| POST | /products/{product_id}/enrichment-history |
Get enrichment history |
| POST | /products/{product_id}/validation-history |
Get validation history |
Create Product
Add a new product to your catalog.
Endpoint: POST /api/{organization}/products/create
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
sku |
string | Yes | Product SKU (max 64 characters) |
name |
string | Yes | Product name (max 256 characters) |
manufacturer |
string | No | Manufacturer name (max 256 characters) |
mpn |
string | No | Manufacturer Part Number (max 128 characters) |
uom |
string | No | Unit of measure (max 128 characters) |
brand |
string | No | Brand name (max 128 characters) |
category |
string | No | Product category |
externalId |
string | No | External identifier for your reference |
parentId |
string | No | Parent product ID (for product variants) |
isParent |
boolean | No | Mark as parent product (default: false) |
userProvidedRawDataSources |
string[] | No | URLs or references for product information |
attributes |
object | No | Pre-structured product attributes |
Note: A product cannot have both isParent: true and a parentId. Parent products cannot be variants of other products.
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "SKU-12345",
"name": "Wireless Headphones",
"manufacturer": "AudioCorp",
"brand": "AudioCorp Pro",
"mpn": "WH-1000",
"category": "Electronics > Audio > Headphones"
}'
Example: Creating a Parent Product
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "TSHIRT-CLASSIC",
"name": "Classic T-Shirt",
"brand": "MyBrand",
"category": "Apparel",
"isParent": true
}'
Example: Creating a Variant Product
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "TSHIRT-CLASSIC-RED-M",
"name": "Classic T-Shirt - Red, Medium",
"brand": "MyBrand",
"category": "Apparel",
"parentId": "prod_parent123"
}'
Response
{
"success": true,
"data": {
"id": "prod_abc123",
"sku": "SKU-12345",
"name": "Wireless Headphones",
"manufacturer": "AudioCorp",
"brand": "AudioCorp Pro",
"mpn": "WH-1000",
"category": "Electronics > Audio > Headphones",
"createdAt": "2024-01-15T10:00:00Z"
}
}
Bulk Create Products
Add multiple products at once. Maximum 1000 products per request.
Endpoint: POST /api/{organization}/products/bulk-create
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
products |
array | Yes | Array of product objects (max 1000) |
Each product object follows the same structure as Create Product.
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/bulk-create \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"products": [
{
"sku": "SKU-001",
"name": "Product One",
"brand": "BrandA"
},
{
"sku": "SKU-002",
"name": "Product Two",
"brand": "BrandB"
}
]
}'
Response
{
"success": true,
"data": {
"created": true
}
}
Error: Duplicate SKU
{
"success": false,
"message": "Products with these SKUs/externalIds already exist: SKU-001"
}
List Products
Retrieve a paginated list of products.
Endpoint: POST /api/{organization}/products/get
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
page |
number | No | 1 | Page number |
limit |
number | No | 10 | Items per page (max 100) |
search |
string | No | "" | Search term |
sortBy |
string | No | "createdAt" | Sort field: sku, name, manufacturer, brand, createdAt, updatedAt, enrichedAt |
sortOrder |
string | No | "desc" | Sort direction: asc or desc |
parentFilter |
string | No | "all" | Filter: all, parent, or non-parent |
enrichedFilter |
string | No | "all" | Filter: all, enriched, or not-enriched |
confidenceFilter |
string | No | "all" | Filter by AI confidence: all, needs-review, high, medium, or low |
rules |
array | No | [] | Up to 25 filter rules. See Filter Rules below |
match |
string | No | "all" | Combine rules with all (AND) or any (OR) |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"limit": 20,
"search": "headphones",
"sortBy": "name",
"sortOrder": "asc"
}'
Example: List Only Parent Products
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"limit": 20,
"parentFilter": "parent"
}'
Example: List Products That Have Not Been Enriched
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"limit": 20,
"enrichedFilter": "not-enriched"
}'
Example: List Products That Need Review
A product needs review when any AI-enriched value has Medium or Low confidence.
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"limit": 20,
"confidenceFilter": "needs-review"
}'
Filter Rules
Each rule has a field, an operator and, for most operators, a value. Rules apply on top of search, parentFilter, enrichedFilter and confidenceFilter. Text comparisons ignore case. Dates are YYYY-MM-DD in UTC.
| Field | Operators | Value |
|---|---|---|
sku, name, manufacturer, mpn, uom, brand, category, externalId |
contains, not_contains, equals, not_equals, starts_with, ends_with, is_empty, is_not_empty |
value |
createdAt, updatedAt, enrichedAt |
before, after, between, last_days, is_empty, is_not_empty |
value, plus valueTo for between |
enrichCategory, enrichBrand, catalog |
is_any_of, is_none_of, is_empty, is_not_empty |
values: category, brand or catalog IDs |
attribute |
Text operators, gt, gte, lt, lte, has_any_of, has_all_of, has_none_of, is_true, is_false |
attribute: the attribute slug, then value or values |
Example: Filter by Rules
This request lists products from either of two brands that have a voltage of at least 18 and were not enriched in the last 30 days:
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"match": "all",
"rules": [
{ "field": "enrichBrand", "operator": "is_any_of", "values": ["brand_abc", "brand_def"] },
{ "field": "attribute", "attribute": "voltage", "operator": "gte", "value": "18" },
{ "field": "enrichedAt", "operator": "before", "value": "2026-10-06" }
]
}'
Response
{
"success": true,
"data": {
"products": [
{
"id": "prod_abc123",
"sku": "SKU-12345",
"name": "Wireless Headphones",
"manufacturer": "AudioCorp",
"brand": "AudioCorp Pro",
"category": "Electronics > Audio > Headphones",
"parentId": null,
"parentName": null,
"isParent": false,
"createdAt": "2024-01-15T10:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 45,
"totalPages": 3
}
}
}
Get Product
Retrieve details of a specific product.
Endpoint: POST /api/{organization}/products/{product_id}/get
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/get \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
Response
{
"success": true,
"data": {
"id": "prod_abc123",
"sku": "SKU-12345",
"name": "Wireless Headphones",
"manufacturer": "AudioCorp",
"brand": "AudioCorp Pro",
"mpn": "WH-1000",
"category": "Electronics > Audio > Headphones",
"parentId": null,
"isParent": false,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:00:00Z"
}
}
Update Product
Update an existing product.
Endpoint: POST /api/{organization}/products/{product_id}/update
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
sku |
string | Yes | Product SKU (max 64 characters) |
name |
string | Yes | Product name (max 256 characters) |
manufacturer |
string | No | Manufacturer name |
mpn |
string | No | Manufacturer Part Number |
brand |
string | No | Brand name |
category |
string | No | Product category |
externalId |
string | No | External identifier |
parentId |
string | No | Parent product ID |
isParent |
boolean | No | Mark as parent product |
userProvidedRawDataSources |
string[] | No | Data source URLs |
Note: A product cannot have both isParent: true and a parentId.
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/update \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "SKU-12345",
"name": "Wireless Noise-Canceling Headphones",
"brand": "AudioCorp Pro Max"
}'
Response
{
"success": true,
"data": {
"id": "prod_abc123",
"sku": "SKU-12345",
"name": "Wireless Noise-Canceling Headphones",
"brand": "AudioCorp Pro Max",
"updatedAt": "2024-01-15T11:30:00Z"
}
}
Delete Product
Remove a product from your catalog.
Endpoint: POST /api/{organization}/products/{product_id}/delete
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/delete \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
Response
{
"success": true,
"data": {
"id": "prod_abc123",
"deleted": true
}
}
Update Product Attributes
Update custom attributes for a product.
Endpoint: POST /api/{organization}/products/{product_id}/update-attributes
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID or external ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
attributes |
object | Yes | Key-value pairs of attributes |
Attribute Object Structure
{
"attribute_key": {
"attributeId": "string",
"attributeName": "string",
"attributeType": "text|html|number|date|boolean|select|multiselect",
"value": "any"
}
}
Confidence
Values filled by AI enrichment also carry a read-only confidence object:
{
"level": "high",
"basis": "manufacturer",
"sources": [
{
"name": "acme.com",
"url": "https://acme.com/p/123",
"isManufacturer": true
}
]
}
levelishigh,medium, orlow.basisismanufacturer,sources_agree,few_sources,sources_conflict,no_source, orvariants.sourceslists the sources that support the value. An uploaded file has aurlofnull.
This endpoint ignores any confidence you send. A value you leave unchanged keeps its confidence. A value you change loses it, because it is no longer AI output.
Attribute Types
| Type | Value Format | Example |
|---|---|---|
text |
String | "Blue" |
html |
HTML string | "<p>Description</p>" |
number |
Number | 250 |
boolean |
Boolean | true |
date |
ISO date string | "2024-01-15T00:00:00Z" |
select |
String | "Option A" |
multiselect |
Array of strings | ["A", "B"] |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/update-attributes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"attributes": {
"color": {
"attributeId": "attr_color",
"attributeName": "Color",
"attributeType": "text",
"value": "Black"
},
"weight": {
"attributeId": "attr_weight",
"attributeName": "Weight (grams)",
"attributeType": "number",
"value": 250
}
}
}'
Response
{
"success": true,
"data": {
"id": "prod_abc123",
"sku": "SKU-12345",
"name": "Wireless Headphones",
"attributes": {
"color": {
"attributeId": "attr_color",
"attributeName": "Color",
"attributeType": "text",
"value": "Black"
},
"weight": {
"attributeId": "attr_weight",
"attributeName": "Weight (grams)",
"attributeType": "number",
"value": 250
}
},
"updatedAt": "2024-01-15T11:45:00Z"
}
}
Get Enrichment History
Retrieve the enrichment history for a product.
Endpoint: POST /api/{organization}/products/{product_id}/enrichment-history
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID |
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
page |
number | No | 1 | Page number |
limit |
number | No | 10 | Items per page (max 100) |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/enrichment-history \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"page": 1, "limit": 10}'
Response
{
"success": true,
"data": {
"history": [
{
"id": "hist_xyz789",
"productId": "prod_abc123",
"enrichedAt": "2024-01-15T12:00:00Z",
"attributes": {
"description": {
"attributeId": "attr_desc",
"attributeName": "Description",
"attributeType": "html",
"value": "Premium wireless headphones with noise cancellation"
}
}
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 5,
"totalPages": 1
}
}
}
Get Validation History
Retrieve the validation history for a product.
Endpoint: POST /api/{organization}/products/{product_id}/validation-history
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id |
string | Yes | Product ID |
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
page |
number | No | 1 | Page number |
limit |
number | No | 10 | Items per page (max 100) |
Example Request
curl -X POST https://catalog-ai.tdccommerce.com/api/your-org/products/prod_abc123/validation-history \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"page": 1, "limit": 10}'
Response
{
"success": true,
"data": {
"history": [
{
"id": "val_hist_xyz789",
"productId": "prod_abc123",
"validatedAt": "2024-01-15T12:00:00Z",
"overallScore": 85.5
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 3,
"totalPages": 1
}
}
}
Error Responses
400 Bad Request
Invalid request parameters.
{
"success": false,
"message": "Invalid request body: ..."
}
404 Not Found
Product does not exist.
{
"success": false,
"message": "Product not found"
}