# ChatGPT Product Feed: What It Is and How to Send It

> What the ChatGPT product feed is, which fields OpenAI requires, how to send it by SFTP or API, which markets it covers today and how to validate it.

URL: https://clione.ai/glossary/chatgpt-product-feed/
Lang: en

This feed is not an RSS channel or a generic catalog export: it is **the [product feed](/glossary/product-feed/) in the exact format OpenAI asks for** so ChatGPT can index your products and show them with up-to-date [price and availability](/glossary/price-and-availability/).[^openai-get-started] It matters because it is the way a catalog gets into [ChatGPT's shopping answers](/glossary/chatgpt-shopping/), which OpenAI expanded on March 24, 2026 with more visual results and side-by-side comparisons.[^openai-discovery] If your store is on Shopify, much of the work is already done; if not, this is the file you have to prepare.

## How it works

**Who can send it.** Uploading a feed to ChatGPT is available, for now, to approved partners: access is requested with a form at `chatgpt.com/merchants`.[^openai-get-started] Shopify stores do not have to: their product data reaches ChatGPT through [Shopify Catalog](/glossary/shopify-catalog/) **with no extra work for each merchant**. OpenAI also supports delivery through providers such as Salesforce and Stripe.[^openai-discovery] The feed is one piece of the [ACP (Agentic Commerce Protocol)](/glossary/acp/), and OpenAI presents it as the first step of that integration.[^openai-get-started]

**Two ways to deliver it.** By file, uploaded by SFTP, or by API. The general recommendation is to **send the whole catalog once a day by file and the rest of the day's changes by API**; if the catalog is small, everything can go through the API, and promotions are only sent through the API.[^openai-get-started] The API lets you create the feed, query the products and update only the fields that change.[^openai-api-overview]

The file is a full copy of the catalog that OpenAI treats as the source of truth, and the recommended frequency is at least once a day. OpenAI prefers Parquet, and also accepts JSONL, CSV and TSV compressed with gzip, always in UTF-8. The file name has to be stable: it is overwritten on each upload instead of creating a new one, and if the catalog is large it is split into chunks, with a recommended maximum of 500,000 items per chunk.[^openai-fu-overview]

**What each row carries.** One row per item that can be bought, variants included, with nine required fields: ID, title, description, [product page](/glossary/product-page/) URL, brand, seller name, image, [price and availability](/glossary/price-and-availability/).[^openai-fu-products] Three rules in the specification head off most rejections:

- **Price is written as an amount and a currency**, for example `79.99 USD`: decimal point, no thousands separator and the ISO 4217 currency code. The sale price goes separately, has to be lower than the regular one and in the same currency.[^openai-fu-products]
- **Availability is required and a closed list**: `in_stock`, `out_of_stock`, `pre_order`, `backorder` or `unknown`. A row with no value, or with one that is not on the list, is rejected.[^openai-fu-products]
- **What you don't know, you leave out.** No `null`, `unknown` or `n/a` as filler in an optional field: an empty field does not mean zero or "no."[^openai-fu-products]

[Product variants](/glossary/product-variants/) go in separate rows, each with its own ID, the same `group_id` for the whole group, `listing_has_variations` set to `true` and a `variant_dict` with the chosen options.[^openai-fu-products]

**Eligible is not shown.** Every product is eligible for search unless you say otherwise, and is not eligible for checkout inside ChatGPT unless you turn it on in an integration that supports it. The specification itself warns: **eligibility does not guarantee it will be shown**.[^openai-fu-products] And some products do not get in: OpenAI excludes, among others, adult content, alcohol, nicotine, gambling, weapons and prescription drugs.[^openai-get-started]

## In a store

A mountain gear store that sells in the United States sends size 9.5 of a pair of trail shoes. This is a **fictional example**, with the specification's fields and the JSON spread over several lines to make it readable; in the JSONL file, each record goes on a single line:

```json
{
  "item_id": "TRAIL-BLK-95",
  "group_id": "TRAIL",
  "listing_has_variations": true,
  "variant_dict": { "color": "Black", "size": "9.5" },
  "title": "Waterproof trail running shoes, black, size 9.5",
  "description": "Trail running shoes with a waterproof membrane and rubber outsole.",
  "url": "https://mountain-example.com/products/trail?color=black&size=9.5",
  "brand": "Example Brand",
  "seller_name": "Example Mountain Co.",
  "image_url": "https://mountain-example.com/img/trail-black.jpg",
  "price": "119.00 USD",
  "availability": "in_stock"
}
```

Size 10 would be another row with a different `item_id`, the same `group_id` and its own price, availability, URL and image.[^openai-fu-products] **A product does not vanish as soon as it is missing from an upload**: OpenAI keeps its last record for up to 14 days, so a chunk that arrives late does not empty the catalog. To pull it sooner, `is_eligible_search` is set to `false`.[^openai-fu-overview]

Clione, for example, generates this feed from the enriched catalog and uploads it every day to the SFTP account OpenAI gives the store; whether the products appear, and where, is up to OpenAI.


Thinking that once you upload the feed your products can show up in ChatGPT in your country. **The standard upload in OpenAI's format is aimed at the United States today**: the country columns in each row do not change that destination, and other markets (the specification names Canada and Mexico) are only turned on when OpenAI confirms the integration, its countries and its currencies. A currency or a URL does not choose the market.[^openai-fu-products] And even when the market is the right one, being eligible does not guarantee showing up.


## How to check it

1. **Decide whether it applies to you.** If you sell on Shopify, your products arrive through Shopify Catalog; check that each one's data is complete in your admin.[^openai-discovery] If not, request access at `chatgpt.com/merchants`.[^openai-get-started]
2. **Start with a sample of about 100 items** with all the required fields, and move to the full catalog only when validation comes back clean.[^openai-fu-overview]
3. **Check price and availability row by row**: amount with a decimal point and currency code, and an availability value from the list.[^openai-fu-products]
4. **Look for filler values** like `n/a` or `null` in optional fields and delete them.[^openai-fu-products]
5. **If you start from a [Merchant Center](/glossary/google-merchant-center/) feed**, confirm with OpenAI that your feed supports the Google-compatible format before uploading it. That format has its own rules: write `preorder` instead of `pre_order`, it does not accept `unknown` and it uses the name you register as the seller, not a column.[^openai-fu-products]

## Related concept: ACP

The ACP is an [agentic commerce](/glossary/agentic-commerce/) protocol; the feed is one of its pieces. OpenAI extended the protocol to product discovery in March 2026 so merchants can share feeds and promotions, and let each merchant use its own checkout process while it focuses on discovery.[^openai-discovery] **For most stores, today the ACP is mainly a well-made feed.** The same schema also serves the feeds for ChatGPT ads, which have requirements of their own.[^openai-ads-feeds] The difference from a generic feed is explained by the [product feed](/glossary/product-feed/) term.

To go further, the [agentic commerce reading path](/learn/agentic-commerce/) orders the rest of the terms, and the [agentic browser](/glossary/agentic-browser/) explains the other way an agent reaches your store.
