SKUHelm

ACP product feed fields

The ACP product feed, field by field

Every field in OpenAI's product feed spec: which are required, which are optional, what format each one wants and where small shops usually go wrong.

Checked against the sources on 7 October 20267 min read

A product feed is a file that lists what you sell, one product or variant per row, in a fixed shape. OpenAI publishes the shape it wants for ChatGPT shopping. This guide goes through it field by field, in plain words, so you know what each one is for before you try to fill it in.

The spec is the source of truth, and it can change. Everything here was checked against it on the date at the top of the page. If you see a mismatch, trust OpenAI's page.

The nine required fields

Every row needs these. Leave one out and the row is not valid.

Here is what each one asks for in practice.

  • item_id a stable ID, unique for every item or variant in your feed. Keep it as text, so leading zeros survive. Do not regenerate it on each export, or the same product looks new every time.
  • title the product name, 150 characters at most. Include the variant when there is one, such as Linen apron, Sage.
  • description factual plain text, 5,000 characters at most. No HTML.
  • url a public web page for this item that does not move around.
  • brand the brand as shown on the product page. Placeholders are not accepted. If you make what you sell, your shop name is usually fine.
  • seller_name the name of whoever is selling. Shop platforms rarely export this, so most shops have to add it.
  • image_url a direct link to a JPEG or PNG that anyone can open without logging in.
  • availability one of in_stock, out_of_stock, pre_order, backorder or unknown.
  • price an amount and a currency code, like 79.99 USD.

Writing the price

The spec wants a decimal amount in major units, a space and an uppercase three-letter currency code. So 24.00 GBP, not £24 and not 2400. Prices must be positive, with a decimal point and no thousands separators. 1,299.00 GBP is wrong. 1299.00 GBP is right.

If you sell at a reduced price, keep price as the full price and put the lower figure in sale_price. The sale price has to be above zero, below the price, and in the same currency. When a sale starts or ends, update the feed.

Availability values

Exactly five values are allowed. Free text such as Ships soon is rejected.

  • in_stock: you can ship it now.
  • out_of_stock: you cannot.
  • pre_order: offered before its release.
  • backorder: temporarily waiting on stock.
  • unknown: you genuinely do not know. Use sparingly.

Variants and identity

If a product comes in sizes or colours, each option is its own row. The rows share a group_id, carry listing_has_variations set to true, and describe themselves in variant_dict. Our guide on variants goes deeper. For identity, add gtin, the 8, 12, 13 or 14 digit barcode with a valid check digit, and mpn if the maker gave you a part number. Both are optional in the spec text we checked.

Fields that help but are not required

  • condition new, refurbished or used.
  • product_category a path from broad to specific, like Home > Kitchen > Mugs.
  • additional_image_urls more images.
  • material, colour, size, gender, age_group: plain attributes. Colour should match the image.
  • weight with item_weight_unit: g, kg, oz or lb.
  • shipping_price zero or more, in the same currency as price. If you leave it out, shipping cost is treated as unknown.
  • accepts_returns, return_deadline_in_days and return_policy: your returns rules and a link to the page.
  • seller_url your storefront address.
  • review_count and star_rating: only if you have real ones.

Switches for search and checkout

is_eligible_search defaults to true. Set it to false to take a product out of search. For Instant Checkout, the spec also has is_eligible_checkout, plus links to your privacy policy and terms of service. Those are only needed if you are offering checkout, which has its own requirements. See our guide for small merchants.

What the file looks like

OpenAI's own format is JSONL: one complete product per line. Here is an example with made-up data.

jsonl
{"item_id":"APRON-SAGE","title":"Linen apron, Sage","description":"A hard-wearing linen apron with two front pockets and an adjustable neck strap.","url":"https://example-shop.com/products/linen-apron?variant=1","brand":"Example Shop","seller_name":"Example Shop Ltd","image_url":"https://example-shop.com/img/apron-sage.jpg","availability":"in_stock","price":"34.00 GBP"}
{"item_id":"MUG-WHITE","title":"Stoneware mug","description":"A 350ml stoneware mug, dishwasher safe.","url":"https://example-shop.com/products/mug","brand":"Example Shop","seller_name":"Example Shop Ltd","image_url":"https://example-shop.com/img/mug.jpg","availability":"out_of_stock","price":"18.00 GBP","sale_price":"15.00 GBP"}

File formats

The spec names JSONL as the OpenAI format. It also accepts a Google-compatible set (CSV, TSV and gzipped versions) after confirmation, all in UTF-8. It says plainly that JSON, XML, RSS, Atom and spreadsheets are not supported. The upload guide adds Parquet and compressed JSONL and CSV. So do not try to send a .xlsx file, and check which format your onboarding contact wants.

Common slips by field

After checking a lot of catalogues, the same few slips come up. Item IDs that change on every export. Titles stuffed with keywords until they pass 150 characters. Descriptions pasted straight from a theme, tags and all. Product links that go to a collection page instead of the item. Brand left empty on handmade goods. A seller name that is simply not there, because no shop export includes one.

Most of these are fixable in minutes once you know to look. The seller name and brand are the two to do first, because they affect every row and you only have to write them once.

Spreading the work

It helps to split the fields by where the answer lives. Some come from the shop and change often: price, availability, stock. Some come from the product and change rarely: title, description, images, barcode. Some belong to the business and almost never change: seller name, brand fallback, return policy, country. Treat them differently. Fix the business ones once, fix the product ones at the source, and let the shop supply the fast-moving ones on every sync.

Run your catalogue through the same checks and see which fields are missing.

Check my catalogue

Questions

Which fields are required?

Nine: item_id, title, description, url, brand, seller_name, image_url, availability and price. Variants add three more, and checkout adds policy links.

Can I leave brand blank if I make my own products?

Not blank, and not a placeholder. Use your shop name or the name your products are sold under.

Does the spec accept a CSV?

JSONL is the OpenAI format. A Google-compatible CSV is accepted too, with confirmation. Check the spec for the current wording.

Do I need a GTIN?

The spec treats it as optional, and it must be a real barcode with a valid check digit if you send one. A wrong GTIN is worse than none.

Where does SKUHelm fit?

It reads your catalogue, checks every row against these rules, lets you fill store-wide fields once, and hosts the feed file. You still apply to OpenAI yourself.

Sources