Short answer. OpenAI’s product feed is a JSONL, CSV or TSV file with one row per item or variant and nine required fields: item_id, title, description, url, brand, seller_name, image_url, availability and price. Everything else is optional, and the optional fields that matter are the sale price, the extra images, the variant grouping and the three eligibility flags that decide where a product can appear.
What the file is
OpenAI’s products specification accepts JSON Lines (one JSON object per line), comma-delimited CSV and tab-delimited TSV, plus gzip-compressed versions of each. It says XML is not supported, which rules out uploading a Google Shopping feed unchanged; our field map covers the conversion. Each row is one sellable thing: a product without variants, or one variant of a product.
The nine required fields
| Field | What OpenAI asks for |
|---|---|
item_id | A stable id, unique per item or variant within your feed. Never reuse or renumber it. |
title | The product name, with the variant when relevant. Up to 150 characters. |
description | Factual product details. Up to 5,000 characters. |
url | The product detail page, stable over time. |
brand | The brand as shown on the product page. |
seller_name | The name of the seller supplying this offer. No Google equivalent. |
image_url | The main product image as a direct JPEG or PNG URL. |
availability | One of in_stock, out_of_stock, pre_order, backorder, unknown. |
price | The regular price as “amount CURRENCY”, e.g. 79.99 USD, in major units. |
Two of these catch merchants coming from Google. seller_name has no Google counterpart and must be the name a shopper would recognise, not a platform handle; a Shopify store’s myshopify slug is the classic wrong value. And availability uses pre_order with an underscore where Google writes preorder; every other value matches.
The optional fields that decide whether you are found
Price and sale. price is the regular price; the specification says to update the feed when a sale starts or ends, and the sale price travels in its own field so ChatGPT can show both. Prices are decimal amount, a space, and the ISO 4217 code: 59.99 USD.
Images. image_url is the main image, a direct JPEG or PNG link. additional_image_urls takes the rest, as an array in JSONL or comma-separated in CSV.
Variants. Rows of one product share a group_id, the parent row carries listing_has_variations = true, and variant_dict maps the option names to values (colour, size). Without the group, a shirt in six sizes is six unrelated products, the same failure a Google feed has without item_group_id.
Eligibility flags. is_eligible_search allows the product to appear in shopping answers; is_eligible_checkout allows purchase inside ChatGPT, which needs the separate checkout integration to be enabled; is_ads_eligible marks products for ChatGPT Ads, whose feed documentation also lists seller_url, return_policy, target_countries and store_country as required for that use.
A row that passes
{"item_id":"26","title":"V-Neck T-Shirt - Blue","description":"Cotton V-neck tee, regular fit.",
"url":"https://demo.feedrobin.com/product/v-neck-t-shirt/?attribute_pa_color=blue",
"brand":"Demo Apparel","seller_name":"FeedRobin Demo Store",
"image_url":"https://demo.feedrobin.com/wp-content/uploads/2019/01/vnech-tee-blue-1.jpg",
"availability":"in_stock","price":"15.00 USD",
"group_id":"10","variant_dict":{"color":"Blue"},"is_eligible_search":true}One JSON object, one line, every required field present, the variant tied to its group. A CSV row is the same values under the same column names, with the array fields comma-separated.
What a feed check tells you before OpenAI does
The free feed check reads Google-format feeds, which is where most catalogues start, and its findings map straight onto this spec: missing images, missing brands and descriptions, unrecognised availability words, ungrouped variants and over-long titles are the same defects under different field names. Fix them once at the source and both feeds are clean. FeedRobin renders the OpenAI JSONL from the same catalogue as the Google XML, with seller_name set to your store name and the variant fields filled from your options.
Questions merchants ask
Is the OpenAI feed the same as a Google Shopping feed?
No. OpenAI reads JSONL, CSV or TSV, not XML, renames most fields (item_id, url, image_url), requires seller_name, and spells one availability value pre_order with an underscore. The structure is close enough that a Google feed converts cleanly, but it does not upload as-is.
Which optional fields matter most?
The ones ChatGPT matches on and shows: sale_price when a sale is on, additional_image_urls, the variant fields (group_id, listing_has_variations, variant_dict) so sizes and colours are one product, and the eligibility flags, which decide whether a product can appear in search, in checkout and in ads at all.
What does availability = unknown do?
It tells ChatGPT you cannot say. It is honest for a marketplace listing you do not control, and a poor choice for your own stock: an unknown item is not one an assistant recommends with confidence. Send in_stock or out_of_stock from your inventory.
Do I need is_ads_eligible if I am not running ads?
The field is for ChatGPT Ads; OpenAI’s ads feed documentation says to set it to true for products you want processed for ads. If you are not advertising, leave it false or absent; the discovery feed does not depend on it.
Sources
OpenAI’s products feed specification (formats, required fields, variant fields, eligibility flags), its product feeds for ChatGPT Ads page (the ads-specific required fields and is_ads_eligible), and the Agentic Commerce documentation index. The sample row is built from a real item in our WooCommerce demo store’s feed, converted to the OpenAI field names.