---
title: "Offer content machines can read · Agent Wranglers"
url: https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/machine-readable-formats
id: AGT-59
level: Recommended
updated: 2026-10-27
build: a2a6bdfed830
tokens: 939
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Offer content machines can read

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Ready for AI agents](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-27.

- ID: AGT-59
- Level: Recommended
- Chapter: [Ready for AI agents](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents.md)
- Rule: Offer the site's content as a sitemap, feeds, Markdown and JSON-LD.
- Check: A test reads the page list. Every public page appears in the sitemap and has a Markdown copy and JSON-LD in its HTML, and every feed entry is a listed page. Any data file over 100 KB accepts a filter that cuts the answer below 100 KB. Every record has an ID that no other record shares.
- How: Build the sitemap, feeds, Markdown and JSON-LD from one page list, so they always agree. Keep every format stating the same facts, as [Showing agents a different page than people](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/same-content-for-agents.md) says. An agent pays for every byte it reads, so let it take only what it needs from a large data file. Accept filters and a field list in the query string, such as `?level=Required&fields=name,url`. Answer an unknown filter value with a 400 that lists the valid ones. Give each record a stable ID and a revision that changes with its content. Then an agent that cached a record can tell when it changed. When a filter also keeps items that have no value for it, say so in the answer. Otherwise an agent reads those items as matches.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
const pages = [{ path: '/', title: 'Home' }, { path: '/services', title: 'Services' }];
const sitemap = pages.map(p => `<url><loc>https://example.com${p.path}</loc></url>`).join('');
const llms = pages.map(p => `- [${p.title}](https://example.com${p.path}.md)`).join('\n');
```

### Python example

```python
pages = [{"path": "/", "title": "Home"}, {"path": "/services", "title": "Services"}]
sitemap = "".join(f"<url><loc>https://example.com{p['path']}</loc></url>" for p in pages)
llms = "\n".join(f"- [{p['title']}](https://example.com{p['path']}.md)" for p in pages)
```

## Sources

- [RFC 4287 (The Atom Syndication Format)](https://www.rfc-editor.org/rfc/rfc4287)
- [W3C JSON-LD 1.1](https://www.w3.org/TR/json-ld11/)

## Related rules

- AGT-51 [Showing agents a different page than people](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/same-content-for-agents.md) in Agents as users
- SEO-12 [Link related pages both ways](https://agentwranglers.se/playbook/seo/site-structure/two-way-related-links.md) in SEO

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/machine-readable-formats">Agent Wranglers agents as users playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Publish each page's data as a file](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/structured-data-for-agents.md)
- Next: [Advertise agent files in headers](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents/link-headers.md)
- [Ready for AI agents](https://agentwranglers.se/playbook/agents-as-users/ready-for-ai-agents.md)
