OpenAI publishes a real specification for the product feed that powers ChatGPT Shopping and agentic checkout, and most guides covering it get the details wrong. Some report the wrong field count. Almost none mention the validation rules that quietly reject a listing even when the feed looks fine at a glance. This post works from the primary source only: developers.openai.com/commerce/product-feeds/spec and developers.openai.com/commerce/guides/key-concepts.
If you sell products and want them surfaced in ChatGPT's shopping results, this is the checklist to audit your feed against, not a generic "keep your data clean" reminder.
What is the ChatGPT product feed specification?
The ChatGPT product feed specification is OpenAI's format for submitting product data so it can appear in ChatGPT Shopping and agentic commerce results. It defines which fields are required, which are conditional, and which validation rules cause a row to be rejected or degraded.
The feed accepts two submission formats: JSONL (one complete JSON record per line) or a Google Merchant Center-compatible feed (UTF-8, tab-delimited .txt/.tsv or comma-delimited .csv, gzip supported). There's no SFTP requirement in the official docs. On refresh cadence, OpenAI's own docs describe an initial sample feed for validation, then daily snapshots, that's the documented cadence, not the 15-minute refresh cycle some secondary sources claim. Build your update pipeline around daily snapshots, not a made-up 15-minute window.
What are the 9 required fields?
A product row is rejected if any of these nine fields is missing, empty, or holds an unrecognized value.
| Field | What it is | What breaks if it's wrong |
|---|---|---|
item_id | Stable ID, unique per item/variant in the feed | Duplicate or reused IDs cause the row (or the wrong variant) to be dropped |
title | Product name, including the variant when relevant | A generic title without variant detail shows the wrong item |
description | Factual description for this specific item | Missing or copied-across-variants descriptions weaken ranking, not just display |
url | Product detail page, variant selected when possible | A URL pointing to the wrong variant sends buyers to the wrong page |
brand | Brand as shown on the product page | Mismatched brand naming breaks entity matching |
seller_name | Name of the seller supplying this offer | Missing seller identity blocks the offer from displaying |
image_url | Main image, showing this variant | Broken or generic images get the listing skipped in visual results |
availability | Exactly one of the 5 valid values | An unrecognized value rejects the entire row |
price | Regular price, major currency units | Missing or malformed price blocks checkout eligibility entirely |
in_stock, out_of_stock, pre_order, backorder, or unknown. A value like "In Stock" with different casing, "limited", or a blank string doesn't get normalized, it gets the row rejected outright.
When are additional fields required?
Several fields become mandatory depending on what you're submitting, not on every row.
- Variants:
group_idandlisting_has_variationsare required when you submit variant products.variant_dictis required on each variant row whenlisting_has_variations=true. - Dimensions and weight: if you submit separate dimension fields,
dimensions_unitis required. If you submit weight,item_weight_unitis required. - Third-party marketplace offers:
marketplace_selleris required. - Checkout integration:
seller_privacy_policyandseller_tosare required.
Miss a conditional field for the case that applies to you, and the behavior is the same as missing a required one: the row is rejected.
What validation rules cause silent rejections?
This is the part most feed guides skip, and it's where feeds that look clean on a spreadsheet actually fail.
- GTINs must be exactly 8, 12, 13, or 14 digits, including a valid check digit. A GTIN copied from a supplier feed with a typo or a truncated digit fails silently rather than throwing an obvious error.
- Sale prices must be strictly less than the regular price, in the same currency. A "sale" price equal to, higher than, non-positive, or in a different currency than
priceisn't used as a sale price at all. - Variant item IDs can never be reused across items, and a `group_id` must differ from every individual item ID in that group. Feed exports that recycle SKUs across a product line trip this constantly.
Beyond those three, the spec calls out a few other silent failure modes worth checking:
- Invalid URLs in optional image lists aren't a hard row rejection, they just get silently omitted, so the image disappears without an error.
- Placeholder strings like
null,unknown, orn/aare rejected wherever they aren't an explicitly permitted value for that field.
None of these produce a loud failure. Your feed submits successfully, and the affected rows just don't show up, or show up with missing images and no clear reason why.
Does passing validation guarantee ranking?
No. Passing validation only gets a product eligible to display, it doesn't compete for ranking. Per OpenAI's own documentation, "required fields ensure correct display of price and availability, while recommended attributes, like rich media, reviews, and performance signals, improve ranking, relevance, and user trust."
That's the distinction most feed advice glosses over. The 9 required fields are the bar for showing up at all. Recommended fields, GTIN/UPC/MPN identifiers, additional images, video, and reviews or ratings data, are what actually competes for placement once you've cleared that bar. A feed that passes validation with only the required fields populated is eligible but not competitive.
How does this compare to a standard Google Shopping feed?
| Aspect | Google Merchant Center | ChatGPT product feed |
|---|---|---|
| Format | XML, TSV, CSV | JSONL, or Merchant Center-compatible TSV/CSV |
| Required fields | ~10 core fields (varies by category) | 9 required fields, always |
| Availability values | 4 standard values | 5 values, including unknown |
| Sale price rule | Must be lower than list price | Must be strictly lower, same currency, enforced at validation |
| Variant handling | item_group_id | group_id + variant_dict, ID reuse strictly rejected |
| Ranking signal | Approval + Shopping ads performance | Required fields for eligibility, recommended fields for ranking |
You can largely reuse a Google Merchant Center feed as the base since OpenAI explicitly supports that format, but you can't assume it passes as-is. Run it through the required-field and validation checks above first.
Is there a version number for the spec?
Independent tracking sites report the current stable spec as dated 2026-01-30, though the official OpenAI developer docs pages we reviewed didn't display an explicit version string themselves. Treat the spec as something to re-check periodically against the primary source rather than a fixed document you audit once.
A feed that "looks fine" in a spreadsheet can still fail silently. Audit for the GTIN check digit, the strict sale-price inequality, and item ID reuse across variants specifically, those three rules account for most real-world rejections that do not throw an obvious error.
FAQ
What are the required fields for the OpenAI product feed?
The nine required fields are item_id, title, description, url, brand, seller_name, image_url, availability, and price. A product row is rejected if any one of them is missing, empty, or holds an unrecognized value.
What format does the ChatGPT shopping feed need to be in?
OpenAI accepts JSONL (one JSON record per line) or a Google Merchant Center-compatible feed in UTF-8, tab-delimited .txt/.tsv, or comma-delimited .csv, with gzip compression supported. There's no SFTP requirement documented officially.
What are the valid values for the availability field?
The availability field must be exactly one of five values: in_stock, out_of_stock, pre_order, backorder, or unknown. Any other value, including differently cased or formatted versions of these, causes the row to be rejected.
Why would a GTIN fail validation even if it looks correct?
A GTIN must be exactly 8, 12, 13, or 14 digits and include a valid check digit. A GTIN that's the right length but has an invalid check digit, often from a typo introduced upstream in a supplier feed, still fails.
Can I reuse an item ID across product variants?
No. Each item_id must be unique per item or variant within the feed, and the group_id for a variant set must differ from every individual item ID in that group. Reusing IDs across variant rows is a common cause of rejected listings for stores exporting from systems that recycle SKUs.
Does OpenAI require a specific refresh interval for the feed?
The docs describe daily snapshots as part of the integration flow, after an initial sample feed for validation, not the 15-minute refresh some secondary sources claim. There's no SFTP requirement either. That's a separate claim floating around outside the primary documentation.
How is this different from general e-commerce GEO advice?
General GEO advice for e-commerce covers structured data, entity clarity, and content strategy at the site level. See our guides on GEO for e-commerce and AI shopping agents for that broader picture. This post is specifically about the technical feed spec: the exact fields, formats, and validation rules that determine whether a product listing is accepted into ChatGPT Shopping at all.
Does passing feed validation guarantee my product ranks well in ChatGPT Shopping?
No. Validation only determines eligibility to display. Ranking depends on recommended attributes beyond the required fields, including GTIN/UPC/MPN identifiers, rich media, and review or performance signals, per OpenAI's own documentation.
Sources: OpenAI Commerce: Product Feed Spec, OpenAI Commerce: Key Concepts
This post is part of our AI SEO guide. Related reading: Bing Webmaster Tools AI Performance Report, Google Search Console's AI Overviews Report,, Domain Authority Doesn't Predict AI.

Adel tracks AI citation rates across ChatGPT, Perplexity, Gemini, and AI Overviews. He turns raw visibility data into actionable insights that guide our optimization strategy.
Full Bio →


