Agent Access to Fume
How an AI agent reads fume.finance: markdown content negotiation, llms.txt, the sitemap, raw-markdown URLs, and what a 404 tells you.
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
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:
curl -sH "Accept: text/markdown" https://www.fume.finance/docs/ai-agentsAn explicit URL. Append .mdx to any /docs path, or use the raw route directly:
curl -s https://www.fume.finance/docs/ai-agents.mdx
curl -s https://www.fume.finance/llms.mdx/marketing/home/content.mdBoth representations carry Vary: Accept, so a shared cache between you and us will not hand you the wrong one.
Bulk ingestion
/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β every marketing page, documentation page and blog post concatenated into one markdown file. One request, whole corpus./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
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, which indexes three Schema Feeds β one JSON-LD object per line:
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 ArticleEach 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 speaks NLWeb over the documentation: a natural-language query in, ranked pages out as NLWeb results, each with a schema.org object attached.
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)
The same documentation search answers Agent2Agent v0.3.0. The card is at the path the spec fixes, /.well-known/agent-card.json, and names one skill, one transport and no credential:
curl -s https://www.fume.finance/.well-known/agent-card.jsonCalls are JSON-RPC 2.0 to /a2a:
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
Two catalogs are published as JSON rather than only as HTML:
curl -s https://www.fume.finance/api/v1/registry/funds
curl -s https://www.fume.finance/api/v1/fund-builder/providersSee the Fume API reference, or read /openapi.json directly.
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:
curl -sH "Accept: text/markdown" https://www.fume.finance/does-not-existUnder /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
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.
API Versioning and Deprecation Policy
What Fume guarantees about the stability of its public API: what is versioned, what counts as a breaking change, how much notice a retirement gets, and the headers that announce one.
π’ Company
Who is behind Fume, and how we handle security and your data across products.