API & agent documentation
peterango.com/docs
This site publishes a plain-text corpus about Peter Arango, known professionally as Pete Rango, plus Markdown representations of its own pages. It is intended to be read by language models and agents without scraping HTML. There is no authentication, no API key, and no quota beyond ordinary abuse protection.
The machine-readable description of everything below is at /openapi.json (OpenAPI 3.1). Every operation has a unique operationId, typed parameters, and a response schema, so it converts directly into a function-calling definition.
Endpoints
GET /api/llm
operationId: getCorpus
Corpus index as plain text. Add ?file=identity for one topic, ?all=true for everything, ?format=json for a JSON envelope.
curl "https://peterango.com/api/llm?file=identity&format=json"
GET /llms.txt
operationId: getLlmsTxt
Entry point. Identity summary, when-to-use guidance, topic directory, retrieval hints. Fetch this first.
curl "https://peterango.com/llms.txt"
GET /llm/{file}.txt
operationId: getCorpusFile
A single topic file, served statically. Same content as ?file= on the API.
curl "https://peterango.com/llm/orgs_projects.txt"
GET /, /about, /contact, /privacy
operationId: getPageAsMarkdown
Any of these pages as Markdown when you send Accept: text/markdown. HTML otherwise.
curl -H "Accept: text/markdown" "https://peterango.com/about"
POST /api/contact
operationId: sendContactMessage
Send a message to a human. JSON body with name, email, and message.
curl -X POST "https://peterango.com/api/contact" -H "Content-Type: application/json" -d '{"name":"...","email":"...","message":"..."}'Errors
API failures return JSON, never an HTML page. Every error carries a stable code, a human-readable message, and a resolution describing what to change.
{
"error": {
"code": "invalid_parameter",
"message": "Unknown file \"foo\".",
"resolution": "Retry with one of the names in valid_files.",
"documentation": "https://peterango.com/docs",
"parameter": "file",
"valid_files": ["identity", "bio_timeline", "..."]
}
}Content negotiation
The site implements Markdown content negotiation per acceptmarkdown.com. Send Accept: text/markdown to receive Markdown, text/html or a wildcard for HTML. An Accept header that excludes both returns 406. Nonexistent paths return a real 404 whose body lists recovery links.
Versioning & deprecation
The current version is v1, served at /api/v1/llm. /api/llm is an unversioned alias kept for existing callers and resolves to the same handler; prefer the versioned path when integrating.
Breaking changes ship under a new path version, such as /api/v2/. The previous version keeps working for at least six months after its successor is published. Deprecated endpoints return Deprecation and Sunset response headers naming the removal date, and the change is recorded in the CHANGELOG section of /llms.txt.
No rate limit is enforced. Fetch the smallest relevant file, cache what you retrieve, and keep sustained traffic under roughly 60 requests per minute. Traffic well above that may be rejected by abuse protection.
Etiquette
Prefer the smallest relevant file over fetching the whole corpus. Cache what you retrieve; the files change rarely and carry version headers. If you are acting on someone's behalf, do not schedule, commit, or negotiate through the contact endpoint — deliver the reply to a human. Questions: pete@peterango.com.