{
  "openapi": "3.1.0",
  "info": {
    "title": "glebstroganov.com — machine-readable profile",
    "version": "1.0.0",
    "summary": "Read-only profile resources for Gleb Stroganov, design engineer at Evil Martians.",
    "description": "Machine-readable surface of a static personal profile site. There is no write API and no authentication: every endpoint below is public and cacheable. Start from /llms.txt for orientation, /about.json for the citable Person graph, or the .md twins of any HTML page.\n\nContact: strongeron@evilmartians.com. Unknown paths return HTTP 404 — as an RFC 9457 problem document for JSON clients, a short Markdown recovery document for text/markdown clients, HTML only for browsers.\n\n## Versioning and deprecation policy\n\nEvery machine-readable response carries an X-Api-Version header matching this info.version. There are deliberately no URL-path versions (/v1/): the surface is additive, and fields or endpoints are never removed or repurposed without a new major version. A breaking change ships as new endpoints plus an announcement in /llms.txt at least 90 days ahead; only then do old paths start returning 410 with a Sunset header carrying the removal date. No endpoint is currently scheduled for removal.\n\n## Rate limits\n\nResponses carry RFC 9331 draft RateLimit headers (plus RateLimit-Policy) so agents can self-throttle. The advertised budget of 240 requests per 60s window is advisory: the site is static and not currently throttled, but scrape politely anyway. A future throttle would return 429 with Retry-After.",
    "contact": {
      "name": "Gleb Stroganov",
      "email": "strongeron@evilmartians.com",
      "url": "https://glebstroganov.com"
    },
    "x-versioning-policy": {
      "scheme": "response-header",
      "version_header": "X-Api-Version",
      "url_versioning": "none-additive",
      "deprecation_signal": [
        "Deprecation",
        "Sunset",
        "Link rel=\"deprecation\""
      ],
      "notice_period_days": 90,
      "removals_scheduled": false
    },
    "x-rate-limit-policy": {
      "standard": "draft-ietf-httpapi-ratelimit-headers",
      "limit": 240,
      "window_seconds": 60,
      "enforced": false,
      "exceeded_response": "not-applicable",
      "planned_exceeded_response": {
        "status": 429,
        "headers": [
          "Retry-After"
        ]
      }
    }
  },
  "servers": [
    {
      "url": "https://glebstroganov.com"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "profile",
      "description": "Identity, works and verified links."
    },
    {
      "name": "pages",
      "description": "Markdown twins of the HTML pages."
    },
    {
      "name": "infrastructure",
      "description": "Discovery and crawler plumbing."
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "LLM-readable profile and index",
        "description": "Short profile plus an index of everything else on this site, with absolute URLs. The right first fetch for an agent that knows only the domain name.",
        "responses": {
          "200": {
            "description": "UTF-8 plain text; typographic punctuation is normalised to ASCII.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/TextDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "profile"
        ]
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullTxt",
        "summary": "Exhaustive LLM-readable profile",
        "description": "The full citation-friendly record: story, strengths, projects with outcomes, talks, writing, engagement criteria and citation guidance.",
        "responses": {
          "200": {
            "description": "UTF-8 plain text; typographic punctuation is normalised to ASCII.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/TextDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "profile"
        ]
      }
    },
    "/about.json": {
      "get": {
        "operationId": "getAboutJson",
        "summary": "schema.org Person profile with the full works graph",
        "description": "A schema.org-flavoured JSON document: the Person node plus every project, talk, article, open-source repo and media piece as subjectOf entries, each cross-linked by @id. The authoritative machine-readable identity record for this site.",
        "tags": [
          "profile"
        ],
        "responses": {
          "200": {
            "description": "A schema.org @graph rooted at a Person node.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PersonProfile"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApiJson",
        "summary": "This specification",
        "description": "The OpenAPI description of this site’s machine-readable surface, served as JSON.",
        "tags": [
          "infrastructure"
        ],
        "responses": {
          "200": {
            "description": "An OpenAPI 3.1 document.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenApiDocument"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemapXml",
        "summary": "Every public URL",
        "description": "XML sitemap listing all HTML routes and machine-readable artefacts, with change frequency hints.",
        "tags": [
          "infrastructure"
        ],
        "responses": {
          "200": {
            "description": "A sitemaps.org 0.9 urlset.",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "operationId": "getRobotsTxt",
        "summary": "Crawler policy",
        "description": "Allows all crawlers including AI agents (GPTBot, ClaudeBot, PerplexityBot and friends), with a Cloudflare Content-Signal declaring search, ai-input and ai-train all permitted.",
        "tags": [
          "infrastructure"
        ],
        "responses": {
          "200": {
            "description": "robots.txt in RFC 9309 form.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/index.md": {
      "get": {
        "operationId": "getPageMarkdownHome",
        "summary": "`/index.md` — page as Markdown or JSON",
        "description": "The homepage page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/about.md": {
      "get": {
        "operationId": "getPageMarkdownAbout",
        "summary": "`/about.md` — page as Markdown or JSON",
        "description": "The `/about` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/feed.md": {
      "get": {
        "operationId": "getPageMarkdownFeed",
        "summary": "`/feed.md` — page as Markdown or JSON",
        "description": "The `/feed` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/lab.md": {
      "get": {
        "operationId": "getPageMarkdownLab",
        "summary": "`/lab.md` — page as Markdown or JSON",
        "description": "The `/lab` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/sound-playground.md": {
      "get": {
        "operationId": "getPageMarkdownSoundPlayground",
        "summary": "`/sound-playground.md` — page as Markdown or JSON",
        "description": "The `/sound-playground` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/developers.md": {
      "get": {
        "operationId": "getPageMarkdownDevelopers",
        "summary": "`/developers.md` — page as Markdown or JSON",
        "description": "The `/developers` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    },
    "/privacy.md": {
      "get": {
        "operationId": "getPageMarkdownPrivacy",
        "summary": "`/privacy.md` — page as Markdown or JSON",
        "description": "The `/privacy` page without JavaScript. Send Accept: text/markdown for the raw Markdown twin, or Accept: application/json (on the HTML URL or the .md URL) for a PageDocument object wrapping it. Prefer these over parsing the SPA shell.",
        "responses": {
          "200": {
            "description": "The page as Markdown, or as a PageDocument object when JSON is requested.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "$ref": "#/components/schemas/MarkdownDocument"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageDocument"
                }
              }
            }
          },
          "404": {
            "description": "No such resource. JSON clients get an RFC 9457 problem document listing real resources; text/markdown clients a short Markdown recovery page; only browsers get HTML.",
            "headers": {
              "X-Api-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "tags": [
          "pages"
        ]
      }
    }
  },
  "components": {
    "headers": {
      "XApiVersion": {
        "description": "Schema version of this surface; equals info.version. See the versioning policy in info.description.",
        "schema": {
          "type": "string",
          "examples": [
            "1.0.0"
          ]
        }
      },
      "RateLimitLimit": {
        "description": "Advisory budget: 240 requests per 60-second window (RFC 9331 draft). Not currently enforced.",
        "schema": {
          "type": "integer",
          "examples": [
            240
          ]
        }
      },
      "RateLimitRemaining": {
        "description": "Advisory remaining quota for the current window at the serving edge. Not currently enforced.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitReset": {
        "description": "Seconds until the current advisory window resets.",
        "schema": {
          "type": "integer",
          "examples": [
            60
          ]
        }
      },
      "RateLimitPolicy": {
        "description": "Quota and window in RFC 9331 draft policy form: 240;w=60.",
        "schema": {
          "type": "string",
          "examples": [
            "240;w=60"
          ]
        }
      }
    },
    "schemas": {
      "TextDocument": {
        "type": "string",
        "description": "A UTF-8 plain-text document (robots.txt, llms.txt, llms-full.txt). Typographic punctuation is normalised to ASCII so no client decodes it as mojibake."
      },
      "MarkdownDocument": {
        "type": "string",
        "description": "The full page content as CommonMark. The first ATX heading is the page title; inline links are real Markdown links."
      },
      "PageDocument": {
        "type": "object",
        "description": "Structured wrapper around a page’s Markdown — the shape an LLM function call gets back from any /{page}.md operation when it sends Accept: application/json.",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical URL of the page this document represents."
          },
          "title": {
            "type": "string",
            "description": "First heading of the Markdown content."
          },
          "format": {
            "type": "string",
            "const": "text/markdown",
            "description": "Media type of the content field."
          },
          "content": {
            "$ref": "#/components/schemas/MarkdownDocument"
          }
        },
        "required": [
          "url",
          "title",
          "format",
          "content"
        ]
      },
      "OpenApiDocument": {
        "type": "object",
        "description": "This OpenAPI 3.1 document itself.",
        "properties": {
          "openapi": {
            "type": "string",
            "examples": [
              "3.1.0"
            ]
          },
          "info": {
            "type": "object"
          },
          "paths": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            }
          },
          "components": {
            "type": "object"
          }
        },
        "required": [
          "openapi",
          "info",
          "paths"
        ]
      },
      "SitemapXml": {
        "type": "string",
        "description": "sitemaps.org 0.9 urlset XML listing every public URL with lastmod, changefreq and priority."
      },
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem document. Returned with HTTP 404 by any unknown path when the client sends Accept: application/json.",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri-reference",
            "examples": [
              "https://glebstroganov.com/developers/errors#not-found"
            ]
          },
          "title": {
            "type": "string",
            "examples": [
              "Not Found"
            ]
          },
          "status": {
            "type": "integer",
            "enum": [
              404
            ]
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation, including the probed path."
          },
          "instance": {
            "type": "string",
            "description": "The requested path."
          },
          "resources": {
            "type": "object",
            "description": "Resolution hint: named links to every real machine-readable resource on this site.",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        },
        "required": [
          "type",
          "title",
          "status"
        ]
      },
      "PersonProfile": {
        "type": "object",
        "description": "schema.org JSON-LD rooted at a Person node (@type Person) whose subjectOf array carries every citable work as typed nodes (CreativeWork, SoftwareSourceCode, Article, SoftwareApplication, VideoObject, ImageObject).",
        "properties": {
          "@context": {
            "type": "string",
            "const": "https://schema.org"
          },
          "@type": {
            "type": "string",
            "const": "Person"
          },
          "@id": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string"
          },
          "jobTitle": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "email": {
            "type": "string"
          },
          "sameAs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            },
            "description": "Verified profile URLs (rel=\"me\" graph)."
          },
          "subjectOf": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Works, each with its own @id, name, description and canonical URL."
          },
          "_machine": {
            "type": "object",
            "description": "Build metadata: schema version, generation source, sibling endpoints."
          }
        },
        "required": [
          "@context",
          "@type",
          "name",
          "url",
          "subjectOf"
        ]
      }
    }
  }
}
