{
  "openapi": "3.1.0",
  "info": {
    "title": "Austin Greco Public Mini-resume API",
    "version": "1.0.0",
    "description": "Public, read-only facts about Austin Greco’s current work, selected projects, and professional profiles. No account, API key, payment, SDK, or sandbox is required. API contracts use major versions in the URL. Version 1 is supported with no retirement scheduled; compatible additions are allowed, and clients should ignore unknown fields. Breaking changes require a new major version. Retirement requires at least 90 days of notice, a migration guide, and a working replacement. Announced deprecations use Deprecation and Link headers, with Sunset once retirement is scheduled. The compatibility endpoint /api/resume keeps the v1 contract. See https://austingreco.com/api#versioning. This is a selected public overview rather than a complete career history."
  },
  "servers": [
    {
      "url": "https://austingreco.com"
    }
  ],
  "security": [],
  "externalDocs": {
    "description": "Developer integration documentation, quickstart, errors, and versioning policy",
    "url": "https://austingreco.com/api"
  },
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getApiVersionIndex",
        "summary": "Discover the supported version 1 API",
        "description": "Read version support status and links to the public mini-resume, developer documentation, and OpenAPI description. No authentication or parameters are required. Query parameters are ignored. Also supports HEAD with the same status and headers and no body. Conditional requests may return HTTP 304.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The version 1 discovery index. The endpoint stays JSON for every Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiVersionIndex"
                },
                "example": {
                  "version": "v1",
                  "status": "supported",
                  "documentation": "https://austingreco.com/api",
                  "openapi": "https://austingreco.com/openapi.json",
                  "endpoints": {
                    "resume": "https://austingreco.com/api/v1/resume"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/resume": {
      "get": {
        "operationId": "getPublicResumeV1",
        "summary": "Read Austin Greco’s public mini-resume using the version 1 contract",
        "description": "Use this operation to retrieve current role, selected projects, and public professional profiles as JSON Resume-compatible data. Returns the complete published resource; query parameters do not filter it. No authentication is required. GET is safe to retry. The data changes when this site is published. Also supports HEAD with the same status and headers and no body. Conditional requests may return HTTP 304.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The complete public mini-resume. The endpoint stays JSON for every Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicResume"
                },
                "example": {
                  "$schema": "https://unpkg.com/@jsonresume/schema@1.3.1/schema.json",
                  "basics": {
                    "name": "Austin Greco",
                    "label": "Staff Software Engineer",
                    "url": "https://austingreco.com/",
                    "summary": "Software engineer working on Uber’s Michelangelo machine learning platform and independent game maker behind Zorse.",
                    "location": {
                      "city": "San Francisco",
                      "region": "CA",
                      "countryCode": "US"
                    },
                    "profiles": [
                      {
                        "network": "GitHub",
                        "username": "austingreco",
                        "url": "https://github.com/austingreco"
                      },
                      {
                        "network": "LinkedIn",
                        "username": "austingreco",
                        "url": "https://www.linkedin.com/in/austingreco"
                      }
                    ]
                  },
                  "work": [
                    {
                      "name": "Uber",
                      "position": "Staff Software Engineer",
                      "url": "https://www.uber.com/",
                      "summary": "Working on Michelangelo, Uber’s machine learning platform."
                    }
                  ],
                  "projects": [
                    {
                      "name": "Zorse",
                      "description": "Independent games.",
                      "url": "https://zorse.io/"
                    },
                    {
                      "name": "Bunny Hop",
                      "description": "A pixel platformer with charge-and-release jumps, combos, and a growing cast of characters.",
                      "url": "https://zorse.io/games/bunny-hop/"
                    },
                    {
                      "name": "Tap Bat",
                      "description": "A Halloween arcade game with one-touch flight through a spooky pixel cave.",
                      "url": "https://zorse.io/games/tap-bat/"
                    },
                    {
                      "name": "Yodoku",
                      "description": "A calm, offline logic game with 9,999 lantern puzzles and no guessing.",
                      "url": "https://zorse.io/games/yodoku/"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/resume": {
      "get": {
        "operationId": "getPublicResume",
        "summary": "Read the public mini-resume through the compatibility endpoint",
        "description": "Existing integrations can continue using this endpoint with the same public mini-resume response and version 1 contract. New integrations should use /api/v1/resume. This URL will not silently switch to another major version. It is supported with no retirement scheduled. Query parameters are ignored. Also supports HEAD with the same status and headers and no body. Conditional requests may return HTTP 304.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The complete public mini-resume. The endpoint stays JSON for every Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicResume"
                },
                "example": {
                  "$schema": "https://unpkg.com/@jsonresume/schema@1.3.1/schema.json",
                  "basics": {
                    "name": "Austin Greco",
                    "label": "Staff Software Engineer",
                    "url": "https://austingreco.com/",
                    "summary": "Software engineer working on Uber’s Michelangelo machine learning platform and independent game maker behind Zorse.",
                    "location": {
                      "city": "San Francisco",
                      "region": "CA",
                      "countryCode": "US"
                    },
                    "profiles": [
                      {
                        "network": "GitHub",
                        "username": "austingreco",
                        "url": "https://github.com/austingreco"
                      },
                      {
                        "network": "LinkedIn",
                        "username": "austingreco",
                        "url": "https://www.linkedin.com/in/austingreco"
                      }
                    ]
                  },
                  "work": [
                    {
                      "name": "Uber",
                      "position": "Staff Software Engineer",
                      "url": "https://www.uber.com/",
                      "summary": "Working on Michelangelo, Uber’s machine learning platform."
                    }
                  ],
                  "projects": [
                    {
                      "name": "Zorse",
                      "description": "Independent games.",
                      "url": "https://zorse.io/"
                    },
                    {
                      "name": "Bunny Hop",
                      "description": "A pixel platformer with charge-and-release jumps, combos, and a growing cast of characters.",
                      "url": "https://zorse.io/games/bunny-hop/"
                    },
                    {
                      "name": "Tap Bat",
                      "description": "A Halloween arcade game with one-touch flight through a spooky pixel cave.",
                      "url": "https://zorse.io/games/tap-bat/"
                    },
                    {
                      "name": "Yodoku",
                      "description": "A calm, offline logic game with 9,999 lantern puzzles and no guessing.",
                      "url": "https://zorse.io/games/yodoku/"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "ApiNotFound": {
        "description": "RFC 9457 problem details for GET on an unknown /api/* route (HTTP 404). HEAD has the same status and headers without a body. The existing error, message, resolution, documentation, and openapi fields remain as extensions. This response describes unknown API routing, not errors from the known operations above. Storage and delivery failures for known files, and unsupported HTTP methods, can return HTML.",
        "headers": {
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            },
            "example": {
              "type": "about:blank",
              "title": "Not Found",
              "status": 404,
              "detail": "Unknown API route. GET /api/v1/resume returns the public mini-resume.",
              "instance": "/api/v1/missing",
              "error": "api_route_not_found",
              "message": "Unknown API route. GET /api/v1/resume returns the public mini-resume.",
              "resolution": "Use GET /api/v1/resume. Read /api for examples or /openapi.json for the API schema.",
              "documentation": "https://austingreco.com/api",
              "openapi": "https://austingreco.com/openapi.json"
            }
          }
        }
      }
    },
    "schemas": {
      "ApiVersionIndex": {
        "type": "object",
        "description": "The version 1 support status and public API discovery links.",
        "required": [
          "version",
          "status",
          "documentation",
          "openapi",
          "endpoints"
        ],
        "properties": {
          "version": {
            "type": "string",
            "const": "v1"
          },
          "status": {
            "type": "string",
            "enum": [
              "supported",
              "deprecated"
            ],
            "description": "Version lifecycle status. Version 1 is currently supported with no retirement scheduled."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "const": "https://austingreco.com/api"
          },
          "openapi": {
            "type": "string",
            "format": "uri",
            "const": "https://austingreco.com/openapi.json"
          },
          "endpoints": {
            "type": "object",
            "required": [
              "resume"
            ],
            "properties": {
              "resume": {
                "type": "string",
                "format": "uri",
                "const": "https://austingreco.com/api/v1/resume"
              }
            }
          }
        }
      },
      "PublicResume": {
        "type": "object",
        "description": "The published subset of JSON Resume. Private contact information, employment dates, and unpublished work are excluded.",
        "required": [
          "$schema",
          "basics",
          "work",
          "projects"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri",
            "description": "The pinned JSON Resume schema used to validate this resource.",
            "const": "https://unpkg.com/@jsonresume/schema@1.3.1/schema.json"
          },
          "basics": {
            "$ref": "#/components/schemas/Basics"
          },
          "work": {
            "type": "array",
            "description": "Selected current work.",
            "items": {
              "$ref": "#/components/schemas/Work"
            }
          },
          "projects": {
            "type": "array",
            "description": "Selected public game and software projects.",
            "items": {
              "$ref": "#/components/schemas/Project"
            }
          }
        }
      },
      "Basics": {
        "type": "object",
        "required": [
          "name",
          "label",
          "url",
          "summary",
          "location",
          "profiles"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Public full name."
          },
          "label": {
            "type": "string",
            "description": "Current professional title."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical personal website."
          },
          "summary": {
            "type": "string",
            "description": "Public professional overview."
          },
          "location": {
            "type": "object",
            "required": [
              "city",
              "region",
              "countryCode"
            ],
            "properties": {
              "city": {
                "type": "string",
                "description": "Public city."
              },
              "region": {
                "type": "string",
                "description": "Public state or region."
              },
              "countryCode": {
                "type": "string",
                "description": "ISO 3166-1 alpha-2 country code."
              }
            }
          },
          "profiles": {
            "type": "array",
            "description": "Public professional profiles.",
            "items": {
              "$ref": "#/components/schemas/Profile"
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "network",
          "username",
          "url"
        ],
        "properties": {
          "network": {
            "type": "string",
            "description": "Profile service."
          },
          "username": {
            "type": "string",
            "description": "Public username."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public profile URL."
          }
        }
      },
      "Work": {
        "type": "object",
        "required": [
          "name",
          "position",
          "url",
          "summary"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Employer name."
          },
          "position": {
            "type": "string",
            "description": "Current position."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Employer website."
          },
          "summary": {
            "type": "string",
            "description": "Public description of current work."
          }
        }
      },
      "Project": {
        "type": "object",
        "required": [
          "name",
          "description",
          "url"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Project name."
          },
          "description": {
            "type": "string",
            "description": "Public project summary."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Project website."
          }
        }
      },
      "ApiError": {
        "type": "object",
        "description": "RFC 9457 problem details for unknown API routes, preserving the existing recovery fields as extensions. The reusable response is components.responses.ApiNotFound.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "error",
          "message",
          "resolution",
          "documentation",
          "openapi"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "const": "about:blank",
            "description": "The problem has the semantics of the HTTP 404 status."
          },
          "title": {
            "type": "string",
            "const": "Not Found"
          },
          "status": {
            "type": "integer",
            "const": 404
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation of the unknown route and the supported mini-resume endpoint."
          },
          "instance": {
            "type": "string",
            "format": "uri-reference",
            "description": "The requested API path, without its query string."
          },
          "error": {
            "type": "string",
            "const": "api_route_not_found",
            "description": "Stable error code."
          },
          "message": {
            "type": "string",
            "description": "Human-readable explanation retained for compatibility."
          },
          "resolution": {
            "type": "string",
            "description": "The supported request and where to find examples."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Human-readable API documentation.",
            "const": "https://austingreco.com/api"
          },
          "openapi": {
            "type": "string",
            "format": "uri",
            "description": "Machine-readable API description.",
            "const": "https://austingreco.com/openapi.json"
          }
        }
      }
    }
  }
}
