API documentation, quickstart guide, endpoint reference, and machine-readable resources for AI agents and developers.
Get started with the Shriraj Patil Portfolio API in under 30 seconds:
curl https://portfolio-shriraj.vercel.app/api/health
curl -H "Accept: text/markdown" https://portfolio-shriraj.vercel.app/
curl -X POST https://portfolio-shriraj.vercel.app/api/notify \
-H "Content-Type: application/json" \
-d '{"message": "Hello from an AI agent"}'
Full machine-readable API specification: OpenAPI 3.1 JSON | OpenAPI 3.1 YAML
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET | / | Portfolio homepage — supports Accept: text/markdown content negotiation | None |
GET | /api/health | API health check, version, and endpoint discovery | None |
POST | /api/notify | Dispatch visitor analytics notification to Telegram | None (CORS restricted) |
GET | /index.md | Full Markdown portfolio profile | None |
GET | /llms.txt | LLM context index (llmstxt.org standard) | None |
GET | /llms-full.txt | Comprehensive LLM context document | None |
GET | /openapi.json | OpenAPI 3.1 specification (JSON) | None |
GET | /sitemap.xml | XML sitemap | None |
The Shriraj Patil Portfolio API is fully public and unauthenticated. No API keys are required. All read endpoints are open to any client. The /api/notify endpoint is CORS-restricted to the portfolio origin.
The API follows semantic versioning. The current version is v1.0.0.
X-API-Version header.Deprecation: true header and a Sunset header with the retirement date, at least 90 days in advance.X-API-Version header and documented here.Deprecation: false header confirms this.All API endpoints include standard rate limit headers per RFC draft-ietf-httpapi-ratelimit-headers:
| Header | Description | Value |
|---|---|---|
RateLimit-Limit | Maximum requests per window | 60 |
RateLimit-Remaining | Remaining requests in current window | Dynamic |
RateLimit-Reset | Seconds until window resets | 60 |
Retry-After | Seconds to wait (returned on 429) | 60 |
If you receive a 429 Too Many Requests response, wait for the Retry-After duration before retrying.
All API errors return structured JSON with consistent fields:
{
"error": {
"code": "INVALID_REQUEST_BODY",
"message": "Missing required 'message' string field in request body.",
"status": 400,
"hint": "Provide a non-empty 'message' string in the JSON payload.",
"documentation_url": "https://portfolio-shriraj.vercel.app/developers"
}
}
The homepage (/) supports HTTP Accept header content negotiation per RFC 9110:
Accept: text/html — Returns the full interactive React portfolioAccept: text/markdown — Returns clean Markdown profile for LLM consumptionAccept: application/json — Returns 406 with supported types listAll responses include a Vary: Accept, Accept-Encoding header for correct caching.
All endpoints are live and testable without authentication. Use curl, Postman, or any HTTP client:
# Test JSON error handling
curl -s https://portfolio-shriraj.vercel.app/api/nonexistent | jq .
# Verify rate limit headers
curl -sI https://portfolio-shriraj.vercel.app/api/health | grep -i ratelimit
# Test content negotiation
curl -H "Accept: text/markdown" https://portfolio-shriraj.vercel.app/
For questions, feedback, or integration support: