{
  "openapi": "3.1.0",
  "info": {
    "title": "Arth Prajapati portfolio API",
    "version": "1.0.0",
    "summary": "Read-only JSON access to the portfolio published at user64bit.wtf.",
    "description": "Every section of the portfolio is available as JSON so agents do not have\nto parse HTML. All endpoints are unauthenticated, read-only, and safe to\ncache. Errors always use the same JSON envelope with a stable `code`, a\nhuman-readable `message`, and a `hint` describing how to recover.\n\nMarkdown alternates of the HTML pages are available at https://user64bit.wtf/index.md\nand https://user64bit.wtf/proof-of-work.md, or by sending `Accept: text/markdown`\nto the HTML URLs.",
    "contact": {
      "name": "Arth Prajapati",
      "email": "arth.prajapati.dev@gmail.com",
      "url": "https://user64bit.wtf"
    },
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    }
  },
  "servers": [
    {
      "url": "https://user64bit.wtf",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "portfolio",
      "description": "Portfolio content: profile, projects, experience, and more."
    },
    {
      "name": "meta",
      "description": "Discovery and service metadata."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "Index of every available endpoint.",
        "tags": [
          "meta"
        ],
        "responses": {
          "200": {
            "description": "Service metadata and links to every endpoint.",
            "headers": {
              "Cache-Control": {
                "description": "Edge and browser caching policy.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/profile": {
      "get": {
        "operationId": "getProfile",
        "summary": "Identity, bio, links, and availability.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "The portfolio owner's profile.",
            "headers": {
              "Cache-Control": {
                "description": "Edge and browser caching policy.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "Every shipped project.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "Every shipped project.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Project"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CollectionMeta"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A query parameter was invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "bad_request",
                    "status": 400,
                    "message": "`category` must be one of: Web3, AI, FullStack.",
                    "hint": "Retry with a supported category, or omit the parameter.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter to a single category.",
            "schema": {
              "type": "string",
              "enum": [
                "Web3",
                "AI",
                "FullStack"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of projects to return.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          }
        ]
      }
    },
    "/api/v1/projects/{slug}": {
      "get": {
        "operationId": "getProject",
        "summary": "A single project by slug.",
        "tags": [
          "portfolio"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Lowercase hyphenated project identifier.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "praxis"
          }
        ],
        "responses": {
          "200": {
            "description": "The requested project.",
            "headers": {
              "Cache-Control": {
                "description": "Edge and browser caching policy.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "No project matches the slug.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_found",
                    "status": 404,
                    "message": "No project with slug \"does-not-exist\".",
                    "hint": "List every available slug at https://user64bit.wtf/api/v1/projects.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/experience": {
      "get": {
        "operationId": "listExperience",
        "summary": "Work history, most recent first.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "Work history, most recent first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Experience"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CollectionMeta"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/education": {
      "get": {
        "operationId": "listEducation",
        "summary": "Formal education.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "Formal education.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Education"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CollectionMeta"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/contributions": {
      "get": {
        "operationId": "listContributions",
        "summary": "Open source pull requests and issues.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "Open source pull requests and issues.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Contribution"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CollectionMeta"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/skills": {
      "get": {
        "operationId": "listSkills",
        "summary": "Skills grouped by category.",
        "tags": [
          "portfolio"
        ],
        "responses": {
          "200": {
            "description": "Skills grouped by category.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SkillGroup"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/CollectionMeta"
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported. The API is read-only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "method_not_allowed",
                    "status": 405,
                    "message": "POST is not supported. This API is read-only.",
                    "hint": "Use GET, HEAD, or OPTIONS.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          },
          "406": {
            "description": "The `Accept` header does not allow `application/json`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "not_acceptable",
                    "status": 406,
                    "message": "This endpoint can only produce application/json.",
                    "hint": "Send `Accept: application/json` or omit the header.",
                    "documentation": "https://user64bit.wtf/openapi.json"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "description": "Every non-2xx response from this API uses this envelope, including the site-wide 404 handler when JSON is requested.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "status",
              "message",
              "hint",
              "documentation"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "bad_request",
                  "not_found",
                  "method_not_allowed",
                  "not_acceptable",
                  "internal_error"
                ],
                "description": "Stable, machine-readable error identifier."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code, repeated for convenience."
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation of what went wrong."
              },
              "hint": {
                "type": "string",
                "description": "Concrete next step an agent can take to recover."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "URL of this OpenAPI document."
              }
            }
          }
        }
      },
      "CollectionMeta": {
        "type": "object",
        "required": [
          "count",
          "total"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of items in `data`."
          },
          "total": {
            "type": "integer",
            "description": "Number of items before filtering or limiting."
          },
          "category": {
            "type": "string",
            "description": "Echo of the `category` filter, when supplied."
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "service",
          "version",
          "documentation",
          "endpoints"
        ],
        "properties": {
          "service": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "path",
                "description"
              ],
              "properties": {
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          },
          "resources": {
            "type": "array",
            "description": "Other machine-readable files published by this site.",
            "items": {
              "type": "object",
              "required": [
                "path",
                "title",
                "description",
                "contentType"
              ],
              "properties": {
                "path": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "contentType": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "name",
          "handle",
          "bio"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "x": {
            "type": "string",
            "format": "uri"
          },
          "github": {
            "type": "string",
            "format": "uri"
          },
          "headline": {
            "type": "string"
          },
          "bio": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "website": {
            "type": "string",
            "format": "uri"
          },
          "joined": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "availability": {
            "type": "string"
          },
          "hobbies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "ProfileEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Profile"
          }
        }
      },
      "Project": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "categories",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Web3",
                "AI",
                "FullStack"
              ]
            }
          },
          "summary": {
            "type": "string"
          },
          "description": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "techStack": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "repository": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "liveUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "demoVideo": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical API URL for this project."
          }
        }
      },
      "ProjectEnvelope": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Project"
          }
        }
      },
      "Experience": {
        "type": "object",
        "required": [
          "slug",
          "organization",
          "timeline",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "organization": {
            "type": "string"
          },
          "timeline": {
            "type": "string"
          },
          "current": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "Education": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "Contribution": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "repository",
          "status",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "repository": {
            "type": "string"
          },
          "reference": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "merged",
              "open",
              "issued",
              "solved"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "SkillGroup": {
        "type": "object",
        "required": [
          "slug",
          "category",
          "items"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
