{
  "openapi": "3.1.0",
  "info": {
    "title": "stavrospachoundakis.com API",
    "version": "1.0.0",
    "summary": "Structured data about Stavros Pachoundakis for agents and developers.",
    "description": "Read-only JSON endpoints describing Stavros Pachoundakis's profile, experience, skills and projects.\n\n**Authentication.** None. There is no API key, no OAuth flow and no signup. See https://stavrospachoundakis.com/auth.md.\n\n**Static files.** Every endpoint is a static JSON file served over GET. There is no rate limiting, no query filtering and no content negotiation: a response is the same for every caller.\n\n**Versioning.** The API is versioned in the URL path (`/api/v1`). Breaking changes ship under a new path segment (`/api/v2`); the previous version keeps working. Additive changes (new fields, new endpoints) are made in place and are not breaking, so clients must ignore unknown fields.\n\n**Errors.** An unknown path under `/api/v1` returns a JSON 404 body `{\"error\":\"not_found\",\"see\":\"/openapi.json\"}`. Any method other than GET or HEAD returns a JSON 405 with the same shape.",
    "contact": {
      "name": "Stavros Pachoundakis",
      "url": "https://stavrospachoundakis.com/contact"
    },
    "license": {
      "name": "Content © Stavros Pachoundakis. Reuse with attribution.",
      "url": "https://stavrospachoundakis.com/privacy"
    }
  },
  "servers": [
    {
      "url": "https://stavrospachoundakis.com/api/v1",
      "description": "Production, API version 1."
    }
  ],
  "tags": [
    {
      "name": "profile",
      "description": "Structured facts about Stavros Pachoundakis: who Stavros is, where Stavros has worked, what Stavros can do."
    },
    {
      "name": "work",
      "description": "Projects by Stavros."
    }
  ],
  "paths": {
    "/profile": {
      "get": {
        "operationId": "getProfile",
        "tags": [
          "profile"
        ],
        "summary": "Get Stavros Pachoundakis's full profile",
        "description": "Returns the complete structured profile: name, headline, summary, location, languages, current role, full employment history, skills grouped by discipline, career highlights, availability for work, and canonical links. Use this to answer any factual question about who Stavros is or what Stavros has done.",
        "responses": {
          "200": {
            "description": "The profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/experience": {
      "get": {
        "operationId": "listExperience",
        "tags": [
          "profile"
        ],
        "summary": "List employment history",
        "description": "Returns Stavros's roles, each with title, company, a summary of the work, and the technologies used.",
        "responses": {
          "200": {
            "description": "Matching roles.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExperienceResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/skills": {
      "get": {
        "operationId": "listSkills",
        "tags": [
          "profile"
        ],
        "summary": "List technical skills",
        "description": "Returns Stavros's skills grouped into mobile, architecture, ai, backend and languages.",
        "responses": {
          "200": {
            "description": "Skills, grouped.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkillsResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/projects": {
      "get": {
        "operationId": "listProjects",
        "tags": [
          "work"
        ],
        "summary": "List projects",
        "description": "Returns projects by Stavros, each with a stable id, name, description, category, technology list, live URL and repository URL where public.",
        "responses": {
          "200": {
            "description": "Matching projects.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectsResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    },
    "/posts": {
      "get": {
        "operationId": "listPosts",
        "tags": [
          "work"
        ],
        "summary": "List posts",
        "description": "This site has no posts, so the list is always empty. The endpoint exists so clients written against the same API shape keep working.",
        "responses": {
          "200": {
            "description": "Matching posts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostsResponse"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "NotFound": {
        "description": "No such endpoint.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Only GET and HEAD are supported.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Location": {
        "type": "object",
        "description": "Where Stavros is based.",
        "required": [
          "locality",
          "country"
        ],
        "properties": {
          "locality": {
            "type": "string",
            "examples": [
              "Montréal"
            ]
          },
          "region": {
            "type": "string",
            "examples": [
              "Québec"
            ]
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code.",
            "examples": [
              "CA"
            ]
          }
        }
      },
      "Role": {
        "type": "object",
        "description": "One position in Stavros's employment history.",
        "required": [
          "title",
          "company"
        ],
        "properties": {
          "title": {
            "type": "string",
            "examples": [
              "Lead Mobile Developer"
            ]
          },
          "company": {
            "type": "string",
            "examples": [
              "National Bank of Canada (NBC)"
            ]
          },
          "companyNote": {
            "type": "string",
            "description": "Context about the engagement, such as the city.",
            "examples": [
              "Montreal"
            ]
          },
          "summary": {
            "type": "string",
            "description": "What Stavros did in the role."
          },
          "technologies": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Technologies used in the role."
          }
        }
      },
      "Skills": {
        "type": "object",
        "description": "Technical skills grouped by discipline.",
        "properties": {
          "mobile": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "architecture": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "ai": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "backend": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Project": {
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "category",
          "technologies"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable identifier.",
            "examples": [
              "mybell-app"
            ]
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "enum": [
              "work"
            ]
          },
          "technologies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Live URL, or null if the project is not public."
          },
          "repositoryUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public source repository, or null if closed source."
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "name",
          "headline",
          "summary",
          "url"
        ],
        "properties": {
          "name": {
            "type": "string",
            "examples": [
              "Stavros Pachoundakis"
            ]
          },
          "headline": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "location": {
            "$ref": "#/components/schemas/Location"
          },
          "experience": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Role"
            }
          },
          "skills": {
            "$ref": "#/components/schemas/Skills"
          },
          "highlights": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Career highlights in plain language."
          },
          "availability": {
            "type": "object",
            "description": "What kinds of work Stavros is open to and how to start a conversation.",
            "properties": {
              "openTo": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "contactUrl": {
                "type": "string",
                "format": "uri"
              },
              "preferredContact": {
                "type": "string",
                "examples": [
                  "email"
                ]
              }
            }
          },
          "links": {
            "type": "object",
            "description": "Canonical links.",
            "properties": {
              "website": {
                "type": "string",
                "format": "uri"
              },
              "github": {
                "type": "string",
                "format": "uri"
              },
              "linkedin": {
                "type": "string",
                "format": "uri"
              },
              "llmsTxt": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "role": {
            "$ref": "#/components/schemas/Role"
          }
        }
      },
      "ProfileResponse": {
        "type": "object",
        "required": [
          "apiVersion",
          "data"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "const": "v1"
          },
          "data": {
            "$ref": "#/components/schemas/Profile"
          }
        }
      },
      "ExperienceResponse": {
        "type": "object",
        "required": [
          "apiVersion",
          "data"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "const": "v1"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Role"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              }
            }
          }
        }
      },
      "SkillsResponse": {
        "type": "object",
        "required": [
          "apiVersion",
          "data"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "const": "v1"
          },
          "data": {
            "$ref": "#/components/schemas/Skills"
          },
          "meta": {
            "type": "object",
            "properties": {
              "groups": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ProjectsResponse": {
        "type": "object",
        "required": [
          "apiVersion",
          "data"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "const": "v1"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Project"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              }
            }
          }
        }
      },
      "Post": {
        "type": "object",
        "description": "Not used: this site has no posts.",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      },
      "PostsResponse": {
        "type": "object",
        "required": [
          "apiVersion",
          "data",
          "meta"
        ],
        "properties": {
          "apiVersion": {
            "type": "string",
            "const": "v1"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Post"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "Body of a JSON error response.",
        "required": [
          "error",
          "see"
        ],
        "properties": {
          "error": {
            "type": "string",
            "enum": [
              "not_found",
              "method_not_allowed"
            ],
            "description": "Stable machine-readable error code."
          },
          "see": {
            "type": "string",
            "description": "Where the API is described.",
            "examples": [
              "/openapi.json"
            ]
          }
        }
      }
    }
  },
  "externalDocs": {
    "description": "Developer portal",
    "url": "https://stavrospachoundakis.com/developers"
  },
  "security": []
}
