Sreenitya Thatikunta Portfolio API Documentation
Endpoint-by-endpoint reference for the Sreenitya Thatikunta portfolio API, including errors, filters and markdown content negotiation.
Reference for the Sreenitya Thatikunta portfolio API — a public, read-only, unauthenticated JSON API over the content of https://www.sreenitya.in. Base URL: https://www.sreenitya.in/api. All responses are UTF-8 JSON with Access-Control-Allow-Origin: *. The machine-readable contract is the OpenAPI 3.0.3 document at https://www.sreenitya.in/openapi.json.
Conventions
- Integrate against the version-pinned base URL https://www.sreenitya.in/api/v1. https://www.sreenitya.in/api is an alias for the current major version and returns identical responses.
- Only GET, HEAD and OPTIONS are accepted. Any other method returns 405 with a JSON error.
- Every successful response is an object; collections are returned under a named key with a count alongside.
- Errors are JSON with error.code, error.message, error.hint, error.documentation_url and error.status.
- Responses are cached at the edge (Cache-Control: public, max-age=0, s-maxage=3600).
GET /api/profile
Returns the site owner's identity: name, headline, job title, affiliation, description, contact email, resume URL and social profiles.
curl -s https://www.sreenitya.in/api/profile
GET /api/skills
Returns categories, each with id, title and a skills array of strings.
GET /api/experience
Returns experience, an array of roles with id, company, role, startDate, endDate (ISO year-month) and highlights.
GET /api/projects
Returns projects. Optional query parameters: kind (research or mini) and tag (case-insensitive exact tag match). An unknown kind returns 400 with invalid_parameter.
curl -s "https://www.sreenitya.in/api/projects?tag=Diffusion"
GET /api/projects/{slug}
Returns a single project. Unknown slugs return 404 with project_not_found and a hint pointing at the collection endpoint.
GET /api/contact
Returns the public contact channels: email, contact form URL and social profiles.
Markdown content negotiation
Every HTML page on this site also exists as markdown. Send Accept: text/markdown and you receive the markdown variant; the response carries Vary: Accept, Accept-Encoding. You can also request the markdown file directly by appending .md to the path.
curl -sH 'Accept: text/markdown' https://www.sreenitya.in/
curl -s https://www.sreenitya.in/about.md
Versioning and deprecation
The API is versioned by major version in the URL path. The current version is 1.0.0, served at https://www.sreenitya.in/api/v1. Build against that URL: it will keep serving this exact contract. https://www.sreenitya.in/api is an alias that always resolves to the current major version, which means it can change under you when a new major ships.
A client can also pin the version with a request header instead of the path: send API-Version: v1 (Accept-Version is accepted as a synonym). A version this API does not serve is rejected with 400 unsupported_api_version rather than silently answered with different data. Every response states the version that served it in the API-Version response header.
- Versioning scheme
- Major version in the URL path (/api/v1), or the API-Version request header.
- Current version
- 1.0.0 (major v1), not deprecated, no sunset date planned.
- Breaking changes
- A breaking change ships as a new major version under a new path prefix, e.g. /api/v2. The previous major keeps serving unchanged.
- Additive changes
- New endpoints and new fields on existing responses may appear within a major version. Clients must ignore fields they do not recognise.
- Deprecation signal
- A deprecated version answers with the RFC 9745 Deprecation header and an RFC 8594 Sunset header giving the retirement date, plus a Link rel="deprecation" pointing at this policy.
- Minimum notice
- 180 days between the first Deprecation header and the Sunset date.
curl -si -H 'API-Version: v1' https://www.sreenitya.in/api/v1/health | grep -i '^api-version'
curl -s -H 'API-Version: v2' https://www.sreenitya.in/api/v1/health
Rate limits
The budget is 600 requests per 60 seconds per client IP address, counted in a fixed window. Exceeding it returns 429 rate_limited with a Retry-After header; nothing is ever silently dropped. The dataset is a few kilobytes and edge-cached for an hour, so a well-behaved client never comes close.
Every response — success, error and 404 alike — reports the live state of your budget, so a client can self-throttle without guessing.
- RateLimit
- Structured field with the remaining quota and reset delay, e.g. "default";r=599;t=42.
- RateLimit-Policy
- The quota in force: "default";q=600;w=60.
- RateLimit-Limit
- Requests allowed per window (600).
- RateLimit-Remaining
- Requests still available in the current window.
- RateLimit-Reset
- Seconds until the window resets and the quota is restored.
- Retry-After
- Seconds to wait before retrying. Sent on a 429 response only.
curl -sI https://www.sreenitya.in/api/v1/health | grep -i '^ratelimit'