{
  "openapi": "3.1.0",
  "info": {
    "title": "Michael Cohen (michaelcohen.io)",
    "version": "1.0.0",
    "summary": "The machine-readable resources of michaelcohen.io, a personal site.",
    "description": "Michael Cohen is a Member of Technical Staff at Anthropic, on the Agentic Systems team building Claude Managed Agents. Brooklyn, NY. The site is a single page; these are the files on it that an agent can fetch directly. All operations are unauthenticated GET requests answered from a CDN; there are no rate limits beyond the host's, no write operations and no other endpoints. The resume PDF is not indexed by search engines (X-Robots-Tag: noindex) but may be fetched freely.",
    "contact": {
      "name": "Michael Cohen",
      "url": "https://www.michaelcohen.io/",
      "email": "hello@michaelcohen.io"
    }
  },
  "externalDocs": {
    "description": "llms.txt: what the site is for and where each thing lives",
    "url": "https://www.michaelcohen.io/llms.txt"
  },
  "servers": [
    {
      "url": "https://www.michaelcohen.io",
      "description": "Production (the only host; other hostnames redirect here)"
    }
  ],
  "tags": [
    {
      "name": "site",
      "description": "Read-only resources generated from the site's content at build time"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getHome",
        "summary": "The home page",
        "description": "The one-page site: introduction, work history, writing and contact details. A request that prefers `text/markdown` (acceptmarkdown.com) gets the same content as Markdown at this URL (the same document as /llms.txt), no redirect; any other Accept value gets the HTML. The response carries `Vary: Accept`.",
        "responses": {
          "200": {
            "description": "The page, as HTML or as Markdown depending on the Accept header.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/index.md": {
      "get": {
        "operationId": "getHomeMarkdown",
        "summary": "The home page as Markdown",
        "description": "Everything on the page as CommonMark, in the llms.txt shape: a summary, when to use the site, links, every role with dates, team and bullet points (links preserved), writing, education and skills. The same document as /llms.txt. Generated from the same content as the HTML on every build.",
        "responses": {
          "200": {
            "description": "The page as Markdown.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "The llms.txt index",
        "description": "An llms.txt file (https://llmstxt.org): a one-paragraph summary, when to use this site and when not to, links to every file and profile, and then the whole page as Markdown. The same document as /index.md.",
        "responses": {
          "200": {
            "description": "The index as Markdown-formatted plain text.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/MichaelCohenResume.pdf": {
      "get": {
        "operationId": "getResumePdf",
        "summary": "The one-page resume",
        "description": "A single-page PDF resume generated from the same work history as the page, with a shorter selection of bullet points per role. Served inline with a `Content-Disposition` filename.",
        "responses": {
          "200": {
            "description": "The resume.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "summary": "The XML sitemap",
        "description": "Every indexable URL on the site (there is one) in the sitemaps.org format.",
        "responses": {
          "200": {
            "description": "The sitemap.",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/resume.json": {
      "get": {
        "operationId": "getResumeJson",
        "summary": "The resume as JSON Resume",
        "description": "The work history, education, skills, profiles and writing in the JSON Resume schema (https://jsonresume.org/schema), generated from the same content as the page. The typed counterpart of /index.md and the PDF.",
        "responses": {
          "200": {
            "description": "The resume.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonResume"
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "summary": "This document",
        "description": "The OpenAPI 3.1 description of the resources listed here.",
        "responses": {
          "200": {
            "description": "This document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "openapi",
                    "info",
                    "servers",
                    "paths"
                  ],
                  "properties": {
                    "openapi": {
                      "type": "string",
                      "description": "The OpenAPI version, 3.1.x."
                    },
                    "info": {
                      "type": "object"
                    },
                    "servers": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      }
                    },
                    "paths": {
                      "type": "object"
                    },
                    "components": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
            "headers": {
              "Vary": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "Accept"
                  ]
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              },
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "tags": [
          "site"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details, with a stable `code` and a `hint` saying where to look instead.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "code",
          "hint",
          "resources"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Always `about:blank`: the status code says it all.",
            "enum": [
              "about:blank"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Not Found"
            ]
          },
          "status": {
            "type": "integer",
            "enum": [
              404
            ]
          },
          "detail": {
            "type": "string",
            "description": "What was asked for and where the resources are listed."
          },
          "instance": {
            "type": "string",
            "description": "The path that was requested."
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "not_found"
            ]
          },
          "hint": {
            "type": "string",
            "description": "How to recover."
          },
          "resources": {
            "type": "object",
            "description": "Absolute URLs of every resource on the site.",
            "required": [
              "home",
              "markdown",
              "llms",
              "openapi",
              "resume",
              "sitemap"
            ],
            "properties": {
              "home": {
                "type": "string",
                "format": "uri"
              },
              "markdown": {
                "type": "string",
                "format": "uri"
              },
              "llms": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "resume": {
                "type": "string",
                "format": "uri"
              },
              "sitemap": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "JsonResume": {
        "type": "object",
        "description": "A JSON Resume document (https://jsonresume.org/schema).",
        "required": [
          "basics",
          "work",
          "education",
          "skills"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "basics": {
            "type": "object",
            "required": [
              "name",
              "email",
              "url",
              "summary",
              "location",
              "profiles"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "label": {
                "type": "string",
                "description": "Current title and employer."
              },
              "image": {
                "type": "string",
                "format": "uri"
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "summary": {
                "type": "string"
              },
              "location": {
                "type": "object",
                "properties": {
                  "city": {
                    "type": "string"
                  },
                  "region": {
                    "type": "string"
                  },
                  "countryCode": {
                    "type": "string"
                  }
                }
              },
              "profiles": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "network",
                    "username",
                    "url"
                  ],
                  "properties": {
                    "network": {
                      "type": "string"
                    },
                    "username": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "work": {
            "type": "array",
            "description": "One entry per role, newest first.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "position",
                "startDate",
                "summary",
                "highlights"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Employer."
                },
                "position": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "startDate": {
                  "type": "string",
                  "pattern": "^[0-9]{4}-[0-9]{2}$"
                },
                "endDate": {
                  "type": "string",
                  "pattern": "^[0-9]{4}-[0-9]{2}$",
                  "description": "Absent while the role is ongoing."
                },
                "summary": {
                  "type": "string",
                  "description": "The team."
                },
                "highlights": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "education": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "institution",
                "studyType",
                "area",
                "endDate"
              ],
              "properties": {
                "institution": {
                  "type": "string"
                },
                "studyType": {
                  "type": "string"
                },
                "area": {
                  "type": "string"
                },
                "endDate": {
                  "type": "string",
                  "pattern": "^[0-9]{4}-[0-9]{2}$"
                }
              }
            }
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "keywords"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "keywords": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "publications": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "publisher",
                "releaseDate",
                "url"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "releaseDate": {
                  "type": "string",
                  "pattern": "^[0-9]{4}-[0-9]{2}$"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "canonical": {
                "type": "string",
                "format": "uri"
              },
              "version": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "responses": {
      "NotFound": {
        "description": "No resource at this path. The body follows the Accept header: an RFC 9457 problem document for `application/json` or `application/problem+json` (and by default under `/api/`, `/v1/` and `/graphql`), the site's HTML 404 page for `text/html`, and otherwise (including `*/*` and no Accept header) a short Markdown note. Every variant links the home page, the Markdown page, llms.txt, this document, the resume PDF and the sitemap.",
        "headers": {
          "Vary": {
            "schema": {
              "type": "string",
              "enum": [
                "Accept"
              ]
            }
          }
        },
        "content": {
          "text/markdown": {
            "schema": {
              "type": "string"
            }
          },
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          },
          "text/html": {
            "schema": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
