> ## Documentation Index
> Fetch the complete documentation index at: https://docs.attensira.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Product feed and llms.txt

> A public, read-only product.json and llms.txt built only from the Brand Book facts you confirmed and marked public: what is in them, where they are served, how fast an edit reaches them, and who can turn them on.

When someone asks an assistant what you cost or whether you work with their tools, the answer comes from whatever page it found. The product feed gives assistants, crawlers and agents one place to read those facts from you, in a shape they can parse: a `product.json` and an `llms.txt`.

Both are built from your [Brand Book](https://docs.attensira.com/brand-book/entity-sync.md). Nothing else goes in them.

## What can be in the feed

A fact is in the feed only when all three hold:

1. It is one of the facts below. Anything else in your Brand Book, such as your ideal customer, objections, values, outreach terms, postal address or notes on competitors, can never be published, even if a request asks for it.
2. You **confirmed** it. A value we drafted from your site is our guess, and it never goes out under your name.
3. You **marked it public**. Every fact starts private.

| Fact | Where it lives in the Brand Book | In the feed as |
| - | - | - |
| Name | On the web → Name | `brand.name` (required: the feed is not served without it) |
| One line | Positioning → One line | `brand.description` |
| Category | Positioning → Category | `brand.category` |
| Tagline | Brand → Tagline | `brand.tagline` |
| Logo URL | Brand → Logo URL | `brand.logo` |
| Founded | The company → Founded | `brand.founded` |
| Headquarters | The company → Headquarters | `brand.hq` |
| Same as | On the web → Same as | `brand.same_as` |
| Social profiles | On the web → Social profiles | `brand.socials` |
| What we sell | What you sell → What we sell | `products` |
| How it is priced | What you sell → How it is priced | `pricing_summary` |
| Plans and prices | Public product facts → Plans and prices | `plans` |
| What we plug into | What you sell → What we plug into | `integrations` |
| Compliance | Public product facts → Compliance | `compliance` |
| Policies | Public product facts → Policies | `policies` |
| Approved answers | Public product facts → Approved answers | `faq` |
| Markets | Markets and languages → Markets you sell into | `markets` |
| Languages | Markets and languages → Languages you publish in | `languages` |
| Sign-up link | Public product facts → Sign-up link | `signup_url` |

Every value in the feed carries a `fact_id`: the Brand Book fact it came from. An assistant or agent can trace any answer it gives back to it.

### Writing plans, policies and answers

**Plans and prices** take one plan per line: the name, a colon, then the price, currency and period, then the trial and limits, separated by semicolons.

```text theme={null}
Free: free; 1 seat
Pro: 49 USD / month; 14-day trial; 3 seats, 500 questions
Team: €490 per year
Enterprise: talk to us
```

A price needs a currency: an ISO code (`USD`, `SEK`) or `€` or `£`. `$` alone is read as US dollars, so write `$49 CAD` or `49 CAD` for any other dollar. Write thousands with a comma (`$1,000/mo`); a comma before one or two digits is a decimal comma (`€9,50`). The period is month, year, week, day or one-time (`/ month`, `per year`, `annually`). A price we cannot read is never guessed: the plan goes out with `price: null`, and the line as you wrote it is only in `text`.

**Policies** take one per line: `security`, `refunds`, `data`, `privacy` or `terms`, a colon, then a link or one sentence.

**Approved answers** take one per line: the question, a vertical bar, then the answer you approve being quoted. For example, `Does it work with Shopify? | Yes, through the Shopify app.`

## What llms.txt says

`llms.txt` is the same facts as `product.json`, written as plain Markdown for a model to read: your name as the title, your one line as a quote, then tagline, category, founded, headquarters and pricing, then a list section for each of products, plans, integrations, compliance, policies, approved answers, markets, languages and links. A section with nothing public in it is left out. It ends with the date of the newest fact in it. It carries no `fact_id`s; `product.json` is where to trace a value.

```markdown theme={null}
# Acme

> Acme keeps support teams answering in minutes.

Tagline: Answers, fast.
Category: Customer support software
Pricing: Per seat, billed monthly or yearly.

## Plans

- Free: free; 1 seat
- Pro: 49 USD per month; 14-day trial; 3 seats, 500 questions

## FAQ

- Does it work with Shopify? Yes, through the Shopify app.

## Links

- [Product feed (JSON)](https://webapp.attensira.com/public/brands/acme/product.json)
- [Sign up](https://acme.example/signup)

Updated 2026-10-20.
```

Both files are served from our address, below. Attensira does not put them on your own site. To have `yoursite.com/llms.txt` answer with it, redirect that path to your feed's `llms.txt`, so it stays current; a copy you paste in goes stale at your next edit.

## Where it is served

Once the feed is on, under the slug you chose:

| Address | What it is |
| - | - |
| `https://webapp.attensira.com/public/brands/{slug}/product.json` | The feed, as JSON. |
| `https://webapp.attensira.com/public/brands/{slug}/llms.txt` | The same facts as an [llms.txt](https://llmstxt.org). |
| `https://webapp.attensira.com/public/schemas/product.v1.json` | The feed's JSON Schema (draft 2020-12). Every feed validates against it. |

These need no key and are readable from any origin. Reads of brand feeds are limited per client IP, across `product.json` and `llms.txt` together; past the limit you get `429` with `Retry-After`. Responses carry an `ETag` and `Cache-Control: public, max-age=60, must-revalidate`, and an unchanged feed answers `If-None-Match` with `304`.

An unknown slug answers `404`. So does a feed that is on but has nothing to serve yet, for example because the name is not marked public. A brand that turned its feed off answers `410`, and nothing it published before is served.

## How fast an edit reaches it

When you confirm an edit to a fact the feed carries, the feed is rebuilt straight away. Every 15 minutes, a sweep also rebuilds every live feed from the Brand Book as it stands, so a fact that stopped being confirmed, or any edit the first rebuild missed, is out within one sweep. Our servers and caches in front of the feed may each keep a copy for up to a minute, so allow two.

`version` counts revisions: it goes up by one each time a rebuild finds the content changed, and a sweep that finds nothing new leaves it as it is. `updated_at` is when the newest fact in the feed was confirmed.

Marking a fact private, or turning the feed off, rebuilds the feed at once, and readers stop getting the old copy within two minutes.

## Turning it on

Turning the feed on, marking a fact public and choosing or changing the slug are a person's decisions, made in the app, whether the feed is on or off. An API key or an MCP connection can read the settings and **publish less**: turn the feed off or mark facts private. A request that would publish more answers `403` with code `forbidden`, and nothing changes.

The slug is 3 to 40 lower-case letters, digits or hyphens, starting and ending with a letter or digit. One slug belongs to one brand; a slug another brand holds answers `409`. If the settings changed while your change was being saved, it answers `409` with code `state_conflict` and nothing changes: read them again and resend.

## Over the API and MCP

The settings routes are not on `api.attensira.com` yet: send them to `https://webapp.attensira.com` with the same key. That host answers errors in its [own envelope](https://docs.attensira.com/api/errors.md#errors-from-the-webapp-host).

| Door | Call |
| - | - |
| REST | `GET /v1/agent-readiness?workspace=` (read scope) |
| REST | `PATCH /v1/agent-readiness?workspace=` with `{enabled?, slug?, public?}` (configure scope; publishes less only) |
| MCP | `get(attensira://{workspace}/agent_readiness)` |

The status says whether the feed is `off`, `live` or `incomplete` (with a `reason`), its slug, URLs and `version`, and, for every fact that may be published, whether it is marked public, confirmed and in the feed. It also carries `signup_check`: the weekly [signup check](https://docs.attensira.com/agent-readiness/signup-check.md) of your own site. `public` in a change is the full list of fact refs to publish, such as `["entity/public-name", "listing/plans"]`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.