---
title: "Agent Access to Fume"
description: "How an AI agent reads fume.finance: markdown content negotiation, llms.txt, the sitemap, raw-markdown URLs, and what a 404 tells you."
canonical: "https://www.fume.finance/docs/developers/agent-access"
---

# Agent Access to Fume (/docs/developers/agent-access)



Fume is an AI company, so this site is built to be read by programs as well as people. Nothing here requires a key, a crawl allowance, or a scraper.

## Ask for markdown, get markdown [#ask-for-markdown-get-markdown]

Every documentation page and every canonical marketing page has a markdown twin. Two ways to reach it:

**Content negotiation.** Send `Accept: text/markdown` to the canonical URL:

```bash
curl -sH "Accept: text/markdown" https://www.fume.finance/docs/ai-agents
```

**An explicit URL.** Append `.mdx` to any `/docs` path, or use the raw route directly:

```bash
curl -s https://www.fume.finance/docs/ai-agents.mdx
curl -s https://www.fume.finance/llms.mdx/marketing/home/content.md
```

Both representations carry `Vary: Accept`, so a shared cache between you and us will not hand you the wrong one.

## Bulk ingestion [#bulk-ingestion]

* [`/llms.txt`](https://www.fume.finance/llms.txt) — an annotated index of the site: what Fume does, the key pages, and where the machine-readable content lives. Start here.
* [`/llms-full.txt`](https://www.fume.finance/llms-full.txt) — every marketing page, documentation page and blog post concatenated into one markdown file. One request, whole corpus.
* [`/sitemap.xml`](https://www.fume.finance/sitemap.xml) — every canonical URL, with real content dates.

Investor-only pages are excluded from both `llms-full.txt` and search indexing by policy. They are reachable by link, and marked `noindex`.

## Structured data [#structured-data]

Every page carries schema.org JSON-LD in the server-rendered HTML, not injected after hydration — so it is there with JavaScript disabled. The home page declares the `Organization` (including postal address and contact point), the `WebSite`, and the `SoftwareApplication`.

You do not have to crawl the pages to collect it. `robots.txt` carries a `Schemamap:` line pointing at [`/schemamap.xml`](https://www.fume.finance/schemamap.xml), which indexes three [Schema Feeds](https://github.com/nlweb-ai/website/blob/main/SCHEMA_SPEC.md) — one JSON-LD object per line:

```bash
curl -s https://www.fume.finance/schema-feeds/registry.jsonl    # every fund, as FinancialProduct
curl -s https://www.fume.finance/schema-feeds/providers.jsonl   # every provider, as Organization
curl -s https://www.fume.finance/schema-feeds/blog.jsonl        # every article, as Article
```

Each object is the same node the detail page embeds, `@id` included, so a feed entry and a page entry resolve to one entity rather than two.

## Ask a question in words [#ask-a-question-in-words]

`/ask` speaks [NLWeb](https://github.com/nlweb-ai/NLWeb) over the documentation: a natural-language query in, ranked pages out as NLWeb results, each with a schema.org object attached.

```bash
curl -s "https://www.fume.finance/ask?query=how+does+Fume+calculate+NAV"
```

`GET` and `POST` both work, and the optional arguments are the protocol's own — `site`, `prev`, `decontextualized_query`, `query_id`, `mode`. Ask for Server-Sent Events with `streaming=true`, `Accept: text/event-stream` or `Prefer: streaming`, and the same answer arrives as `start`, `result` and `complete` frames. `mode` is accepted but always answered as `list`: this endpoint retrieves and ranks pages, it does not run a model over them, and the response says so rather than pretending otherwise.

## Talk to the agent (A2A) [#talk-to-the-agent-a2a]

The same documentation search answers [Agent2Agent](https://a2a-protocol.org/latest/specification/) v0.3.0. The card is at the path the spec fixes, [`/.well-known/agent-card.json`](https://www.fume.finance/.well-known/agent-card.json), and names one skill, one transport and no credential:

```bash
curl -s https://www.fume.finance/.well-known/agent-card.json
```

Calls are JSON-RPC 2.0 to [`/a2a`](https://www.fume.finance/a2a):

```bash
curl -s https://www.fume.finance/a2a \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"message/send","params":{"message":{"role":"user","messageId":"1","parts":[{"kind":"text","text":"How does Fume calculate NAV for a tokenized fund?"}]}}}'
```

The reply is a Message, not a Task: the search finishes inside the request, so there is nothing to poll and nothing to cancel. It carries a text part a person can read and a data part with the same hits as fields, each with the URL it came from. `message/stream` and the `tasks/*` family answer `-32004 UnsupportedOperation` rather than pretending — the card declares `streaming`, `pushNotifications` and `stateTransitionHistory` all false. A `GET` on `/a2a` returns the endpoint's own facts and a ready-to-send example.

## Catalog data as JSON [#catalog-data-as-json]

Two catalogs are published as JSON rather than only as HTML:

```bash
curl -s https://www.fume.finance/api/v1/registry/funds
curl -s https://www.fume.finance/api/v1/fund-builder/providers
```

See the [Fume API reference](/docs/developers/api-reference), or read [`/openapi.json`](https://www.fume.finance/openapi.json) directly.

## When you guess wrong [#when-you-guess-wrong]

A URL that does not exist returns a real `404`, and the body tells you where to go instead — as HTML for a browser, and as markdown when you ask for it:

```bash
curl -sH "Accept: text/markdown" https://www.fume.finance/does-not-exist
```

Under `/api`, an unknown path returns the same JSON error envelope every other endpoint uses, with `code: "unknown_endpoint"` and a `docs` field pointing at the specification.

Paths that moved are permanently redirected, so a 404 means the path was never valid — not that you missed a migration.

## Crawling [#crawling]

`robots.txt` allows every major AI crawler by name (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, CCBot and others) across the whole site, and allows the public read endpoints under `/api`. The documented endpoints are limited to 120 requests per 60 seconds per client address, and every response carries `RateLimit`, `RateLimit-Policy` and the `X-RateLimit-*` headers saying where you stand; over the limit an endpoint answers `429` with `Retry-After`. The read endpoints are edge-cached for an hour, so polling faster than that returns cached data anyway.

Questions, or something you need that is not published? Email `info@fume.finance`.
