All posts
Field notes

How I Structured a Product Feed an AI Agent Can Actually Read

A practical walk through the product feed I built for AI agents — the fields, the format, the freshness, and the one signal that matters most.

Last time I wrote about the first thing I got wrong: I treated agent data like a human feed, and a checkout broke in front of me. This post is the other half — what I actually built after that, and how I structure a product feed an agent can read without tripping.

No theory this time. Just the shape that worked.

Start from the agent's questions, not your database

My first version was a dump of my product table. Wrong instinct. An agent does not want your schema. It wants answers to a short, blunt list of questions.

So I started by writing the questions down:

  • What is this item, exactly?
  • Is it in stock right now?
  • What does it cost, and in what currency?
  • What variants exist (size, colour), and which are available?
  • Where can it ship, and by when?
  • Can it be bought right now — yes or no?

Then I built the feed to answer each one. Every field earns its place by answering a question an agent will actually ask. If a field answers none, it does not go in the agent feed. It can live on the marketing page instead.

The shape I landed on

Each product is a small, flat object. Plain facts, clear names, no cleverness. Something like this:

  • id — a stable identifier that never changes.
  • title — short and literal. Not the marketing headline.
  • price and currency — as numbers and a clear code, never "from $20".
  • availability — in_stock, out_of_stock, or limited. One of a fixed set, not free text.
  • variants — each with its own availability and price.
  • shipping — where it ships and a realistic time.
  • purchasable — a simple true/false. The single most important field.
  • updated_at — when this record was last checked against the real store.

Two of those did the heavy lifting: purchasable and updated_at. Everything else is detail. These two are the difference between a smooth buy and a broken one.

Fixed values beat free text

A small lesson that saved me a lot of pain: give the agent fixed choices, not prose.

"availability: limited" is something an agent can act on. "Only a few left, order soon!" is not — it is marketing noise dressed as data. So anywhere a field has a known set of answers, I use that set. The agent never has to guess what my words mean.

Freshness is a feature, not a chore

Here is the part most guides skip. A perfect feed that is an hour stale will still break a checkout. Agents act on what you told them, instantly, with no human to catch the mistake.

So I treat freshness as a first-class feature:

  • Every record carries updated_at.
  • Stock and price are checked against the live store often, not on a slow nightly job.
  • If I am not sure a fact is still true, I would rather mark the item not purchasable than let an agent promise it.

A smaller, honest feed beats a big, stale one every single time. I would rather show an agent 500 products I can stand behind than 5,000 I cannot.

How the agent gets the feed

The format matters less than people think, as long as it is machine-clean. I serve the feed as plain structured data (JSON), at a stable endpoint, and I also expose it as tools an agent can call through MCP — so an agent can either read the whole feed or ask "is item X purchasable right now?" and get a straight answer.

The checkout protocols (ACP, UCP) have their own feed shapes too, and I keep my core feed clean enough to map onto either without a rewrite. That is the same lesson I keep relearning: keep your own data independent, then translate to whatever protocol the customer brought.

The short version

If you are building a product feed for agents:

  1. Build it around the agent's questions, not your database.
  2. Use fixed values, not marketing words.
  3. Make purchasable and updated_at your two most important fields.
  4. Keep it fresh, and keep it honest — a smaller true feed wins.

This is exactly the kind of boring, load-bearing work we are building into Sarvex, because when the feed is right, everything above it gets easier. Get the feed wrong, and no protocol will save you.

Next time: what happened when I let an agent run checkout end to end.