{
  "openapi": "3.1.0",
  "info": {
    "title": "Harshith Nayaka L — portfolio API",
    "version": "1.0.0",
    "summary": "Read-only JSON over this portfolio's profile, projects, case studies and FAQs.",
    "description": "Public, read-only API over the same content the pages of https://harshith-nayaka-l-portfolio.vercel.app render.\n\nNo authentication, no API key, no rate limit and no write operations: every\nrecord here is already public on the site. Responses are static JSON served\nfrom the CDN, so the API has the same availability as the site itself.\n\nAnything under /api that does not resolve returns a JSON error body rather\nthan an HTML error page.",
    "contact": {
      "name": "Harshith Nayaka L",
      "email": "harshith28124@gmail.com",
      "url": "https://harshith-nayaka-l-portfolio.vercel.app"
    },
    "license": {
      "name": "Content © Harshith Nayaka L",
      "url": "https://harshith-nayaka-l-portfolio.vercel.app/legal/terms"
    }
  },
  "servers": [
    {
      "url": "https://harshith-nayaka-l-portfolio.vercel.app",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Agent instructions",
    "url": "https://harshith-nayaka-l-portfolio.vercel.app/agents.md"
  },
  "tags": [
    {
      "name": "Discovery",
      "description": "Service and version metadata."
    },
    {
      "name": "Profile",
      "description": "Who this site belongs to."
    },
    {
      "name": "Projects",
      "description": "Shipped work, one record per project."
    },
    {
      "name": "Case studies",
      "description": "The long-form engineering write-up behind each project."
    },
    {
      "name": "FAQs",
      "description": "Questions this site answers, as question/answer pairs."
    }
  ],
  "paths": {
    "/api": {
      "get": {
        "operationId": "getServiceRoot",
        "tags": [
          "Discovery"
        ],
        "summary": "Service root",
        "description": "Lists the available API versions and points at the OpenAPI document.",
        "responses": {
          "200": {
            "description": "Service metadata.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRoot"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1": {
      "get": {
        "operationId": "getVersionRoot",
        "tags": [
          "Discovery"
        ],
        "summary": "Version 1 root",
        "description": "Lists every resource collection available in version 1.",
        "responses": {
          "200": {
            "description": "Version metadata and resource links.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VersionRoot"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/profile": {
      "get": {
        "operationId": "getProfile",
        "tags": [
          "Profile"
        ],
        "summary": "Get the profile",
        "description": "Name, headline, location, contact details and focus areas of the engineer this site belongs to.",
        "responses": {
          "200": {
            "description": "The profile record.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/projects": {
      "get": {
        "operationId": "listProjects",
        "tags": [
          "Projects"
        ],
        "summary": "List projects",
        "description": "Every project on the site, ordered strongest first — the same order the homepage grid renders.",
        "responses": {
          "200": {
            "description": "All projects.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectList"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/projects/{slug}": {
      "get": {
        "operationId": "getProject",
        "tags": [
          "Projects"
        ],
        "summary": "Get one project",
        "description": "A single project by slug, with links to its case study, HTML page and markdown twin.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug of the project, as returned in the `slug` field of the list response.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The project.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            }
          },
          "404": {
            "description": "No resource with that identifier. The body is JSON, never an HTML error page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/case-studies": {
      "get": {
        "operationId": "listCaseStudies",
        "tags": [
          "Case studies"
        ],
        "summary": "List case studies",
        "description": "Every case study in full, including problem framing, architecture, pipeline stages, results and stack.",
        "responses": {
          "200": {
            "description": "All case studies.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseStudyList"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/case-studies/{slug}": {
      "get": {
        "operationId": "getCaseStudy",
        "tags": [
          "Case studies"
        ],
        "summary": "Get one case study",
        "description": "The full engineering write-up for one project: what the problem was, what was built, how the pipeline is staged, what it produced, and what it runs on.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Slug of the case study, as returned in the `slug` field of the list response.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The case study.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseStudy"
                }
              }
            }
          },
          "404": {
            "description": "No resource with that identifier. The body is JSON, never an HTML error page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/faqs": {
      "get": {
        "operationId": "listFaqs",
        "tags": [
          "FAQs"
        ],
        "summary": "List FAQs",
        "description": "Question and answer pairs covering both the technical questions an answer engine fields and the ones a prospective client asks before starting.",
        "responses": {
          "200": {
            "description": "All FAQ entries.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FaqList"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every failure under /api returns this shape.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable code.",
                "examples": [
                  "not_found"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "What to do instead."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "Where the valid routes are listed."
              }
            }
          }
        }
      },
      "Link": {
        "type": "string",
        "format": "uri",
        "nullable": true
      },
      "ServiceRoot": {
        "type": "object",
        "required": [
          "name",
          "versions",
          "current"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "versions": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "current": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "VersionRoot": {
        "type": "object",
        "required": [
          "version",
          "resources"
        ],
        "properties": {
          "version": {
            "type": "string",
            "examples": [
              "v1"
            ]
          },
          "description": {
            "type": "string"
          },
          "resources": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "name",
          "headline",
          "location",
          "email"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "headline": {
            "type": "string"
          },
          "location": {
            "type": "object",
            "required": [
              "city",
              "country"
            ],
            "properties": {
              "city": {
                "type": "string"
              },
              "region": {
                "type": "string"
              },
              "country": {
                "type": "string",
                "description": "ISO 3166-1 alpha-2."
              }
            }
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "profiles": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "focus": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "counts": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "NamedLink": {
        "type": "object",
        "required": [
          "label",
          "href"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "href": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Project": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "outcome",
          "tags",
          "hasCaseStudy"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9-]+$"
          },
          "title": {
            "type": "string"
          },
          "kicker": {
            "type": "string",
            "nullable": true,
            "description": "Short context line shown above the title."
          },
          "outcome": {
            "type": "string",
            "description": "One line, framed as an outcome rather than a feature list."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "shipped",
              "in-progress"
            ]
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedLink"
            }
          },
          "hasCaseStudy": {
            "type": "boolean"
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "LabelledText": {
        "type": "object",
        "required": [
          "label",
          "value"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "PipelineStage": {
        "type": "object",
        "required": [
          "title",
          "nodes"
        ],
        "properties": {
          "title": {
            "type": "string"
          },
          "nodes": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "label"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "detail": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "input",
                    "model",
                    "logic",
                    "gate",
                    "output"
                  ]
                }
              }
            }
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "outcome",
          "tech"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "pattern": "^[a-z0-9-]+$"
          },
          "title": {
            "type": "string"
          },
          "kicker": {
            "type": "string"
          },
          "outcome": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "description": "Search-result length summary, 120-160 characters."
          },
          "inProgress": {
            "type": "boolean"
          },
          "meta": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LabelledText"
            }
          },
          "problem": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Paragraphs framing the problem."
          },
          "build": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Paragraphs describing what was built."
          },
          "pipeline": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PipelineStage"
            }
          },
          "howItWorks": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "title",
                "body"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "body": {
                  "type": "string"
                }
              }
            }
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "label",
                "body"
              ],
              "properties": {
                "label": {
                  "type": "string"
                },
                "body": {
                  "type": "string"
                }
              }
            }
          },
          "tech": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NamedLink"
            }
          },
          "screenshot": {
            "type": "object",
            "nullable": true,
            "required": [
              "url",
              "width",
              "height",
              "alt"
            ],
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "width": {
                "type": "integer"
              },
              "height": {
                "type": "integer"
              },
              "alt": {
                "type": "string"
              }
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "Faq": {
        "type": "object",
        "required": [
          "id",
          "question",
          "answer"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          }
        }
      },
      "ProjectList": {
        "type": "object",
        "required": [
          "object",
          "count",
          "data"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ]
          },
          "resource": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Project"
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "CaseStudyList": {
        "type": "object",
        "required": [
          "object",
          "count",
          "data"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ]
          },
          "resource": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseStudy"
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "FaqList": {
        "type": "object",
        "required": [
          "object",
          "count",
          "data"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ]
          },
          "resource": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Faq"
            }
          },
          "_links": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      }
    }
  }
}
