---
title: "How to make your product catalog visible to AI assistants"
description: "How to make products visible in ChatGPT and AI assistants: ACP feed fields, format and cadence, Medusa field mapping, schema.org markup, and llms.txt."
url: https://medusajs.com/kb/agentic-commerce/product-feeds-for-ai-agents
last_updated: 2026-10-29T06:55:50Z
topic: "agentic-commerce"
type: "how-to"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md"
  - "https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md"
  - "https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md"
sources:
  - "https://developers.openai.com/commerce/specs/file-upload/products"
  - "https://developers.openai.com/commerce/specs/file-upload/overview"
  - "https://developers.openai.com/commerce/guides/get-started"
  - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce"
  - "https://developers.google.com/merchant/ucp"
  - "https://schema.org/Product"
  - "https://llmstxt.org/"
  - "https://docs.medusajs.com/resources/storefront-development/publishable-api-keys"
  - "https://docs.medusajs.com/api/store"
---

# How to make your product catalog visible to AI assistants

> To make products visible in ChatGPT, send OpenAI a product feed that follows its Agentic Commerce Protocol schema: nine required fields per variant, uploaded as a full snapshot at least daily. Add schema.org Product markup and agent-readable pages for other assistants. Medusa has an official guide that builds the feed with a workflow and scheduled job.

## How do AI assistants read a product catalog?

AI assistants read a store's catalog through three channels: product feeds sent to the AI platform, structured data on product pages, and APIs or agent-readable files they call directly. ChatGPT shopping relies on a product feed. Assistants that browse the web also read schema.org markup and Markdown, so a visible catalog covers all three.

| Channel | What the assistant reads | Medusa status |
| --- | --- | --- |
| ChatGPT product feed (ACP) | A full catalog snapshot you upload to OpenAI | Official guide |
| Google Merchant Center shopping feeds | The feeds Google's UCP page says merchants can reuse | Custom |
| schema.org Product markup | JSON-LD on storefront product pages | Custom |
| llms.txt and Markdown pages | Agent-friendly text versions of your pages | Custom |
| Store API product search | GET /store/products with a search term | Native |

## What fields does the ChatGPT product feed need?

OpenAI's [product file schema](https://developers.openai.com/commerce/specs/file-upload/products) requires nine fields for every item or variant: `item_id`, `title`, `description`, `url`, `brand`, `seller_name`, `image_url`, `availability`, and `price`. Availability must be one of `in_stock`, `out_of_stock`, `pre_order`, `backorder`, or `unknown`. Price uses major currency units with the currency code, such as `79.99 USD`.

Variants share a `group_id` and set `listing_has_variations` and `variant_dict`. To appear in Instant Checkout, an item also needs `is_eligible_checkout`, `seller_privacy_policy`, and `seller_tos`.

## How often and in what format do you send the feed?

OpenAI's [file upload guide](https://developers.openai.com/commerce/specs/file-upload/overview) sets these delivery rules:

- Push full catalog snapshots over SFTP.
- Use parquet (preferred), or jsonl.gz, csv.gz, or tsv.gz, in UTF-8.
- Upload at least once a day, and overwrite the same file names each time.
- Keep shards under about 500,000 items and 500MB.
- A product missing from later snapshots expires within 14 days. Set `is_eligible_search=false` to hide it sooner.

Feed onboarding is open to approved partners, who [apply through OpenAI](https://developers.openai.com/commerce/guides/get-started).

## How do Medusa fields map to ACP feed fields?

This mapping applies OpenAI's current product file schema to the Medusa data that Medusa's [ACP guide](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce) reads, one row per variant. The guide itself writes older field names (link, image_link, item_group_id, separate color and size), so rename them for OpenAI's format:

| ACP field | Medusa source |
| --- | --- |
| item_id | Variant id |
| group_id | Product id |
| title | Product title; OpenAI asks you to name the variant too |
| description | Product description |
| url | Storefront URL plus product handle |
| image_url | Product thumbnail |
| price | Variant calculated price in the region's currency |
| availability | Variant inventory, or in_stock when inventory isn't managed |
| variant_dict | Variant option values, such as color and size |
| gtin | Variant upc |
| brand, seller_name | Not in core; set from config, metadata, or a custom module |

## How do you generate the feed from Medusa?

In Medusa, you generate the feed in a [workflow](https://docs.medusajs.com/learn/fundamentals/workflows) that reads products, prices, and stock with [Query](https://docs.medusajs.com/learn/fundamentals/query), then run it from a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs). This job runs the guide's `sendProductFeedWorkflow` once a day:

```ts
import { MedusaContainer } from "@medusajs/framework/types"
import sendProductFeedWorkflow from "../workflows/send-product-feed"

export default async function syncProductFeed(container: MedusaContainer) {
  await sendProductFeedWorkflow(container).run({
    input: { currency_code: "usd", country_code: "us" },
  })
}

export const config = {
  name: "sync-product-feed",
  schedule: "0 2 * * *",
}
```

The guide writes the feed as XML on a 15-minute schedule and logs it instead of uploading it. Change the output to a format OpenAI's current spec accepts, and add the SFTP upload once you have access.

## How do you make product pages readable by agents?

Product pages become readable to web-browsing assistants through [schema.org Product](https://schema.org/Product) markup. Add a JSON-LD block with `name`, `description`, `image`, `sku` or `gtin`, `brand`, and an `offers` object with `price`, `priceCurrency`, and `availability`. Medusa storefronts are separate apps, so you add this in your product page using data from the Store API.

[llms.txt](https://llmstxt.org/) is a proposed Markdown file at a site's root that lists the pages an agent should read. The same proposal suggests a Markdown copy of each page at the page URL plus `.md`. Medusa does not generate either for storefronts; you add them in the storefront.

## How can agents query a Medusa catalog directly?

Agents that call APIs can search a Medusa catalog through the Store API. `GET /store/products` accepts a `q` search term and needs an `x-publishable-api-key` header, which scopes results to a sales channel. See [List Products](https://docs.medusajs.com/resources/storefront-development/products/list) and [publishable API keys](https://docs.medusajs.com/resources/storefront-development/publishable-api-keys).

## When is Medusa not the right choice?

If you only need a ChatGPT feed and have no developer, a hosted platform or a feed management tool takes less work than building the feed in code. Medusa fits when you want the feed generated from your own product, price, and inventory data.

## Common questions

### What format does the ChatGPT product feed use?

OpenAI's file upload spec prefers parquet and also accepts jsonl.gz, csv.gz, and tsv.gz, delivered over SFTP as a full catalog snapshot. OpenAI recommends uploading at least once a day.

### Can anyone submit a product feed to ChatGPT?

No. OpenAI states that product feed onboarding in ChatGPT is available to approved partners, who apply through OpenAI's merchant form.

### Does Medusa add schema.org markup to product pages?

Medusa storefronts are separate applications, so you add schema.org Product JSON-LD in your storefront's product page, using product, price, and stock data from Medusa's Store API.

### How do I remove a product from the ChatGPT feed?

Set is_eligible_search to false, or leave the product out of later full snapshots. OpenAI keeps a missing product's last record for up to 14 days before it expires.

## Documentation

- [Implement Agentic Commerce (ChatGPT Instant Checkout) Specifications](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/agentic-commerce)
- [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs)
- [Query](https://docs.medusajs.com/learn/fundamentals/query)
- [Show Products in Storefront](https://docs.medusajs.com/resources/storefront-development/products/list)

## Related

- [How to let ChatGPT and other AI agents buy from your store](https://medusajs.com/kb/agentic-commerce/sell-through-ai-agents.md)
- [ACP vs UCP vs AP2 vs MCP: agentic commerce protocols explained](https://medusajs.com/kb/agentic-commerce/agentic-commerce-protocols.md)
- [How to build an AI shopping assistant on your product catalog](https://medusajs.com/kb/agentic-commerce/build-ai-shopping-assistant.md)
