{
  "openapi": "3.1.0",
  "info": {
    "title": "Mrinmay Mukherjee identity API",
    "summary": "Public read-only profile API for Mrinmay Mukherjee.",
    "description": "Look up Mrinmay Mukherjee, shipped products, and work history. No authentication, API keys, or signup. This is a personal identity API, not an employer or agency API.",
    "version": "1.0.0",
    "contact": {
      "name": "Mrinmay Mukherjee",
      "email": "devmrin@gmail.com",
      "url": "https://mrinmay.dev"
    },
    "license": {
      "name": "Personal use"
    }
  },
  "servers": [
    {
      "url": "https://mrinmay.dev",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Identity",
      "description": "Public profile and employment records."
    }
  ],
  "paths": {
    "/api": {
      "get": {
        "operationId": "getApiCatalog",
        "tags": [
          "Identity"
        ],
        "summary": "List public endpoints",
        "description": "Return a catalog of identity API endpoints, authentication policy (none), and documentation links.",
        "responses": {
          "200": {
            "description": "API catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          },
          "404": {
            "description": "Unknown API path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "Accept header cannot be satisfied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/profile": {
      "get": {
        "operationId": "getProfile",
        "tags": [
          "Identity"
        ],
        "summary": "Get public profile",
        "description": "Return name, email, description, sameAs links, products, and work history for Mrinmay Mukherjee.",
        "responses": {
          "200": {
            "description": "Public profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            }
          },
          "404": {
            "description": "Unknown API path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "Accept header cannot be satisfied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/works": {
      "get": {
        "operationId": "listWorks",
        "tags": [
          "Identity"
        ],
        "summary": "List shipped works",
        "description": "Return publicly shipped products and writing associated with Mrinmay Mukherjee.",
        "responses": {
          "200": {
            "description": "Work list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkList"
                }
              }
            }
          },
          "404": {
            "description": "Unknown API path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "Accept header cannot be satisfied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/experience": {
      "get": {
        "operationId": "listExperience",
        "tags": [
          "Identity"
        ],
        "summary": "List work experience",
        "description": "Return public employment history with role, company, URL, and dates.",
        "responses": {
          "200": {
            "description": "Experience list.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExperienceList"
                }
              }
            }
          },
          "404": {
            "description": "Unknown API path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "HTTP method is not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "Accept header cannot be satisfied.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "code",
              "message",
              "hint",
              "docs"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code."
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "How an agent should recover or which URL to try next."
              },
              "path": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "docs": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Catalog": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "authentication",
          "endpoints",
          "openapi"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "authentication": {
            "type": "string",
            "const": "none"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Endpoint"
            }
          }
        }
      },
      "Endpoint": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "method",
          "path",
          "operationId",
          "description"
        ],
        "properties": {
          "method": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "operationId": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "Profile": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "url",
          "email",
          "description"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "description": {
            "type": "string"
          },
          "jobTitle": {
            "type": "string"
          },
          "sameAs": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "works": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Work"
            }
          },
          "experience": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Experience"
            }
          },
          "social": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SocialLink"
            }
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Work": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "title",
          "url",
          "description"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "WorkList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Work"
            }
          }
        }
      },
      "Experience": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "role",
          "company",
          "url",
          "duration"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "role": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "duration": {
            "type": "string"
          }
        }
      },
      "ExperienceList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Experience"
            }
          }
        }
      },
      "SocialLink": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      }
    }
  },
  "externalDocs": {
    "description": "Personal website of Mrinmay Mukherjee — senior engineer, writer, and builder of local-first web apps.",
    "url": "https://mrinmay.dev"
  }
}
