What Does a ChatGPT Product Feed Actually Require in 2026?
A ChatGPT product feed requires nine fields on every row before it is useful for discovery: item_id, title, description, url, brand, seller_name, image_url, availability and price. Everything else is optional for discovery, and Ads and checkout each carry their own separate requirements. OpenAI's specification says plainly that one row is submitted per purchasable item or variant.
Before any of this matters, one gate applies. OpenAI states that onboarding product feeds in ChatGPT is currently available to approved partners, with applications through chatgpt.com/merchants. The field specification is public, so you can prepare a feed today, but you cannot switch it on without acceptance. This guide is the spoke on field-level detail in our guide to the Agentic Commerce Protocol product feed.
OpenAI's file-upload specification states that the standard OpenAI-format upload currently targets the US, and that row-level market columns do not change that default. The shared format currently represents US, CA and MX, and additional markets apply only after OpenAI confirms the integration and its allowed countries and currencies. A rupee price or an Indian product URL does not select India as a destination market.
What Are the Nine Required Fields in 2026?
The nine required fields are the minimum for a useful discovery feed, and OpenAI's specification is specific about each one. It also asks for a real brand and seller name rather than placeholders, and recommends keeping titles to at most 150 characters and descriptions to at most 5,000, in plain text.
| Field | Type | What OpenAI requires in 2026 |
|---|---|---|
item_id | String | Stable ID, unique per item or variant within your feed. Never reuse it for a different item. |
title | String | Product name, including the selected variant when relevant. |
description | String | Factual product description for this item. |
url | String (URL) | Product detail page, with the variant selected when possible. Keep it stable. |
brand | String | Product brand as shown on the product page. |
seller_name | String | Name of the seller supplying this offer. |
image_url | String (URL) | Main product image showing this variant, as a direct image URL such as a JPEG or PNG. |
availability | String | in_stock, out_of_stock, pre_order, backorder or unknown. Omitted, empty or unrecognised values reject the row. |
price | String (money) | Regular item price in major currency units, written as amount CURRENCY. |
OpenAI's minimal example is a single JSONL record. It notes that search defaults to enabled and checkout to disabled, and that Ads defaults to disabled unless your feed has an Ads default configured.
{"item_id":"MUG-350-BLUE","title":"Blue ceramic mug, 350 mL","description":"Dishwasher-safe glazed ceramic mug with a handle.","url":"https://example.com/products/mug-blue","brand":"Northline","seller_name":"Northline Home","image_url":"https://example.com/images/mug-blue.jpg","price":"18.00 USD","availability":"in_stock"}
Why Does the Availability Field Reject So Many Rows in 2026?
Because it is the one required field with a closed list and no silent default. The specification states that omitted, empty or unrecognised availability values reject the row, and that unknown must be used explicitly when stock status is unavailable. Many commerce platforms export stock as a number or as a phrase such as "In stock", and either will fail without a mapping step.
Two further rules matter. OpenAI notes that unknown does not assert that the item is in stock, so it is not a safe default for products you actually sell. And pre_order and backorder do not schedule a future stock change: you update availability yourself when the item becomes available or sells out.
How Should Prices Be Formatted in 2026?
Prices are written as a decimal amount in major units, a space, and an uppercase three-letter ISO 4217 code, for example 79.99 USD. The specification spells out that this means 79 dollars and 99 cents, not 7,999 dollars, and forbids thousands separators, exponent notation, and more fractional digits than the currency permits. It also warns against rounding a price into a different payable amount.
- Regular price must be positive for discovery and in the currency agreed for your feed.
sale_priceis optional and must be greater than zero, strictly less thanprice, and in the same currency. A sale price that fails any of those conditions is not used.- Dates do not schedule prices. Sale-window and expiration dates do not trigger price changes in this contract. Submit the current price and update the feed when a sale starts or ends.
One format trap catches teams moving between the two delivery formats: the API product schema expresses money as an integer in ISO 4217 minor units with a separate currency field, while the file-upload format uses the amount CURRENCY string. Do not reuse a formatter across both without converting.
How Do Variants Work in a ChatGPT Feed in 2026?
Each purchasable selection gets its own row with a distinct item_id, the same group_id, listing_has_variations=true, and a variant_dict mapping option names to the selected values. The group ID must differ from every item ID, and each row carries its own price, availability, URL and images. OpenAI is blunt about one rule: never include price in an offer ID.
| Field | Requirement in 2026 | Rule to follow |
|---|---|---|
group_id | Conditionally required for variants | Stable parent-listing ID shared by all variants. If omitted, item_id is used and no variant group exists. |
listing_has_variations | Conditionally required for variants | Set true on every variant row. |
variant_dict | Conditionally required for variants | Option names to selected values. Ignored unless the two fields above are set correctly. |
offer_id | Optional | Stable and unique within the feed. Never includes price. |
gtin | Optional | Exactly 8, 12, 13 or 14 digits with a valid check digit. Preserve leading zeros. Omit if unassigned. |
mpn | Optional | Submit with brand. Do not invent one to replace a missing GTIN. |
OpenAI also asks that all three identifiers, item, group and offer, stay stable when price, stock, title or images change. Re-keying products on every export is the quickest way to lose whatever history the platform has built against your items.
Which Optional Fields Are Worth Supplying in 2026?
The optional fields that most change what a shopper sees are the ones describing returns, reviews, condition and dimensions. OpenAI's guidance on optional data is consistent: omit an unknown value rather than inventing one, and never use placeholder strings such as null, unknown or n/a except where unknown is explicitly listed.
| Field | What it does in 2026 | Rule that trips people up |
|---|---|---|
condition | new, refurbished or used | Omitted may be treated as new. Always declare used or refurbished. |
accepts_returns | Boolean return acceptance | A policy URL does not set or override it. |
return_deadline_in_days | Positive whole number of days | Only with accepts_returns=true. It is a duration, not a deadline date. |
review_count and star_rating | Review aggregates, rating on a 0 to 5 scale to two decimals | Same review population for both. Exclude seller and store reviews. |
shipping_price | Shipping charge in the same currency as price | Omitted means unknown, not free shipping. Zero means no charge. |
dimensions | Structured product dimensions | Product dimensions, not package dimensions. Units are not inferred. |
additional_image_urls | Extra product views | Use an array in JSONL; never spaces or semicolons as separators. |
Some optional fields only work if your integration is configured for them. The specification lists marketplace_seller, size_system, store review fields, accepts_exchanges and is_digital as requiring setup, and notes that adding these columns to a standard upload does not enable them. Confirm support during onboarding before relying on them.
How Are Ads and Checkout Fields Different in 2026?
They are separate layers on top of the discovery feed, each with its own flag, and neither is switched on by the flag alone. Search eligibility defaults to on. Ads defaults to off unless a feed-level default applies. Checkout defaults to off and requires a separately enabled integration.
| Flag | Default | What OpenAI says about it in 2026 |
|---|---|---|
is_eligible_search | True when omitted | false disables search and checkout. Eligibility does not guarantee display. |
is_ads_eligible | Disabled unless a feed-level Ads default applies | Independent of search eligibility. Pair with the ChatGPT Ads setup. |
is_eligible_checkout | Disabled | Opts in only when search is also true and checkout is enabled for the integration. |
seller_privacy_policy, seller_tos | None | Conditionally required for checkout. Supplying them does not establish checkout readiness. |
For the full checkout implementation behind that flag, see our agentic checkout merchant guide.
Can You Upload a Google Merchant Center Style Feed in 2026?
Yes, but only after OpenAI confirms it for your registered feed, and only within a defined compatibility profile. The specification accepts UTF-8 tab-delimited .txt or .tsv, or comma-delimited .csv, including gzip-compressed versions, with one header row. JSON, spreadsheets, XML, RSS and Atom are not supported on this path, and g:-prefixed XML names must not be used.
The differences from the OpenAI format are small and easy to miss. Availability must use preorder, not pre_order, and unknown is not accepted. A registered merchant display name becomes the seller on every row, so an uploaded seller_name cannot override it. And accepted products on this path have search enabled and checkout disabled, so uploaded opt-out flags do not apply. If you need per-item search controls, OpenAI says to use a feed confirmed to follow the OpenAI format.
What Are the Common Mistakes With Feed Fields in 2026?
- Assuming an Indian feed reaches Indian shoppers. Standard uploads target the US. Additional markets need OpenAI's confirmation.
- Exporting stock as a number.
availabilityis a closed list, and anything unrecognised rejects the row. - Using placeholder text for unknowns. Omit the value.
unknownis valid only where explicitly listed. - Putting price in an offer ID. OpenAI forbids it, and it breaks stability every time the price moves.
- Reading empty shipping as free. Omitted
shipping_pricemeans unknown. - Relying on dates to change prices or stock. They are metadata only in this contract.
- Mixing money formats between file upload strings and API minor-unit integers.
- Setting the checkout flag and expecting checkout. It needs a separately enabled integration.
Key Takeaways for 2026
- Nine required fields per row:
item_id,title,description,url,brand,seller_name,image_url,availability,price. - Feed onboarding is limited to approved partners, applied for at chatgpt.com/merchants.
- The standard format targets the US; the shared format represents US, CA and MX; other markets need confirmation.
- Availability rejects anything outside its list. Prices use
amount CURRENCYwith no separators. - One row per variant, stable IDs, shared
group_id, and never price in an offer ID. - Search defaults on, Ads and checkout default off, and flags alone do not enable checkout.
Distk helps D2C and e-commerce teams in India and internationally audit catalogue exports against specifications like this one, fix the mapping layer before it rejects rows, and decide whether AI shopping surfaces are worth building for yet. If you are preparing a feed for ChatGPT in 2026, that audit is where we start.