Welcome, humans and agents. anuran.dev by
Anuran Roy exposes a small, public, read-only JSON API for
posts, projects, and papers. No signup, no API keys, no OAuth. If you can
curl, you can use it.
Quickstart (60 seconds)
# 1. List latest blog posts
curl -s https://anuran.dev/api/v1/posts | head -c 500
# 2. List projects
curl -s https://anuran.dev/api/v1/projects | head -c 500
# 3. Read the OpenAPI spec
curl -s https://anuran.dev/openapi.json | head -c 500
# 4. Machine-readable site guide
curl -s https://anuran.dev/llms.txt | head -n 40
API keys and authentication
Authentication: none required. All /api/v1/*
endpoints are GET-only and public. Rate limits are standard
CDN fair-use only. Do not send Authorization headers,
credentials, or secrets — they are ignored. If you need private data, you
are in the wrong place; see /contact.
Documentation
- /docs — full API documentation with auth, endpoints, and examples
- /openapi.json — OpenAPI 3.1 spec (operationIds, typed schemas)
- /.well-known/api-catalog — RFC 9727 API catalog
- /llms.txt — site guide for LLMs with when-to-use
- /sitemap-index.xml — canonical URL list
Official CLI
Official CLI: anuran-dev on npm.
It wraps the read-only API so agents and developers can script without
hand-rolling fetch calls.
# Run without installing
npx -y anuran-dev --help
npx -y anuran-dev posts --limit 5
npx -y anuran-dev projects --json
# Or install globally
npm install -g anuran-dev
anuran-dev --help
# Sources
# npm: https://www.npmjs.com/package/anuran-dev
# repo: https://github.com/anuran-roy/portfolio/tree/main/packages/cli
See anuran-dev on npm and the GitHub repo.
Sandbox (no keys)
Sandbox = production, because everything is read-only. Try in your browser or terminal:
GET https://anuran.dev/api/v1/health— liveness + versionGET https://anuran.dev/api/v1/posts?limit=2— two latest postsGET https://anuran.dev/api/v1/projects— projects indexGET https://anuran.dev/api/v1/papers— papers index
Errors are JSON (application/problem+json) with
code, message, and hint. Example:
GET /api/v1/posts?limit=9999 returns 400 with
{"code":"invalid_limit", ...}.
Markdown negotiation
Content pages support Accept: text/markdown per
acceptmarkdown.com. Negotiated responses use
Content-Type: text/markdown; charset=utf-8 and
Vary: Accept. Example:
curl -H "Accept: text/markdown" https://anuran.dev/about
# -> text/markdown body, Vary: Accept