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

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'