The Tanfust catalog is readable by machines. Everything on this page is public, unauthenticated, and served from the CDN — no API key, no rate limit, no signup.
Content changes only when the site is deployed, so responses are safe to cache aggressively.
Catalog API
Base URL: https://www.tanfust.com/api/v1
The machine-readable description lives at /openapi.json (OpenAPI 3.1).
GET /api/v1/products— the full catalogGET /api/v1/products/{id}— one product, e.g.tanbaseGET /api/v1/categories— the seven categories, with product countsGET /api/v1/apps— the apps we operateGET /api/v1/posts— blog posts, newest firstGET /api/v1/posts/{slug}— one post, including its full markdown bodyGET /api/v1/health— deployment liveness
The catalog is small, so there's no pagination and no query filtering. Fetch
/products once and filter on category, tier, or tags yourself.
curl -s https://www.tanfust.com/api/v1/products \
| jq '.products[] | select(.category == "skills") | {id, name, price}'
Product responses omit two things on purpose: the fulfilment download link, and the preview source code shown on store pages. For the code, read the markdown representation of the product page.
Markdown instead of HTML
Send Accept: text/markdown to any content page and you get markdown back
instead of HTML. The response carries Content-Type: text/markdown, Vary: Accept,
and an x-markdown-tokens estimate.
curl -s -H 'Accept: text/markdown' https://www.tanfust.com/store/skills/supabase-auth-emails
Every markdown document is also directly addressable under /md/, if you'd rather
not rely on content negotiation. Both forms return byte-identical content:
curl -s https://www.tanfust.com/md/store/skills/supabase-auth-emails
Covered pages: the homepage, /store, /apps, /blog, each blog post, each
product page, this page, and the three legal pages.
x-markdown-tokensis an estimate, not an exact count. It's derived from the cl100k pre-tokenizer split, not a real BPE encoder — treat it as a budgeting hint, not a billing figure.
MCP server
There's a Model Context Protocol server at https://www.tanfust.com/api/mcp
speaking Streamable HTTP. It exposes read-only tools over the same data as the
REST API: search_products, get_product, list_categories, list_apps,
list_posts, and get_post.
Add it to Claude Code with:
claude mcp add --transport http tanfust https://www.tanfust.com/api/mcp
Its server card is at /api/mcp/server-card.
Discovery
- /llms.txt — index of everything here
- /.well-known/api-catalog — RFC 9727 catalog
- /.well-known/agent-skills/index.json — publishable agent skills
- /.well-known/ai-catalog.json — MCP server index
- /auth.md — what agents can and cannot do here
- /sitemap.xml — every indexable page
The homepage also returns Link headers pointing at the catalog, the OpenAPI
description, these docs, and the markdown alternate.
What agents can't do
Buying is human-in-the-loop by design. Checkout runs through Paddle, and product downloads are one-time signed links emailed to the buyer — there's no programmatic purchase or download path, and no API credential that would create one. /auth.md spells out the boundary.
Reuse
Our robots.txt declares Content-Signal: search=yes, ai-input=yes, ai-train=no.
Read us, cite us, ground answers in us — please don't use this content as
generative model training data.
Questions: hi@updates.tanfust.com.