API & agent documentation

Machine-readable entry points for arpitkhandelwal.com. Everything below is public, unauthenticated, and returns JSON. Agents should read llms.txt first for when-to-use guidance, then the OpenAPI document for callable operations.

Entry points

Endpoints

MethodPathOperationReturns
GET/api/profilegetProfileIdentity, location, contact address, profile links, stack
GET/api/availabilitygetAvailabilityBooking status, reply window, sprint lengths and types
GET/api/servicesgetServicesFocus areas, process, deliverables, terms, good and bad fits
GET/api/worklistWorkCase studies and the project archive
GET/api/faqlistFaqPublished questions and answers
POST/api/contactcreateSprintBriefDelivers a sprint brief; replies within 24 hours

Authentication

None. Every endpoint is public. The read endpoints are safe to call from an agent without any credential; POST /api/contact writes a message to a private inbox and should only be called when a user has explicitly asked to get in touch.

Response shape

Success responses are { "ok": true, "data": ... }. Failures are { "ok": false, "error": { "code", "message", "hint", "documentation" } } with an appropriate HTTP status. Branch on error.code, which is stable, rather than on the message text.

CodeMeaning
invalid_jsonThe request body could not be parsed as JSON.
validation_failedA field or query parameter was missing or malformed; see error.details.
method_not_allowedThe HTTP method is not supported on this path.
not_foundNo such API endpoint.
not_acceptableThe Accept header excluded every media type this resource can produce.
rate_limitedQuota exhausted; wait for Retry-After seconds.
delivery_not_configuredContact delivery is unavailable; email directly instead.
upstream_failureA downstream provider failed; retry once, then email directly.

Rate limits

Read endpoints allow 120 requests per 60 seconds per client. POST /api/contact allows 5 per 600 seconds. Every response carries RFC 9331 RateLimit and RateLimit-Policy headers, and a 429 additionally carries Retry-After in seconds. Self-throttle from those headers rather than retrying blindly.

Example

curl -s https://www.arpitkhandelwal.com/api/availability

curl -s -X POST https://www.arpitkhandelwal.com/api/contact \
  -H 'content-type: application/json' \
  -d '{"name":"Ada","email":"ada@example.com","message":"We need an MCP server for our internal tools in 4 weeks."}'

Markdown content negotiation

Every page route honours Accept: text/markdown and responds with Vary: Accept, per acceptmarkdown.com. The same content is reachable at the .md twin of any page path, for example /about.md. A request whose Accept header excludes both text/html and text/markdown receives a 406.

Start with llms.txt for when-to-use guidance, then openapi.json for callable operations.