product.json and an llms.txt.
Both are built from your Brand Book. Nothing else goes in them.
What can be in the feed
A fact is in the feed only when all three hold:- 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.
- You confirmed it. A value we drafted from your site is our guess, and it never goes out under your name.
- You marked it public. Every fact starts private.
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.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_ids; product.json is where to trace a value.
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:
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 answers403 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 onapi.attensira.com yet: send them to https://webapp.attensira.com with the same key. That host answers errors in its own envelope.
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 of your own site. public in a change is the full list of fact refs to publish, such as ["entity/public-name", "listing/plans"].