{
  "openapi": "3.0.3",
  "info": {
    "title": "Sreenitya Thatikunta Portfolio API",
    "version": "1.0.0",
    "description": "Public, read-only JSON API over the content of the Sreenitya Thatikunta portfolio at https://www.sreenitya.in. Use it to answer questions about her identity, skills, work experience and projects without scraping the single-page web app. No authentication, no rate limit beyond ordinary fair use, permissive CORS.",
    "contact": {
      "name": "Sreenitya Thatikunta",
      "email": "sreenityathatikunta@gmail.com",
      "url": "https://www.sreenitya.in/contact"
    },
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "servers": [
    {
      "url": "https://www.sreenitya.in/api",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "API documentation",
    "url": "https://www.sreenitya.in/docs"
  },
  "tags": [
    {
      "name": "meta",
      "description": "Service discovery and health."
    },
    {
      "name": "identity",
      "description": "Who the site is about."
    },
    {
      "name": "work",
      "description": "Skills, experience and projects."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List every endpoint in this API",
        "description": "Returns a machine-readable index of the API: the list of endpoints with their descriptions, plus links to the OpenAPI document and the human documentation. Call this first when discovering the API.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The API index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "getHealth",
        "summary": "Check that the API is serving",
        "description": "Liveness probe. Returns status 'ok' and the API version when the service is up. Safe to call as a smoke test; it touches no other resource.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The service is healthy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApiDocument",
        "summary": "Fetch this OpenAPI document",
        "description": "Returns the OpenAPI 3.0.3 description of this API as JSON, so a client can generate bindings or LLM tool definitions automatically.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "The OpenAPI document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "An OpenAPI 3.0.3 document.",
                  "additionalProperties": true
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/profile": {
      "get": {
        "operationId": "getProfile",
        "summary": "Get the site owner's profile",
        "description": "Returns the identity of the site owner: full name, headline, job title, affiliation, biography, areas of expertise, public email, resume URL and social profile links. Use this to answer 'who is Sreenitya Thatikunta?'.",
        "tags": [
          "identity"
        ],
        "responses": {
          "200": {
            "description": "The profile.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Wrapper around the profile object.",
                  "required": [
                    "profile"
                  ],
                  "properties": {
                    "profile": {
                      "$ref": "#/components/schemas/Profile"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/contact": {
      "get": {
        "operationId": "getContact",
        "summary": "Get public contact channels",
        "description": "Returns the public ways to reach the site owner: email address, contact form URL, social profiles, the preferred channel and a rough response time. Use this instead of guessing an email address.",
        "tags": [
          "identity"
        ],
        "responses": {
          "200": {
            "description": "The contact channels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Wrapper around the contact object.",
                  "required": [
                    "contact"
                  ],
                  "properties": {
                    "contact": {
                      "$ref": "#/components/schemas/Contact"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/skills": {
      "get": {
        "operationId": "listSkills",
        "summary": "List skills grouped by category",
        "description": "Returns every skill the site owner lists, grouped into categories such as 'Programming Languages' and 'AI & Machine Learning'. Use this to check whether a particular technology is in her stack.",
        "tags": [
          "work"
        ],
        "responses": {
          "200": {
            "description": "The skill categories.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Skill categories and their count.",
                  "required": [
                    "count",
                    "categories"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Number of categories."
                    },
                    "categories": {
                      "type": "array",
                      "description": "The categories.",
                      "items": {
                        "$ref": "#/components/schemas/SkillCategory"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/experience": {
      "get": {
        "operationId": "listExperience",
        "summary": "List work experience",
        "description": "Returns the site owner's professional roles, most recent first, each with employer, title, ISO start and end months, and the highlights delivered in that role. Use this to summarise or verify her work history.",
        "tags": [
          "work"
        ],
        "responses": {
          "200": {
            "description": "The roles.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Roles and their count.",
                  "required": [
                    "count",
                    "experience"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Number of roles."
                    },
                    "experience": {
                      "type": "array",
                      "description": "The roles.",
                      "items": {
                        "$ref": "#/components/schemas/Experience"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "List projects, optionally filtered",
        "description": "Returns the projects the site owner has built. Filter with `kind` to separate substantial research work from small side projects, or with `tag` to find projects using a given technology. Both filters may be combined.",
        "tags": [
          "work"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Restrict to one kind of project. 'research' for substantial ML/CV work, 'mini' for small side projects.",
            "schema": {
              "type": "string",
              "enum": [
                "research",
                "mini"
              ]
            }
          },
          {
            "name": "tag",
            "in": "query",
            "required": false,
            "description": "Restrict to projects carrying this tag. Matching is case-insensitive, e.g. 'diffusion' or 'Computer Vision'.",
            "schema": {
              "type": "string"
            },
            "example": "Diffusion"
          }
        ],
        "responses": {
          "200": {
            "description": "The matching projects.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Projects and their count.",
                  "required": [
                    "count",
                    "projects"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Number of projects returned."
                    },
                    "projects": {
                      "type": "array",
                      "description": "The projects.",
                      "items": {
                        "$ref": "#/components/schemas/Project"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter had an unsupported value.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/projects/{slug}": {
      "get": {
        "operationId": "getProject",
        "summary": "Get one project by slug",
        "description": "Returns a single project identified by its slug, with its description, tags and external links. Slugs come from GET /api/projects.",
        "tags": [
          "work"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The project's unique slug, e.g. 'manus'.",
            "schema": {
              "type": "string",
              "enum": [
                "manus",
                "visus",
                "atlas",
                "terria",
                "lumiere-wallpapers",
                "workout-tracker",
                "photobooth",
                "meme-search",
                "stock-market-agent"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The project.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Wrapper around the project object.",
                  "required": [
                    "project"
                  ],
                  "properties": {
                    "project": {
                      "$ref": "#/components/schemas/Project"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No project exists with that slug.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every failure returns this shape. Errors are always JSON, never HTML.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "description": "Details of the failure, including how to resolve it.",
            "required": [
              "code",
              "message",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable, machine-readable error identifier, e.g. project_not_found.",
                "example": "project_not_found"
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation of what went wrong.",
                "example": "No project exists with slug 'nope'."
              },
              "hint": {
                "type": "string",
                "description": "Concrete suggestion for how to resolve the error.",
                "example": "List valid slugs with GET /api/projects."
              },
              "documentation_url": {
                "type": "string",
                "format": "uri",
                "description": "Documentation page covering this endpoint."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code repeated in the body.",
                "example": 404
              }
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "description": "Identity of the site owner.",
        "required": [
          "name",
          "headline",
          "description",
          "url",
          "email"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Full name."
          },
          "headline": {
            "type": "string",
            "description": "Short professional headline."
          },
          "jobTitle": {
            "type": "string",
            "description": "Current title."
          },
          "affiliation": {
            "type": "string",
            "description": "University or organisation currently affiliated with."
          },
          "description": {
            "type": "string",
            "description": "One-paragraph biography suitable for citation."
          },
          "summary": {
            "type": "array",
            "description": "Longer biography, one paragraph per array entry.",
            "items": {
              "type": "string"
            }
          },
          "knowsAbout": {
            "type": "array",
            "description": "Subject areas of expertise.",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical site URL."
          },
          "image": {
            "type": "string",
            "format": "uri",
            "description": "Profile photo URL."
          },
          "resume": {
            "type": "string",
            "format": "uri",
            "description": "Resume PDF URL."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "Public contact email."
          },
          "location": {
            "type": "object",
            "description": "Coarse location.",
            "properties": {
              "country": {
                "type": "string",
                "description": "Country of residence."
              }
            }
          },
          "profiles": {
            "type": "object",
            "description": "External profile URLs keyed by network name.",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "Contact": {
        "type": "object",
        "description": "Public channels for contacting the site owner.",
        "required": [
          "email",
          "form",
          "profiles"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "Public contact email."
          },
          "form": {
            "type": "string",
            "format": "uri",
            "description": "URL of the human contact form."
          },
          "profiles": {
            "type": "object",
            "description": "External profile URLs keyed by network name.",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "preferredChannel": {
            "type": "string",
            "description": "The channel most likely to get a reply."
          },
          "responseTime": {
            "type": "string",
            "description": "Informal expectation for how long a reply takes."
          }
        }
      },
      "SkillCategory": {
        "type": "object",
        "description": "A named group of related skills.",
        "required": [
          "id",
          "title",
          "skills"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable slug for the category."
          },
          "title": {
            "type": "string",
            "description": "Human-readable category name."
          },
          "skills": {
            "type": "array",
            "description": "Individual skills in this category.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Experience": {
        "type": "object",
        "description": "A professional role held by the site owner.",
        "required": [
          "id",
          "company",
          "role",
          "startDate",
          "endDate",
          "highlights"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable slug for the role."
          },
          "company": {
            "type": "string",
            "description": "Employer name."
          },
          "role": {
            "type": "string",
            "description": "Job title held."
          },
          "startDate": {
            "type": "string",
            "description": "Start month in ISO 8601 YYYY-MM form.",
            "example": "2025-05"
          },
          "endDate": {
            "type": "string",
            "description": "End month in ISO 8601 YYYY-MM form.",
            "example": "2025-07"
          },
          "date": {
            "type": "string",
            "description": "Human-readable date range."
          },
          "highlights": {
            "type": "array",
            "description": "What was delivered in the role.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Project": {
        "type": "object",
        "description": "A project built by the site owner.",
        "required": [
          "slug",
          "title",
          "kind",
          "description",
          "tags",
          "links"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "URL-safe unique identifier used by GET /api/projects/{slug}.",
            "example": "manus"
          },
          "title": {
            "type": "string",
            "description": "Display name of the project."
          },
          "kind": {
            "type": "string",
            "enum": [
              "research",
              "mini"
            ],
            "description": "research for substantial ML/CV work, mini for small side projects."
          },
          "description": {
            "type": "string",
            "description": "One-paragraph summary of what was built and the results."
          },
          "tags": {
            "type": "array",
            "description": "Technology and topic tags.",
            "items": {
              "type": "string"
            }
          },
          "links": {
            "type": "object",
            "description": "Named external links for the project. Keys vary by project: github, demo or report.",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "Health": {
        "type": "object",
        "description": "Liveness response.",
        "required": [
          "status",
          "version"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok"
            ],
            "description": "Always 'ok' when serving."
          },
          "version": {
            "type": "string",
            "description": "API version."
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Where the API is documented."
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "description": "Discovery document listing every endpoint.",
        "required": [
          "name",
          "version",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "API name."
          },
          "version": {
            "type": "string",
            "description": "API version."
          },
          "description": {
            "type": "string",
            "description": "What the API is for."
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Human documentation."
          },
          "openapi_url": {
            "type": "string",
            "format": "uri",
            "description": "Machine-readable OpenAPI document."
          },
          "llms_txt_url": {
            "type": "string",
            "format": "uri",
            "description": "llms.txt index for agents."
          },
          "endpoints": {
            "type": "array",
            "description": "Every available endpoint.",
            "items": {
              "type": "object",
              "description": "One endpoint.",
              "required": [
                "method",
                "path",
                "description"
              ],
              "properties": {
                "method": {
                  "type": "string",
                  "description": "HTTP method."
                },
                "path": {
                  "type": "string",
                  "description": "Path relative to the server URL."
                },
                "operationId": {
                  "type": "string",
                  "description": "Matching operationId in the OpenAPI document."
                },
                "description": {
                  "type": "string",
                  "description": "What the endpoint returns."
                }
              }
            }
          }
        }
      }
    }
  }
}
