{
  "name": "heydenys.com Content API",
  "description": "Read-only access to every page of heydenys.com — the personal portfolio of Denys Ishchenko. No authentication.",
  "version": "1.0.0",
  "versioning": {
    "version": "1.0.0",
    "current": "v1",
    "versionedBase": "https://www.heydenys.com/api/v1",
    "unversionedBase": "https://www.heydenys.com/api",
    "policy": "https://www.heydenys.com/api/v1 is pinned to the v1 response shapes. https://www.heydenys.com/api serves the same bytes but always tracks the current major, so pin the versioned base if a stable shape matters.",
    "deprecation": "Nothing is deprecated. When something is, the responses that are going away start carrying `Deprecation` (RFC 9745) with the date the decision took effect and `Sunset` (RFC 8594) with the date they stop answering, at least 180 days apart, plus `Link: rel=\"deprecation\"` pointing at the page that explains it. A breaking change to a response shape is not a deprecation: it is a new major at /api/v2, and /api/v1 keeps answering until its own Sunset date. Pin /api/v1 if that matters; /api/... without a version always tracks the current major.",
    "documentation": "https://www.heydenys.com/docs"
  },
  "rateLimit": {
    "limit": 600,
    "window": "60s",
    "scope": "client address, at the origin",
    "headers": {
      "RateLimit-Policy": "\"content\";q=600;w=60",
      "RateLimit-Limit": "600",
      "RateLimit": "on uncached responses only — every JSON error, and the 429",
      "Retry-After": "on a 429, in seconds"
    },
    "note": "Successful responses are cached at the edge for an hour, so most calls never reach the origin and are never counted. A cacheable 200 therefore carries the policy but no live counter: a per-client number inside a shared-cached body would be about whoever missed the cache."
  },
  "documentation": "https://www.heydenys.com/docs",
  "openapi": "https://www.heydenys.com/openapi.json",
  "endpoints": [
    {
      "method": "GET",
      "path": "/api",
      "operationId": "getApiIndex",
      "description": "This index: every endpoint, and where the API is described.",
      "mediaType": "application/json",
      "versionedPath": "/api/v1"
    },
    {
      "method": "GET",
      "path": "/api/pages",
      "operationId": "listPages",
      "description": "Every page on the site with its title, summary and last-modified date.",
      "mediaType": "application/json",
      "versionedPath": "/api/v1/pages"
    },
    {
      "method": "GET",
      "path": "/api/pages/{slug}",
      "operationId": "getPage",
      "description": "One page, including its complete Markdown body.",
      "mediaType": "application/json",
      "versionedPath": "/api/v1/pages/{slug}"
    },
    {
      "method": "GET",
      "path": "/api/profile",
      "operationId": "getProfile",
      "description": "The canonical facts about Denys Ishchenko: role, location, history, contact.",
      "mediaType": "application/json",
      "versionedPath": "/api/v1/profile"
    },
    {
      "method": "GET",
      "path": "/api/markdown/{slug}",
      "operationId": "getPageMarkdown",
      "description": "One page as raw Markdown, unwrapped.",
      "mediaType": "text/markdown",
      "versionedPath": "/api/v1/markdown/{slug}"
    }
  ],
  "files": {
    "cli": "https://www.heydenys.com/cli/heydenys.mjs",
    "llms": "https://www.heydenys.com/llms.txt",
    "llmsFull": "https://www.heydenys.com/llms-full.txt",
    "openapiYaml": "https://www.heydenys.com/openapi.yaml",
    "apiCatalog": "https://www.heydenys.com/.well-known/api-catalog",
    "sitemap": "https://www.heydenys.com/sitemap.xml",
    "robots": "https://www.heydenys.com/robots.txt"
  }
}
