E-commerce Catalog Intelligence API Documentation
Normalize, validate, and review caller-supplied product catalogs from CSV, JSON, or structured records before they are published to a sales channel. Payment is the exact USDC price on Base with x402.
https://brainiac.software/api/v1/ecommerce-catalog/product-normalize$0.04 USDCNormalize product records
Read a brainiac-catalog-v1 or Google Merchant subset feed and standardize sku, title, category, price, availability, and GTIN. A dollar sign is not treated as USD, and missing materials or dimensions are not filled in.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
Request exampleJSON
{
"csv": "sku,title,description,brand,category,price,currency,availability,condition,gtin,imageUrl,imageAlt,material\n mug-1 , Blue Mug ,A sturdy blue mug for tea.,Northwind,Home / Kitchen,$12.50,,in stock,new,036000291452,https://cdn.example/mug.jpg,Blue mug,\nmug-1,Blue Mug,A sturdy blue mug for tea.,Northwind,Home > Kitchen,12.50,USD,in_stock,new,036000291453,https://cdn.example/mug.jpg,Blue mug,stoneware\n"
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "normalized",
"format": "brainiac-catalog-v1",
"productCount": 2,
"products": [
{
"row": 2,
"productRef": "mug-1",
"sku": "mug-1",
"title": "Blue Mug",
"description": "A sturdy blue mug for tea.",
"brand": "Northwind",
"category": "Home > Kitchen",
"price": 12.5,
"currency": "",
"availability": "in_stock",
"condition": "new",
"gtin": "036000291452",
"mpn": "",
"parentSku": "",
"color": "",
"size": "",
"material": "",
"certification": "",
"link": "",
"imageUrl": "https://cdn.example/mug.jpg",
"additionalImageUrls": [],
"imageAlt": "Blue mug",
"weightUnit": "",
"dimensionUnit": "",
"attributes": []
},
{
"row": 3,
"productRef": "mug-1",
"sku": "mug-1",
"title": "Blue Mug",
"description": "A sturdy blue mug for tea.",
"brand": "Northwind",
"category": "Home > Kitchen",
"price": 12.5,
"currency": "USD",
"availability": "in_stock",
"condition": "new",
"gtin": "036000291453",
"mpn": "",
"parentSku": "",
"color": "",
"size": "",
"material": "stoneware",
"certification": "",
"link": "",
"imageUrl": "https://cdn.example/mug.jpg",
"additionalImageUrls": [],
"imageAlt": "Blue mug",
"weightUnit": "",
"dimensionUnit": "",
"attributes": [
{
"name": "material",
"value": "stoneware",
"source": "field"
}
]
}
],
"issues": [
{
"kind": "unavailable",
"code": "currency_unspecified",
"productRef": "mug-1",
"row": 2,
"field": "currency",
"detail": "A dollar sign is not a currency. USD was not assumed."
},
{
"kind": "conflict",
"code": "check_digit",
"productRef": "mug-1",
"row": 3,
"field": "gtin",
"detail": "The GTIN check digit does not match. The digits were not corrected."
},
{
"kind": "duplicate",
"code": "duplicate_sku",
"productRef": "mug-1",
"row": 2,
"field": "sku",
"detail": "The sku mug-1 appears on 2 products."
},
{
"kind": "duplicate",
"code": "duplicate_sku",
"productRef": "mug-1",
"row": 3,
"field": "sku",
"detail": "The sku mug-1 appears on 2 products."
},
{
"kind": "conflict",
"code": "price_conflict",
"productRef": "mug-1",
"row": 2,
"field": "price",
"detail": "Products with the same sku have different prices or currencies. The prices were not averaged."
},
{
"kind": "conflict",
"code": "price_conflict",
"productRef": "mug-1",
"row": 3,
"field": "price",
"detail": "Products with the same sku have different prices or currencies. The prices were not averaged."
},
{
"kind": "conflict",
"code": "gtin_conflict",
"productRef": "mug-1",
"row": 2,
"field": "gtin",
"detail": "Products with the same sku have different GTINs. Neither GTIN was chosen."
},
{
"kind": "conflict",
"code": "gtin_conflict",
"productRef": "mug-1",
"row": 3,
"field": "gtin",
"detail": "Products with the same sku have different GTINs. Neither GTIN was chosen."
}
],
"corrections": [
{
"productRef": "mug-1",
"row": 2,
"field": "sku",
"code": "whitespace",
"detail": "Extra whitespace was removed from the sku.",
"replacement": "mug-1"
},
{
"productRef": "mug-1",
"row": 2,
"field": "title",
"code": "whitespace",
"detail": "Extra whitespace was collapsed in the title.",
"replacement": "Blue Mug"
},
{
"productRef": "mug-1",
"row": 2,
"field": "category",
"code": "separators",
"detail": "Category separators were standardized. The category words were not changed.",
"replacement": "Home > Kitchen"
},
{
"productRef": "mug-1",
"row": 2,
"field": "availability",
"code": "mapped",
"detail": "The availability token was mapped to the supported value.",
"replacement": "in_stock"
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-normalize" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"csv": "sku,title,description,brand,category,price,currency,availability,condition,gtin,imageUrl,imageAlt,material\n mug-1 , Blue Mug ,A sturdy blue mug for tea.,Northwind,Home / Kitchen,$12.50,,in stock,new,036000291452,https://cdn.example/mug.jpg,Blue mug,\nmug-1,Blue Mug,A sturdy blue mug for tea.,Northwind,Home > Kitchen,12.50,USD,in_stock,new,036000291453,https://cdn.example/mug.jpg,Blue mug,stoneware\n"
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-attribute-extract$0.03 USDCExtract product attributes
Read structured attribute pairs and lines labeled Attribute: name | value. Unlabeled description prose is not turned into a specification.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
Request exampleJSON
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "A sturdy mug. Cotton is mentioned only as prose.",
"attributesText": "Attribute: material | stoneware\nCotton is not labeled.\n"
},
{
"sku": "mug-2",
"title": "Green Mug",
"color": "Green",
"attributes": [
{
"name": "material",
"value": "stoneware"
},
{
"name": "material",
"value": "porcelain"
}
]
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "extracted",
"productCount": 2,
"attributes": [
{
"productRef": "mug-1",
"row": 1,
"name": "material",
"value": "stoneware",
"source": "labeled_line",
"inferred": false
},
{
"productRef": "mug-2",
"row": 2,
"name": "material",
"value": "stoneware",
"source": "field",
"inferred": false
},
{
"productRef": "mug-2",
"row": 2,
"name": "material",
"value": "porcelain",
"source": "field",
"inferred": false
},
{
"productRef": "mug-2",
"row": 2,
"name": "color",
"value": "Green",
"source": "field",
"inferred": false
}
],
"issues": [
{
"kind": "conflict",
"code": "attribute_conflict",
"productRef": "mug-2",
"row": 2,
"field": "material",
"detail": "The same attribute has more than one value. Neither value was chosen."
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-attribute-extract" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "A sturdy mug. Cotton is mentioned only as prose.",
"attributesText": "Attribute: material | stoneware\nCotton is not labeled.\n"
},
{
"sku": "mug-2",
"title": "Green Mug",
"color": "Green",
"attributes": [
{
"name": "material",
"value": "stoneware"
},
{
"name": "material",
"value": "porcelain"
}
]
}
]
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-variant-validate$0.04 USDCValidate product variants
Group products by the supplied parent sku and flag repeated color and size pairs, price disagreements, and parents that are not in the request. Missing options are not invented.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
Request exampleJSON
{
"products": [
{
"sku": "mug-blue",
"parentSku": "mug",
"title": "Blue Mug",
"color": "Blue",
"size": "M",
"price": 12,
"currency": "USD"
},
{
"sku": "mug-blue-2",
"parentSku": "mug",
"title": "Blue Mug",
"color": "Blue",
"size": "M",
"price": 14,
"currency": "EUR"
},
{
"sku": "orphan",
"parentSku": "missing-parent",
"title": "Red Mug",
"color": "Red",
"size": "S",
"price": 10,
"currency": "USD"
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "checked",
"productCount": 3,
"variantCount": 3,
"issues": [
{
"kind": "missing",
"code": "parent_missing",
"productRef": "mug-blue",
"row": 1,
"field": "parentSku",
"detail": "No product in this request uses this parent sku. A parent product was not created."
},
{
"kind": "missing",
"code": "parent_missing",
"productRef": "mug-blue-2",
"row": 2,
"field": "parentSku",
"detail": "No product in this request uses this parent sku. A parent product was not created."
},
{
"kind": "duplicate",
"code": "duplicate_variant",
"productRef": "mug-blue",
"row": 1,
"field": "size",
"detail": "Another variant of this parent has the same color and size."
},
{
"kind": "duplicate",
"code": "duplicate_variant",
"productRef": "mug-blue-2",
"row": 2,
"field": "size",
"detail": "Another variant of this parent has the same color and size."
},
{
"kind": "conflict",
"code": "price_conflict",
"productRef": "mug-blue",
"row": 1,
"field": "price",
"detail": "Variants of this parent have different prices or currencies. The prices were not averaged."
},
{
"kind": "conflict",
"code": "price_conflict",
"productRef": "mug-blue-2",
"row": 2,
"field": "price",
"detail": "Variants of this parent have different prices or currencies. The prices were not averaged."
},
{
"kind": "missing",
"code": "parent_missing",
"productRef": "orphan",
"row": 3,
"field": "parentSku",
"detail": "No product in this request uses this parent sku. A parent product was not created."
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-variant-validate" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"products": [
{
"sku": "mug-blue",
"parentSku": "mug",
"title": "Blue Mug",
"color": "Blue",
"size": "M",
"price": 12,
"currency": "USD"
},
{
"sku": "mug-blue-2",
"parentSku": "mug",
"title": "Blue Mug",
"color": "Blue",
"size": "M",
"price": 14,
"currency": "EUR"
},
{
"sku": "orphan",
"parentSku": "missing-parent",
"title": "Red Mug",
"color": "Red",
"size": "S",
"price": 10,
"currency": "USD"
}
]
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-description-quality-check$0.03 USDCCheck product description quality
Flag missing, placeholder, HTML, and very short descriptions. When minLength is omitted, descriptions shorter than 40 characters are flagged. No description text is generated.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
minLength | No | integer |
maxTitleLength | No | integer |
Request exampleJSON
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "<p>A sturdy mug.</p>"
},
{
"sku": "mug-2",
"title": "Placeholder",
"description": "TODO"
},
{
"sku": "mug-3",
"title": "Plain Bowl"
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "checked",
"productCount": 3,
"minLength": 40,
"maxTitleLength": 150,
"issues": [
{
"kind": "conflict",
"code": "html",
"productRef": "mug-1",
"row": 1,
"field": "description",
"detail": "The description contains HTML tags. The tags can be removed without adding words."
},
{
"kind": "conflict",
"code": "short",
"productRef": "mug-1",
"row": 1,
"field": "description",
"detail": "The description is shorter than 40 characters. It was not expanded."
},
{
"kind": "conflict",
"code": "placeholder",
"productRef": "mug-2",
"row": 2,
"field": "description",
"detail": "The description is a placeholder. A replacement was not written."
},
{
"kind": "conflict",
"code": "short",
"productRef": "mug-2",
"row": 2,
"field": "description",
"detail": "The description is shorter than 40 characters. It was not expanded."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-3",
"row": 3,
"field": "description",
"detail": "The product has no description. One was not generated."
}
],
"corrections": [
{
"productRef": "mug-1",
"row": 1,
"field": "description",
"code": "html",
"detail": "Remove the HTML tags. No new sentence was added.",
"replacement": "A sturdy mug."
},
{
"productRef": "mug-3",
"row": 3,
"field": "description",
"code": "missing",
"detail": "Add a description supplied by the seller.",
"replacement": ""
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-description-quality-check" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "<p>A sturdy mug.</p>"
},
{
"sku": "mug-2",
"title": "Placeholder",
"description": "TODO"
},
{
"sku": "mug-3",
"title": "Plain Bowl"
}
]
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-category-classify$0.04 USDCClassify product categories
Match a supplied category to the caller taxonomy, or mark one keyword match as inferred. Several matches are a conflict, and no category is chosen or invented.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
taxonomy | No | array; Array |
Request exampleJSON
{
"taxonomy": [
{
"category": "Home > Kitchen",
"terms": [
"mug"
]
},
{
"category": "Apparel",
"terms": [
"shirt"
]
}
],
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"category": "Home / Kitchen"
},
{
"sku": "shirt-1",
"title": "Cotton Shirt"
},
{
"sku": "mix-1",
"title": "Mug shirt set"
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "classified",
"productCount": 3,
"classifications": [
{
"productRef": "mug-1",
"row": 1,
"suppliedCategory": "Home > Kitchen",
"matchedCategory": "Home > Kitchen",
"suggestedCategory": "",
"status": "observed",
"inferred": false,
"detail": "The supplied category matches the taxonomy. It was not inferred."
},
{
"productRef": "shirt-1",
"row": 2,
"suppliedCategory": "",
"matchedCategory": "",
"suggestedCategory": "Apparel",
"status": "inferred",
"inferred": true,
"detail": "One caller-supplied keyword matched the title. The category was not copied onto the product."
},
{
"productRef": "mix-1",
"row": 3,
"suppliedCategory": "",
"matchedCategory": "",
"suggestedCategory": "",
"status": "conflict",
"inferred": false,
"detail": "More than one keyword rule matched: Home > Kitchen, Apparel. No category was chosen."
}
],
"issues": [
{
"kind": "inferred",
"code": "category_inferred",
"productRef": "shirt-1",
"row": 2,
"field": "category",
"detail": "One caller-supplied keyword matched the title. The category was not copied onto the product."
},
{
"kind": "conflict",
"code": "category",
"productRef": "mix-1",
"row": 3,
"field": "category",
"detail": "More than one keyword rule matched: Home > Kitchen, Apparel. No category was chosen."
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-category-classify" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"taxonomy": [
{
"category": "Home > Kitchen",
"terms": [
"mug"
]
},
{
"category": "Apparel",
"terms": [
"shirt"
]
}
],
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"category": "Home / Kitchen"
},
{
"sku": "shirt-1",
"title": "Cotton Shirt"
},
{
"sku": "mix-1",
"title": "Mug shirt set"
}
]
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-feed-validate$0.05 USDCValidate a product feed
Check brainiac-catalog-v1 or the documented Google Merchant subset, plus any required fields and types in the caller schema. Unknown columns are ignored.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
schema | No | object; Object |
Request exampleJSON
{
"schema": {
"format": "google-merchant-subset",
"required": [
"brand"
],
"fields": [
{
"name": "gtin",
"type": "gtin"
},
{
"name": "link",
"type": "url"
}
]
},
"csv": "id,title,description,link,image_link,availability,price,gtin,secret_spec\nmug-1,Blue Mug,,https://shop.example/mug,,in_stock,12.50 USD,036000291453,invented\n"
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "validated",
"format": "google-merchant-subset",
"requiredFields": [
"sku",
"title",
"description",
"link",
"imageUrl",
"availability",
"price",
"brand"
],
"productCount": 1,
"issues": [
{
"kind": "conflict",
"code": "check_digit",
"productRef": "mug-1",
"row": 2,
"field": "gtin",
"detail": "The GTIN check digit does not match. The digits were not corrected."
},
{
"kind": "unavailable",
"code": "unknown_column",
"productRef": "",
"row": 0,
"field": "secret_spec",
"detail": "The column secret_spec is not part of the catalog format and was ignored."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-1",
"row": 2,
"field": "description",
"detail": "The google-merchant-subset feed requires description."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-1",
"row": 2,
"field": "imageUrl",
"detail": "The google-merchant-subset feed requires imageUrl."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-1",
"row": 2,
"field": "brand",
"detail": "The google-merchant-subset feed requires brand."
},
{
"kind": "conflict",
"code": "type",
"productRef": "mug-1",
"row": 2,
"field": "gtin",
"detail": "The field is not a GTIN with a valid check digit."
}
],
"corrections": [],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-feed-validate" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"schema": {
"format": "google-merchant-subset",
"required": [
"brand"
],
"fields": [
{
"name": "gtin",
"type": "gtin"
},
{
"name": "link",
"type": "url"
}
]
},
"csv": "id,title,description,link,image_link,availability,price,gtin,secret_spec\nmug-1,Blue Mug,,https://shop.example/mug,,in_stock,12.50 USD,036000291453,invented\n"
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-image-metadata-audit$0.03 USDCAudit product image metadata
Check supplied image URLs, alt text, filename extensions, and supplied pixel sizes. Image files are not downloaded and alt text is not generated.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
Request exampleJSON
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"imageUrl": "https://cdn.example/mug.jpg",
"imageAlt": "Blue mug",
"imageWidth": 80,
"imageHeight": 80
},
{
"sku": "mug-2",
"title": "Green Mug",
"imageUrl": "https://cdn.example/mug.jpg"
},
{
"sku": "mug-3",
"title": "No image"
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "checked",
"productCount": 3,
"imageCount": 2,
"images": [
{
"productRef": "mug-1",
"row": 1,
"role": "primary",
"url": "https://cdn.example/mug.jpg",
"alt": "Blue mug",
"width": 80,
"height": 80,
"extension": "jpg"
},
{
"productRef": "mug-2",
"row": 2,
"role": "primary",
"url": "https://cdn.example/mug.jpg",
"alt": "",
"extension": "jpg"
},
{
"productRef": "mug-3",
"row": 3,
"role": "primary",
"url": "",
"alt": "",
"extension": ""
}
],
"issues": [
{
"kind": "missing",
"code": "missing",
"productRef": "mug-3",
"row": 3,
"field": "imageUrl",
"detail": "The product has no primary image URL. An image was not fetched or invented."
},
{
"kind": "conflict",
"code": "dimension_small",
"productRef": "mug-1",
"row": 1,
"field": "imageWidth",
"detail": "The supplied width is under 100 pixels. The file was not measured."
},
{
"kind": "conflict",
"code": "dimension_small",
"productRef": "mug-1",
"row": 1,
"field": "imageHeight",
"detail": "The supplied height is under 100 pixels. The file was not measured."
},
{
"kind": "duplicate",
"code": "duplicate_image",
"productRef": "mug-1",
"row": 1,
"field": "imageUrl",
"detail": "This image URL is used more than once in the catalog."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-2",
"row": 2,
"field": "imageAlt",
"detail": "The primary image has no alt text. Alt text was not generated."
},
{
"kind": "duplicate",
"code": "duplicate_image",
"productRef": "mug-2",
"row": 2,
"field": "imageUrl",
"detail": "This image URL is used more than once in the catalog."
}
],
"corrections": [
{
"productRef": "mug-3",
"row": 3,
"field": "imageUrl",
"code": "missing",
"detail": "Add the seller's image URL.",
"replacement": ""
},
{
"productRef": "mug-2",
"row": 2,
"field": "imageAlt",
"code": "missing",
"detail": "Add alt text that names the product.",
"replacement": ""
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-image-metadata-audit" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"imageUrl": "https://cdn.example/mug.jpg",
"imageAlt": "Blue mug",
"imageWidth": 80,
"imageHeight": 80
},
{
"sku": "mug-2",
"title": "Green Mug",
"imageUrl": "https://cdn.example/mug.jpg"
},
{
"sku": "mug-3",
"title": "No image"
}
]
}
JSONhttps://brainiac.software/api/v1/ecommerce-catalog/product-health-report$0.12 USDCReport product catalog health
Combine the normalize, attribute, variant, description, category, feed, and image checks. The report does not approve the catalog for a sales channel.
Body
| Field | Required | Notes |
|---|---|---|
products | No | array; Array |
csv | No | string |
json | No | string |
file | No | object; Object |
minLength | No | integer |
maxTitleLength | No | integer |
taxonomy | No | array; Array |
schema | No | object; Object |
Request exampleJSON
{
"taxonomy": [
{
"category": "Home > Kitchen",
"terms": [
"mug"
]
}
],
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "<p>A sturdy mug.</p>",
"category": "Home / Kitchen",
"price": 12.5,
"currency": "USD",
"imageUrl": "https://cdn.example/mug.jpg",
"imageAlt": "Blue mug",
"attributesText": "Attribute: material | stoneware\n"
},
{
"sku": "mug-2",
"title": "Second",
"parentSku": "mug-1",
"color": "Blue",
"size": "M"
}
]
}Response exampleJSON
{
"checkedAt": "2026-11-03T09:00:00.000Z",
"channelPublished": false,
"specificationsInvented": false,
"status": "needs_attention",
"format": "brainiac-catalog-v1",
"productCount": 2,
"counts": {
"missing": 4,
"conflict": 2,
"duplicate": 0,
"inferred": 0
},
"products": [
{
"row": 1,
"productRef": "mug-1",
"sku": "mug-1",
"title": "Blue Mug",
"description": "<p>A sturdy mug.</p>",
"brand": "",
"category": "Home > Kitchen",
"price": 12.5,
"currency": "USD",
"availability": "",
"condition": "",
"gtin": "",
"mpn": "",
"parentSku": "",
"color": "",
"size": "",
"material": "",
"certification": "",
"link": "",
"imageUrl": "https://cdn.example/mug.jpg",
"additionalImageUrls": [],
"imageAlt": "Blue mug",
"weightUnit": "",
"dimensionUnit": "",
"attributes": [
{
"name": "material",
"value": "stoneware",
"source": "labeled_line"
}
]
},
{
"row": 2,
"productRef": "mug-2",
"sku": "mug-2",
"title": "Second",
"description": "",
"brand": "",
"category": "",
"currency": "",
"availability": "",
"condition": "",
"gtin": "",
"mpn": "",
"parentSku": "mug-1",
"color": "Blue",
"size": "M",
"material": "",
"certification": "",
"link": "",
"imageUrl": "",
"additionalImageUrls": [],
"imageAlt": "",
"weightUnit": "",
"dimensionUnit": "",
"attributes": [
{
"name": "color",
"value": "Blue",
"source": "field"
},
{
"name": "size",
"value": "M",
"source": "field"
}
]
}
],
"classifications": [
{
"productRef": "mug-1",
"row": 1,
"suppliedCategory": "Home > Kitchen",
"matchedCategory": "Home > Kitchen",
"suggestedCategory": "",
"status": "observed",
"inferred": false,
"detail": "The supplied category matches the taxonomy. It was not inferred."
},
{
"productRef": "mug-2",
"row": 2,
"suppliedCategory": "",
"matchedCategory": "",
"suggestedCategory": "",
"status": "missing",
"inferred": false,
"detail": "No category was supplied and no keyword rule matched. No category was invented."
}
],
"issues": [
{
"kind": "missing",
"code": "missing",
"productRef": "mug-2",
"row": 2,
"field": "price",
"detail": "The product has no price."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-2",
"row": 2,
"field": "description",
"detail": "The product has no description. One was not generated."
},
{
"kind": "missing",
"code": "category",
"productRef": "mug-2",
"row": 2,
"field": "category",
"detail": "No category was supplied and no keyword rule matched. No category was invented."
},
{
"kind": "missing",
"code": "missing",
"productRef": "mug-2",
"row": 2,
"field": "imageUrl",
"detail": "The product has no primary image URL. An image was not fetched or invented."
},
{
"kind": "conflict",
"code": "html",
"productRef": "mug-1",
"row": 1,
"field": "description",
"detail": "The description contains HTML tags. The tags can be removed without adding words."
},
{
"kind": "conflict",
"code": "short",
"productRef": "mug-1",
"row": 1,
"field": "description",
"detail": "The description is shorter than 40 characters. It was not expanded."
}
],
"corrections": [
{
"productRef": "mug-1",
"row": 1,
"field": "category",
"code": "separators",
"detail": "Category separators were standardized. The category words were not changed.",
"replacement": "Home > Kitchen"
},
{
"productRef": "mug-1",
"row": 1,
"field": "description",
"code": "html",
"detail": "Remove the HTML tags. No new sentence was added.",
"replacement": "A sturdy mug."
},
{
"productRef": "mug-2",
"row": 2,
"field": "description",
"code": "missing",
"detail": "Add a description supplied by the seller.",
"replacement": ""
},
{
"productRef": "mug-2",
"row": 2,
"field": "imageUrl",
"code": "missing",
"detail": "Add the seller's image URL.",
"replacement": ""
}
],
"limitations": [
"No sales channel was contacted and no product was published.",
"Specifications, dimensions, materials, and certifications are not invented.",
"A category is marked inferred only when one caller-supplied keyword matches the title. It is not written over a supplied category.",
"Feed checks cover brainiac-catalog-v1 and a documented Google Merchant subset. They are not a channel approval.",
"Image files are not downloaded. Only supplied URLs and metadata are checked."
]
}cURL
curl -i -X POST "https://brainiac.software/api/v1/ecommerce-catalog/product-health-report" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"taxonomy": [
{
"category": "Home > Kitchen",
"terms": [
"mug"
]
}
],
"products": [
{
"sku": "mug-1",
"title": "Blue Mug",
"description": "<p>A sturdy mug.</p>",
"category": "Home / Kitchen",
"price": 12.5,
"currency": "USD",
"imageUrl": "https://cdn.example/mug.jpg",
"imageAlt": "Blue mug",
"attributesText": "Attribute: material | stoneware\n"
},
{
"sku": "mug-2",
"title": "Second",
"parentSku": "mug-1",
"color": "Blue",
"size": "M"
}
]
}
JSON