Skip to content

Commit a7474e1

Browse files
Document ecommerce catalog product.json schema in API reference (#587)
Adds ecommerce_catalog_product and ecommerce_catalog_variant component schemas, inline field tables with Fin-specific descriptions, a worked JSON example, and schema deep links in the catalog upload endpoint. Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent 194be75 commit a7474e1

1 file changed

Lines changed: 283 additions & 1 deletion

File tree

descriptions/0/api.intercom.io.yaml

Lines changed: 283 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16461,6 +16461,96 @@ paths:
1646116461

1646216462
Part uploads are idempotent — retrying the same `part_number` does not create
1646316463
a duplicate. If a response is lost, retry with the same `part_number`.
16464+
16465+
## Product object structure
16466+
16467+
The catalog file must be a JSON array where each element is a product object.
16468+
Only `id`, `title`, and `url` are required — all other fields are optional.
16469+
16470+
| Field | Type | Required | Description |
16471+
|---|---|---|---|
16472+
| `id` | string | ✓ | Your unique product identifier. Used to match products on re-upload so only changed products are re-indexed. Also the delete key — any product ID absent from a new upload is removed from Fin's knowledge. Must be stable across uploads. |
16473+
| `title` | string | ✓ | Product name. Used by Fin when searching for and recommending products. |
16474+
| `url` | string | ✓ | Canonical product page URL shown in Fin's product recommendations. Must be a valid `https://` URL. |
16475+
| `description` | string | | Product description that Fin reads to understand what the product is. HTML formatting is supported and safely sanitized (`description_html` takes precedence if both are provided). This is the primary field Fin uses to match products to shopper questions — a richer description leads to better recommendations. |
16476+
| `featured_image_url` | string | | Primary product image shown in Fin's recommendation cards. Falls back to the first entry of `image_urls` if not provided. If no valid image can be resolved for a variant, that variant's card is not shown to the shopper. |
16477+
| `image_urls` | string[] | | Additional product images. Used as a fallback when `featured_image_url` is absent or when a variant has no specific image. |
16478+
| `price_min` | number | | Lowest price across all variants. If omitted, derived automatically from variant prices. Fin uses this to filter products when a shopper mentions a budget (e.g. "under $100"). Displayed as a range alongside `price_max`, or as a single value if both are equal. |
16479+
| `price_max` | number | | Highest price across all variants. If omitted, derived from variant prices. Used alongside `price_min` for budget filtering and price display. |
16480+
| `currency` | string | | ISO 4217 currency code (e.g. `"USD"`, `"EUR"`, `"GBP"`). Defaults to USD if omitted. Used to format prices with the correct symbol in Fin's responses and product cards. |
16481+
| `in_stock` | boolean | | Whether the product is available to purchase. If omitted, derived from variant stock — the product is in stock if at least one variant has `in_stock: true`. Products with no in-stock variants are hidden from Fin entirely. |
16482+
| `category_path` | string or string[] | Strongly recommended | Hierarchical category breadcrumb (e.g. `["Clothing", "Outerwear", "Jackets"]`). Fin understands the hierarchy — a shopper asking about "Clothing" sees products from all subcategories underneath it. The most specific category is shown in search results. |
16483+
| `collections` | string[] | Strongly recommended | Collections or groupings this product belongs to in your store. Fin uses collections to understand your catalog's structure and answer questions like "what's in the sale collection?". |
16484+
| `tags` | string[] | | Free-form keywords matching how shoppers phrase needs in chat (e.g. `["waterproof", "gift", "plus-size"]`). Complements `category_path` and `collections`. |
16485+
| `available_options` | object[] | | Option types and their possible values (e.g. `{"name": "Size", "values": ["S", "M", "L"]}`). Fin uses these to understand what choices a shopper can make and to correctly filter variants when asked for a specific size, colour, or other attribute. |
16486+
| `additional_data` | object | | Custom attributes for your business. Fin uses these to show each customer only relevant products. All keys must be consistent across all products in your catalog — the attribute schema is read from the first product in the file. |
16487+
| `variants` | object[] | | Individual purchasable variants. Fin recommends specific variants (not just products), so populating variants with accurate stock, price, and option data leads to more precise recommendations. See the variant table below. |
16488+
16489+
### Variant object structure
16490+
16491+
Each object in the `variants` array may contain:
16492+
16493+
| Field | Type | Required | Description |
16494+
|---|---|---|---|
16495+
| `id` | string | ✓ | Unique identifier for this variant within the product. |
16496+
| `title` | string | | Variant display name shown to shoppers (e.g. `"Small / Blue"`). |
16497+
| `price` | number | | Price of this specific variant. Fin uses variant prices for precise budget filtering and displays the variant price in recommendation cards. |
16498+
| `compare_at_price` | number | | Original price before a discount. When provided, Fin will naturally mention the saving (e.g. "down from $129 to $99"). |
16499+
| `in_stock` | boolean | | Whether this variant is currently available. Out-of-stock variants are not shown in Fin's recommendation cards and Fin will not suggest them to shoppers. |
16500+
| `image_url` | string | | Image specific to this variant. Takes precedence over the product's `featured_image_url`. Falls back to `featured_image_url`, then `image_urls`. If no valid image can be resolved, this variant's recommendation card will not be shown. |
16501+
| `selected_options` | object[] | | The specific option values that define this variant (e.g. `[{"name": "Size", "value": "Small"}, {"name": "Color", "value": "Blue"}]`). Fin uses these to match shopper requests like "do you have this in medium?" to the correct variant. |
16502+
| `url` | string | | Direct link to this variant's page. Takes precedence over the product URL in recommendation cards. If omitted, constructed automatically as `{product_url}?variant={id}`. |
16503+
16504+
### Example catalog file
16505+
16506+
```json
16507+
[
16508+
{
16509+
"id": "prod-12345",
16510+
"title": "Classic Cotton T-Shirt",
16511+
"url": "https://example.com/products/classic-cotton-t-shirt",
16512+
"description": "A comfortable everyday t-shirt.",
16513+
"featured_image_url": "https://cdn.example.com/images/t-shirt.jpg",
16514+
"price_min": 19.99,
16515+
"price_max": 29.99,
16516+
"currency": "USD",
16517+
"in_stock": true,
16518+
"tags": ["organic", "bestseller"],
16519+
"collections": ["Summer Collection"],
16520+
"category_path": "Clothing > T-Shirts",
16521+
"available_options": [
16522+
{"name": "Size", "values": ["S", "M", "L"]},
16523+
{"name": "Color", "values": ["White", "Blue"]}
16524+
],
16525+
"variants": [
16526+
{
16527+
"id": "var-001",
16528+
"title": "S / White",
16529+
"price": 19.99,
16530+
"in_stock": true,
16531+
"selected_options": [
16532+
{"name": "Size", "value": "S"},
16533+
{"name": "Color", "value": "White"}
16534+
]
16535+
},
16536+
{
16537+
"id": "var-002",
16538+
"title": "M / Blue",
16539+
"price": 29.99,
16540+
"in_stock": true,
16541+
"selected_options": [
16542+
{"name": "Size", "value": "M"},
16543+
{"name": "Color", "value": "Blue"}
16544+
]
16545+
}
16546+
],
16547+
"additional_data": {
16548+
"sku": "TSHIRT-WHT-S",
16549+
"vendor": "Acme Apparel"
16550+
}
16551+
}
16552+
]
16553+
```
1646416554
requestBody:
1646516555
content:
1646616556
multipart/form-data:
@@ -16472,7 +16562,13 @@ paths:
1647216562
format: binary
1647316563
description: |
1647416564
The catalog JSON file. Required for all requests except finalization
16475-
(`finalize=true`). Must be a valid JSON array of objects. Max 99 MB.
16565+
(`finalize=true`). Must be a valid JSON array of product objects. Max 99 MB.
16566+
16567+
Each element in the array must conform to the
16568+
[`ecommerce_catalog_product`](/docs/references/preview/rest-api/api.intercom.io/models/ecommerce_catalog_product) schema.
16569+
The `id`, `title`, and `url` fields are required on every product;
16570+
all other fields are optional. Variants, if provided, must conform to the
16571+
[`ecommerce_catalog_variant`](/docs/references/preview/rest-api/api.intercom.io/models/ecommerce_catalog_variant) schema.
1647616572
finalize:
1647716573
type: string
1647816574
enum:
@@ -33294,6 +33390,192 @@ components:
3329433390
type: string
3329533391
description: A human-readable description of the sync status.
3329633392
example: Catalog received. Sync has started.
33393+
ecommerce_catalog_variant:
33394+
title: Ecommerce Catalog Variant
33395+
type: object
33396+
description: A product variant in an ecommerce catalog upload.
33397+
properties:
33398+
id:
33399+
type: string
33400+
description: Unique identifier for this variant within the product.
33401+
example: 'var-001'
33402+
title:
33403+
type: string
33404+
description: Variant display name shown to shoppers (e.g. "Small / Blue").
33405+
example: 'Blue / Large'
33406+
price:
33407+
type: number
33408+
description: Price of this specific variant. Fin uses variant prices for precise budget filtering and displays the variant price in recommendation cards.
33409+
example: 29.99
33410+
nullable: true
33411+
compare_at_price:
33412+
type: number
33413+
description: Original price before a discount. When provided, Fin will naturally mention the saving to the shopper (e.g. "down from $129 to $99").
33414+
example: 39.99
33415+
nullable: true
33416+
in_stock:
33417+
type: boolean
33418+
description: Whether this variant is currently available. Out-of-stock variants are not shown in Fin's recommendation cards and Fin will not suggest them to shoppers.
33419+
example: true
33420+
url:
33421+
type: string
33422+
description: Direct link to this variant's page. Takes precedence over the product URL in recommendation cards. If omitted, constructed automatically as `{product_url}?variant={id}`.
33423+
example: 'https://example.com/products/t-shirt?variant=var-001'
33424+
nullable: true
33425+
image_url:
33426+
type: string
33427+
description: Image specific to this variant. Takes precedence over the product's `featured_image_url`. Falls back to `featured_image_url`, then `image_urls`. If no valid image can be resolved, this variant's recommendation card will not be shown.
33428+
example: 'https://cdn.example.com/images/t-shirt-blue.jpg'
33429+
nullable: true
33430+
selected_options:
33431+
type: array
33432+
description: The specific option values that define this variant (e.g. Size=Small, Color=Blue). Fin uses these to match shopper requests like "do you have this in medium?" to the correct variant.
33433+
items:
33434+
type: object
33435+
properties:
33436+
name:
33437+
type: string
33438+
description: Option name.
33439+
example: 'Size'
33440+
value:
33441+
type: string
33442+
description: Selected option value.
33443+
example: 'Large'
33444+
ecommerce_catalog_product:
33445+
title: Ecommerce Catalog Product
33446+
type: object
33447+
description: |
33448+
A product object in an ecommerce catalog upload. The catalog file must be a JSON
33449+
array of these objects. The `id`, `title`, and `url` fields are required; all
33450+
others are optional.
33451+
required:
33452+
- id
33453+
- title
33454+
- url
33455+
properties:
33456+
id:
33457+
type: string
33458+
description: Your unique product identifier. Used to match products on re-upload so only changed products are re-indexed. Also the delete key — any product ID absent from a new upload is removed from Fin's knowledge. Must be stable across uploads.
33459+
example: 'prod-12345'
33460+
title:
33461+
type: string
33462+
description: Product name. Used by Fin when searching for and recommending products.
33463+
example: 'Classic Cotton T-Shirt'
33464+
url:
33465+
type: string
33466+
description: Canonical product page URL shown in Fin's product recommendations. Must be a valid https:// URL.
33467+
example: 'https://example.com/products/classic-cotton-t-shirt'
33468+
description:
33469+
type: string
33470+
description: Product description that Fin reads to understand what the product is. HTML formatting is supported and safely sanitized (`description_html` takes precedence if both are provided). This is the primary field Fin uses to match products to shopper questions — a richer description leads to better recommendations.
33471+
example: 'A comfortable everyday t-shirt made from 100% organic cotton.'
33472+
nullable: true
33473+
description_html:
33474+
type: string
33475+
description: HTML product description. Takes precedence over `description` when both are provided. HTML is safely sanitized before indexing.
33476+
example: '<p>A comfortable everyday t-shirt made from <strong>100% organic cotton</strong>.</p>'
33477+
nullable: true
33478+
featured_image_url:
33479+
type: string
33480+
description: Primary product image shown in Fin's recommendation cards. Falls back to the first entry of `image_urls` if not provided. If no valid image can be resolved for a variant, that variant's recommendation card is not shown to the shopper.
33481+
example: 'https://cdn.example.com/images/t-shirt-main.jpg'
33482+
nullable: true
33483+
image_urls:
33484+
type: array
33485+
description: Additional product images. Used as a fallback image source when `featured_image_url` is absent or when a variant has no specific image.
33486+
items:
33487+
type: string
33488+
example:
33489+
- 'https://cdn.example.com/images/t-shirt-back.jpg'
33490+
- 'https://cdn.example.com/images/t-shirt-detail.jpg'
33491+
price_min:
33492+
type: number
33493+
description: Lowest price across all variants. If omitted, derived automatically from variant prices. Fin uses this to filter products when a shopper mentions a budget (e.g. "under $100"). Displayed as a range alongside `price_max`, or as a single value if both are equal.
33494+
example: 19.99
33495+
nullable: true
33496+
price_max:
33497+
type: number
33498+
description: Highest price across all variants. If omitted, derived from variant prices. Used alongside `price_min` for budget filtering and price display.
33499+
example: 39.99
33500+
nullable: true
33501+
currency:
33502+
type: string
33503+
description: ISO 4217 currency code for all prices on this product (e.g. "USD", "EUR", "GBP"). Defaults to USD if omitted. Used to format prices with the correct symbol in Fin's responses and product cards.
33504+
example: 'USD'
33505+
nullable: true
33506+
in_stock:
33507+
type: boolean
33508+
description: Whether the product is available to purchase. If omitted, derived from variant stock — the product is in stock if at least one variant has `in_stock: true`. Products with no in-stock variants are hidden from Fin entirely and will not be recommended to shoppers.
33509+
example: true
33510+
nullable: true
33511+
tags:
33512+
type: array
33513+
description: Free-form keywords matching how shoppers phrase needs in chat (e.g. "waterproof", "gift", "plus-size"). Used by Fin to match fuzzy queries; complements `category_path` and `collections`.
33514+
items:
33515+
type: string
33516+
example:
33517+
- 'organic'
33518+
- 'bestseller'
33519+
collections:
33520+
type: array
33521+
description: Collections or groupings this product belongs to in your store. Fin uses collections to understand your catalog's structure and answer questions like "what's in the sale collection?". Each element may be a plain string or an object with a `title` field.
33522+
items:
33523+
oneOf:
33524+
- type: string
33525+
example: 'Summer Collection'
33526+
- type: object
33527+
properties:
33528+
title:
33529+
type: string
33530+
example: 'Summer Collection'
33531+
category_path:
33532+
description: |
33533+
Hierarchical category breadcrumb for the product. Fin understands the hierarchy — a
33534+
shopper asking about "Clothing" will see products from all subcategories underneath it.
33535+
The most specific category is shown in search results. Strongly recommended. Provide as
33536+
a pre-formatted string (e.g. `"Clothing > T-Shirts"`) or as an array of path segments
33537+
(e.g. `["Clothing", "T-Shirts"]`). Array segments are joined with ` > `.
33538+
oneOf:
33539+
- type: string
33540+
example: 'Clothing > T-Shirts'
33541+
- type: array
33542+
items:
33543+
type: string
33544+
example:
33545+
- 'Clothing'
33546+
- 'T-Shirts'
33547+
nullable: true
33548+
available_options:
33549+
type: array
33550+
description: Option types available for this product and their possible values (e.g. {"name": "Size", "values": ["S", "M", "L"]}). Fin uses these to understand what choices a shopper can make and to correctly filter variants when a shopper asks for a specific size, colour, or other attribute.
33551+
items:
33552+
type: object
33553+
properties:
33554+
name:
33555+
type: string
33556+
description: Option name (e.g. "Size").
33557+
example: 'Size'
33558+
values:
33559+
type: array
33560+
description: All available values for this option.
33561+
items:
33562+
type: string
33563+
example:
33564+
- 'Small'
33565+
- 'Medium'
33566+
- 'Large'
33567+
variants:
33568+
type: array
33569+
description: Individual purchasable variants of the product. Fin recommends specific variants (not just products), so populating variants with accurate stock, price, and option data leads to more precise recommendations. See `ecommerce_catalog_variant` for the variant object schema.
33570+
items:
33571+
"$ref": "#/components/schemas/ecommerce_catalog_variant"
33572+
additional_data:
33573+
type: object
33574+
description: Custom attributes for your business. Fin uses these to show each customer only the products relevant to them (e.g. regional availability or warehouse codes). All keys must be consistent across all products in your catalog — the attribute schema is read from the first product in the file.
33575+
example:
33576+
sku: 'TSHIRT-BLU-L'
33577+
vendor: 'Acme Apparel'
33578+
nullable: true
3329733579
email_address_header:
3329833580
title: Email Address Header
3329933581
type: object

0 commit comments

Comments
 (0)