{
  "openapi": "3.0.4",
  "info": {
    "title": "Longevity World Cup Public API",
    "description": "Public no-auth JSON endpoints for Longevity World Cup athlete, field, biological aging clock calculation, and rank-preview data.\n\nThe documented endpoints are public data and biological aging clock calculation surfaces used by the website and external clients. They do not require API keys, OAuth, cookies, or other authentication.",
    "contact": {
      "name": "Longevity World Cup",
      "url": "https://longevityworldcup.com/"
    },
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://longevityworldcup.com",
      "description": "Production"
    }
  ],
  "paths": {
    "/api/data/flags": {
      "get": {
        "tags": [
          "Data"
        ],
        "summary": "List selectable flags",
        "description": "Returns the complete public flag list accepted by athlete profile and onboarding flows.",
        "operationId": "listFlags",
        "responses": {
          "200": {
            "description": "Ordered list of selectable flag names.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "example": [
                  "United States",
                  "Hungary",
                  "Prospera"
                ]
              }
            }
          }
        }
      }
    },
    "/api/data/divisions": {
      "get": {
        "tags": [
          "Data"
        ],
        "summary": "List competition divisions",
        "description": "Returns the public division names used to group longevity athletes.",
        "operationId": "listDivisions",
        "responses": {
          "200": {
            "description": "Ordered list of division names.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "example": [
                  "Men's",
                  "Women's",
                  "Open"
                ]
              }
            }
          }
        }
      }
    },
    "/api/data/athletes": {
      "get": {
        "tags": [
          "Data"
        ],
        "summary": "List public longevity athlete data",
        "description": "Returns the hydrated public athlete snapshot used by the website. Records include profile fields, public biomarker records, crowd age fields, generated asset URLs, and computed badges. The response may gain additional public fields over time.",
        "operationId": "listAthletes",
        "responses": {
          "200": {
            "description": "Current public athlete snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PublicAthleteApiDocument"
                  }
                },
                "example": [
                  {
                    "Name": "Example Athlete",
                    "DisplayName": "Example Athlete",
                    "MediaContact": "https://example.com/example-athlete",
                    "DateOfBirth": {
                      "Year": 1980,
                      "Month": 6,
                      "Day": 15
                    },
                    "Biomarkers": [
                      {
                        "Date": "2026-01-15",
                        "AlbGL": 46,
                        "CreatUmolL": 88.4,
                        "GluMmolL": 5.05,
                        "CrpMgL": 0.8,
                        "LymPc": 25.5,
                        "McvFL": 96.7,
                        "RdwPc": 12.5,
                        "AlpUL": 51,
                        "Wbc1000cellsuL": 6.3
                      }
                    ],
                    "Division": "Open",
                    "Flag": "United States",
                    "AthleteSlug": "example_athlete",
                    "CrowdAge": 39,
                    "CrowdCount": 128,
                    "IsNew": false,
                    "ProfilePic": "/athletes/example_athlete/example_athlete.webp?v=123",
                    "ProfilePicThumb": "/generated/profile-thumbs/example_athlete_thumb_sm.webp?v=123",
                    "ProfilePicLeaderboardThumb": "/generated/profile-thumbs/example_athlete_thumb_md.webp?v=123",
                    "Proofs": [
                      "/athletes/example_athlete/proof_1.webp?v=123"
                    ],
                    "Badges": [ ]
                  }
                ]
              }
            }
          },
          "304": {
            "description": "Not Modified"
          }
        }
      }
    },
    "/api/data/pheno-age": {
      "post": {
        "tags": [
          "Data"
        ],
        "summary": "Calculate Pheno Age",
        "description": "Calculates a Pheno Age result from chronological age and the nine required blood biomarkers. The result includes Biological Age Difference, which can be passed to the hypothetical rank endpoint as the submitted biological age.",
        "operationId": "calculatePhenoAge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhenoAgeCalculationRequest"
              },
              "example": {
                "chronologicalAge": 45.5,
                "albGL": 46,
                "creatUmolL": 88.4,
                "gluMmolL": 5.05,
                "crpMgL": 0.8,
                "wbc1000cellsuL": 6.3,
                "lymPc": 25.5,
                "mcvFL": 96.7,
                "rdwPc": 12.5,
                "alpUL": 51
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated Pheno Age result, Biological Age Difference, pace of aging, and domain contribution values.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhenoAgeCalculationResult"
                },
                "example": {
                  "biologicalAge": 38.82,
                  "biologicalAgeDifference": -6.68,
                  "paceOfAging": 0.85,
                  "domainContributions": {
                    "liver": -16.07,
                    "kidney": 9.31,
                    "metabolic": 10.94,
                    "inflammation": -2.67,
                    "immune": 75.05
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request body or out-of-range Pheno Age input.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/PublicDataErrorResponse"
                    }
                  ]
                },
                "example": {
                  "message": "CRP must be greater than 0."
                }
              }
            }
          }
        }
      }
    },
    "/api/data/bortz-age": {
      "post": {
        "tags": [
          "Data"
        ],
        "summary": "Calculate Bortz Age",
        "description": "Calculates a Bortz Age result from chronological age and the public biomarker panel used by the Pro clock. Monocyte and neutrophil counts are derived from WBC and percentage inputs, matching the website calculation.",
        "operationId": "calculateBortzAge",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BortzAgeCalculationRequest"
              },
              "example": {
                "chronologicalAge": 45.5,
                "albGL": 46,
                "alpUL": 51,
                "ureaMmolL": 5.4,
                "cholesterolMmolL": 4.8,
                "creatUmolL": 88.4,
                "cystatinCMgL": 0.85,
                "hba1cMmolMol": 34,
                "crpMgL": 0.8,
                "ggtUL": 22,
                "rbc10e12L": 4.7,
                "mcvFL": 96.7,
                "rdwPc": 12.5,
                "wbc1000cellsuL": 6.3,
                "monocytePc": 7.2,
                "neutrophilPc": 58.1,
                "lymPc": 25.5,
                "altUL": 24,
                "shbgNmolL": 45,
                "vitaminDNmolL": 85,
                "gluMmolL": 5.05,
                "mchPg": 31.5,
                "apoA1GL": 1.55
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated Bortz Age result, Biological Age Difference, biological age acceleration, and derived count inputs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BortzAgeCalculationResult"
                },
                "example": {
                  "biologicalAge": 39.73,
                  "biologicalAgeDifference": -5.77,
                  "paceOfAging": 0.87,
                  "biologicalAgeAcceleration": -5.77,
                  "derivedMonocyteCount10e9L": 0.45,
                  "derivedNeutrophilCount10e9L": 3.66
                }
              }
            }
          },
          "400": {
            "description": "Invalid request body or out-of-range Bortz Age input.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/PublicDataErrorResponse"
                    }
                  ]
                },
                "example": {
                  "message": "CRP, GGT, ALT, SHBG, and Vitamin D must be greater than 0."
                }
              }
            }
          }
        }
      }
    },
    "/api/data/hypothetical-rank": {
      "post": {
        "tags": [
          "Data"
        ],
        "summary": "Preview a hypothetical Ultimate League rank",
        "description": "Calculates where a hypothetical biological age result would rank in the current Ultimate League field. Use `pheno` for an Amateur Pheno Age preview and `bortz` for a Pro Bortz Age preview.",
        "operationId": "previewHypotheticalRank",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HypotheticalRankRequest"
              },
              "example": {
                "calculator": "pheno",
                "chronologicalAge": 45.5,
                "biologicalAge": 38.2,
                "birthYear": 1980,
                "birthMonth": 6,
                "birthDay": 15
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Hypothetical rank, field sizes, signed age difference, and nearby rows.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HypotheticalRankResult"
                },
                "example": {
                  "rank": 12,
                  "fieldSize": 61,
                  "currentFieldSize": 60,
                  "leagueName": "Ultimate League",
                  "category": "Amateur",
                  "ageDifference": -7.3,
                  "nearby": [
                    {
                      "rank": 10,
                      "name": "Nearby Athlete",
                      "category": "Amateur",
                      "ageDifference": -8.1,
                      "isHypothetical": false
                    },
                    {
                      "rank": 12,
                      "name": "Your result",
                      "category": "Amateur",
                      "ageDifference": -7.3,
                      "isHypothetical": true
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid request body, unsupported calculator, invalid date of birth, or out-of-range age value.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValidationProblemDetails"
                    },
                    {
                      "$ref": "#/components/schemas/PublicDataErrorResponse"
                    }
                  ]
                },
                "example": {
                  "message": "Calculator must be pheno or bortz."
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "BortzAgeCalculationRequest": {
        "required": [
          "albGL",
          "alpUL",
          "altUL",
          "apoA1GL",
          "cholesterolMmolL",
          "chronologicalAge",
          "creatUmolL",
          "crpMgL",
          "cystatinCMgL",
          "ggtUL",
          "gluMmolL",
          "hba1cMmolMol",
          "lymPc",
          "mchPg",
          "mcvFL",
          "monocytePc",
          "neutrophilPc",
          "rbc10e12L",
          "rdwPc",
          "shbgNmolL",
          "ureaMmolL",
          "vitaminDNmolL",
          "wbc1000cellsuL"
        ],
        "type": "object",
        "properties": {
          "chronologicalAge": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "Chronological age in years at the biomarker measurement date.",
            "format": "double",
            "example": 45.5
          },
          "albGL": {
            "maximum": 200,
            "minimum": 0.1,
            "type": "number",
            "description": "Albumin in g/L.",
            "format": "double",
            "example": 46
          },
          "alpUL": {
            "maximum": 10000,
            "minimum": 0.1,
            "type": "number",
            "description": "Alkaline phosphatase in U/L.",
            "format": "double",
            "example": 51
          },
          "ureaMmolL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Urea in mmol/L.",
            "format": "double",
            "example": 5.4
          },
          "cholesterolMmolL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Total cholesterol in mmol/L.",
            "format": "double",
            "example": 4.8
          },
          "creatUmolL": {
            "maximum": 3000,
            "minimum": 0.1,
            "type": "number",
            "description": "Creatinine in umol/L.",
            "format": "double",
            "example": 88.4
          },
          "cystatinCMgL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Cystatin C in mg/L.",
            "format": "double",
            "example": 0.85
          },
          "hba1cMmolMol": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "HbA1c in mmol/mol.",
            "format": "double",
            "example": 34
          },
          "crpMgL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "C-reactive protein in mg/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 0.8
          },
          "ggtUL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "Gamma-glutamyl transferase in U/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 22
          },
          "rbc10e12L": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Red blood cell count in 10e12/L.",
            "format": "double",
            "example": 4.7
          },
          "mcvFL": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "Mean corpuscular volume in fL.",
            "format": "double",
            "example": 96.7
          },
          "rdwPc": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Red cell distribution width percentage.",
            "format": "double",
            "example": 12.5
          },
          "wbc1000cellsuL": {
            "maximum": 1000,
            "minimum": 0.1,
            "type": "number",
            "description": "White blood cell count in 1000 cells/uL.",
            "format": "double",
            "example": 6.3
          },
          "monocytePc": {
            "maximum": 100,
            "minimum": 0,
            "type": "number",
            "description": "Monocyte percentage.",
            "format": "double",
            "example": 7.2
          },
          "neutrophilPc": {
            "maximum": 100,
            "minimum": 0,
            "type": "number",
            "description": "Neutrophil percentage.",
            "format": "double",
            "example": 58.1
          },
          "lymPc": {
            "maximum": 100,
            "minimum": 0,
            "type": "number",
            "description": "Lymphocyte percentage.",
            "format": "double",
            "example": 25.5
          },
          "altUL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "Alanine aminotransferase in U/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 24
          },
          "shbgNmolL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "Sex hormone-binding globulin in nmol/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 45
          },
          "vitaminDNmolL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "Vitamin D in nmol/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 85
          },
          "gluMmolL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Glucose in mmol/L.",
            "format": "double",
            "example": 5.05
          },
          "mchPg": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Mean corpuscular hemoglobin in pg.",
            "format": "double",
            "example": 31.5
          },
          "apoA1GL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Apolipoprotein A1 in g/L.",
            "format": "double",
            "example": 1.55
          }
        },
        "additionalProperties": false,
        "description": "Inputs for calculating the Longevity World Cup Bortz Age result. Units match the public athlete biomarker JSON; monocyte and neutrophil counts are derived from WBC and percentage values."
      },
      "BortzAgeCalculationResult": {
        "type": "object",
        "properties": {
          "biologicalAge": {
            "type": "number",
            "description": "Calculated Bortz Age in years.",
            "format": "double"
          },
          "biologicalAgeDifference": {
            "type": "number",
            "description": "Signed biological age minus chronological age. Lower and more negative values rank higher within the Pro field.",
            "format": "double"
          },
          "paceOfAging": {
            "type": "number",
            "description": "Calculated biological age divided by chronological age.",
            "format": "double"
          },
          "biologicalAgeAcceleration": {
            "type": "number",
            "description": "Bortz model biological age acceleration before it is added to chronological age.",
            "format": "double"
          },
          "derivedMonocyteCount10e9L": {
            "type": "number",
            "description": "Monocyte count derived from WBC and monocyte percentage.",
            "format": "double"
          },
          "derivedNeutrophilCount10e9L": {
            "type": "number",
            "description": "Neutrophil count derived from WBC and neutrophil percentage.",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Calculated Bortz Age result, biological age acceleration, and derived count inputs."
      },
      "HypotheticalRankNeighbor": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "One-based rank in the preview field.",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "description": "Athlete display name, or the hypothetical row label.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Track for the row, either Pro or Amateur.",
            "nullable": true
          },
          "ageDifference": {
            "type": "number",
            "description": "Signed age difference used for sorting.",
            "format": "double"
          },
          "isHypothetical": {
            "type": "boolean",
            "description": "True for the submitted hypothetical result row."
          }
        },
        "additionalProperties": false,
        "description": "One neighboring row in a hypothetical rank preview."
      },
      "HypotheticalRankRequest": {
        "required": [
          "calculator"
        ],
        "type": "object",
        "properties": {
          "calculator": {
            "minLength": 1,
            "enum": [
              "pheno",
              "bortz"
            ],
            "type": "string",
            "description": "Biological aging clock to preview: `pheno` for Amateur or `bortz` for Pro.",
            "example": "pheno"
          },
          "chronologicalAge": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "Chronological age in years at the measurement date.",
            "format": "double",
            "example": 45.5
          },
          "biologicalAge": {
            "maximum": 300,
            "minimum": 0,
            "type": "number",
            "description": "Biological age result in years from the selected clock.",
            "format": "double",
            "example": 38.2
          },
          "birthYear": {
            "maximum": 2100,
            "minimum": 1900,
            "type": "integer",
            "description": "Birth year used for tie-breaking against the current field.",
            "format": "int32",
            "example": 1980
          },
          "birthMonth": {
            "maximum": 12,
            "minimum": 1,
            "type": "integer",
            "description": "Birth month used for tie-breaking against the current field.",
            "format": "int32",
            "example": 6
          },
          "birthDay": {
            "maximum": 31,
            "minimum": 1,
            "type": "integer",
            "description": "Birth day used for tie-breaking against the current field.",
            "format": "int32",
            "example": 15
          }
        },
        "additionalProperties": false,
        "description": "Inputs for previewing where a hypothetical biological age result would rank in the current Ultimate League field.",
        "example": {
          "calculator": "pheno",
          "chronologicalAge": 45.5,
          "biologicalAge": 38.2,
          "birthYear": 1980,
          "birthMonth": 6,
          "birthDay": 15
        }
      },
      "HypotheticalRankResult": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "One-based rank the hypothetical result would receive in the selected field.",
            "format": "int32"
          },
          "fieldSize": {
            "type": "integer",
            "description": "Field size including the hypothetical result.",
            "format": "int32"
          },
          "currentFieldSize": {
            "type": "integer",
            "description": "Current field size excluding the hypothetical result.",
            "format": "int32"
          },
          "leagueName": {
            "type": "string",
            "description": "League used for the preview. Currently Ultimate League.",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Track used for the preview, either Pro or Amateur.",
            "nullable": true
          },
          "ageDifference": {
            "type": "number",
            "description": "Signed biological age difference, calculated as biological age minus chronological age. Lower and more negative values rank higher within the same track.",
            "format": "double"
          },
          "nearby": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HypotheticalRankNeighbor"
            },
            "description": "Nearby athletes around the hypothetical result after sorting.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Result returned by a hypothetical Ultimate League rank preview."
      },
      "PhenoAgeCalculationRequest": {
        "required": [
          "albGL",
          "alpUL",
          "chronologicalAge",
          "creatUmolL",
          "crpMgL",
          "gluMmolL",
          "lymPc",
          "mcvFL",
          "rdwPc",
          "wbc1000cellsuL"
        ],
        "type": "object",
        "properties": {
          "chronologicalAge": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "Chronological age in years at the biomarker measurement date.",
            "format": "double",
            "example": 45.5
          },
          "albGL": {
            "maximum": 200,
            "minimum": 0.1,
            "type": "number",
            "description": "Albumin in g/L.",
            "format": "double",
            "example": 46
          },
          "creatUmolL": {
            "maximum": 3000,
            "minimum": 0.1,
            "type": "number",
            "description": "Creatinine in umol/L.",
            "format": "double",
            "example": 88.4
          },
          "gluMmolL": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Glucose in mmol/L.",
            "format": "double",
            "example": 5.05
          },
          "crpMgL": {
            "maximum": 10000,
            "minimum": 1E-06,
            "type": "number",
            "description": "C-reactive protein in mg/L. Must be greater than 0 because the clock applies a logarithm.",
            "format": "double",
            "example": 0.8
          },
          "wbc1000cellsuL": {
            "maximum": 1000,
            "minimum": 0.1,
            "type": "number",
            "description": "White blood cell count in 1000 cells/uL.",
            "format": "double",
            "example": 6.3
          },
          "lymPc": {
            "maximum": 100,
            "minimum": 0,
            "type": "number",
            "description": "Lymphocyte percentage.",
            "format": "double",
            "example": 25.5
          },
          "mcvFL": {
            "maximum": 300,
            "minimum": 1,
            "type": "number",
            "description": "Mean corpuscular volume in fL.",
            "format": "double",
            "example": 96.7
          },
          "rdwPc": {
            "maximum": 100,
            "minimum": 0.1,
            "type": "number",
            "description": "Red cell distribution width percentage.",
            "format": "double",
            "example": 12.5
          },
          "alpUL": {
            "maximum": 10000,
            "minimum": 0.1,
            "type": "number",
            "description": "Alkaline phosphatase in U/L.",
            "format": "double",
            "example": 51
          }
        },
        "additionalProperties": false,
        "description": "Inputs for calculating the Longevity World Cup Pheno Age result. Units match the public athlete biomarker JSON."
      },
      "PhenoAgeCalculationResult": {
        "type": "object",
        "properties": {
          "biologicalAge": {
            "type": "number",
            "description": "Calculated Pheno Age in years.",
            "format": "double"
          },
          "biologicalAgeDifference": {
            "type": "number",
            "description": "Signed biological age minus chronological age. Lower and more negative values rank higher within the Amateur field.",
            "format": "double"
          },
          "paceOfAging": {
            "type": "number",
            "description": "Calculated biological age divided by chronological age.",
            "format": "double"
          },
          "domainContributions": {
            "$ref": "#/components/schemas/PhenoAgeDomainContributions"
          }
        },
        "additionalProperties": false,
        "description": "Calculated Pheno Age result and derived values useful for rank previews."
      },
      "PhenoAgeDomainContributions": {
        "type": "object",
        "properties": {
          "liver": {
            "type": "number",
            "description": "Albumin and alkaline phosphatase contribution value.",
            "format": "double"
          },
          "kidney": {
            "type": "number",
            "description": "Creatinine contribution value.",
            "format": "double"
          },
          "metabolic": {
            "type": "number",
            "description": "Glucose contribution value.",
            "format": "double"
          },
          "inflammation": {
            "type": "number",
            "description": "C-reactive protein contribution value.",
            "format": "double"
          },
          "immune": {
            "type": "number",
            "description": "White blood cell, lymphocyte, MCV, and RDW contribution value.",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Pheno Age model contribution values grouped by biological domain."
      },
      "PublicAthleteApiDocument": {
        "type": "object",
        "properties": {
          "Name": {
            "type": "string",
            "description": "Original public athlete name.",
            "nullable": true
          },
          "DisplayName": {
            "type": "string",
            "description": "Preferred display name when it differs from the original public name.",
            "nullable": true
          },
          "MediaContact": {
            "type": "string",
            "description": "Public media contact URL or handle for attribution and outreach.",
            "nullable": true
          },
          "DateOfBirth": {
            "$ref": "#/components/schemas/PublicDateOfBirthApiDocument"
          },
          "Biomarkers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicBiomarkerRecordApiDocument"
            },
            "description": "Public biomarker records submitted by the athlete.",
            "nullable": true
          },
          "Division": {
            "type": "string",
            "description": "Competition division, such as Men's, Women's, or Open.",
            "nullable": true
          },
          "Flag": {
            "type": "string",
            "description": "Public flag or place label selected by the athlete.",
            "nullable": true
          },
          "Why": {
            "type": "string",
            "description": "Athlete-provided reason for participating when public.",
            "nullable": true
          },
          "PersonalLink": {
            "type": "string",
            "description": "Optional public personal website or profile link.",
            "nullable": true
          },
          "PodcastLink": {
            "type": "string",
            "description": "Optional public podcast or interview link.",
            "nullable": true
          },
          "ExclusiveLeague": {
            "type": "string",
            "description": "Optional special league assignment, currently used for exclusive leagues such as Prosperan.",
            "nullable": true
          },
          "CrowdAge": {
            "type": "number",
            "description": "Median realistic age guessed by visitors in Guess My Age.",
            "format": "double"
          },
          "CrowdCount": {
            "type": "integer",
            "description": "Number of accepted realistic crowd age guesses.",
            "format": "int32"
          },
          "PhenoAgeImprovementFromWorst": {
            "type": "number",
            "description": "Latest eligible pheno age minus worst eligible pheno age when at least two eligible pheno age submissions exist.",
            "format": "double",
            "nullable": true
          },
          "BortzAgeImprovementFromWorst": {
            "type": "number",
            "description": "Latest eligible bortz age minus worst eligible bortz age when at least two eligible bortz age submissions exist.",
            "format": "double",
            "nullable": true
          },
          "IsNew": {
            "type": "boolean",
            "description": "Whether the athlete was recently added to the public field."
          },
          "AthleteSlug": {
            "type": "string",
            "description": "Stable slug used by API clients and public athlete URLs.",
            "nullable": true
          },
          "ProfilePic": {
            "type": "string",
            "description": "Versioned public profile picture URL when available.",
            "nullable": true
          },
          "ProfilePicThumb": {
            "type": "string",
            "description": "Small generated profile picture thumbnail URL when available.",
            "nullable": true
          },
          "ProfilePicLeaderboardThumb": {
            "type": "string",
            "description": "Leaderboard-sized generated profile picture thumbnail URL when available.",
            "nullable": true
          },
          "Proofs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Versioned public proof asset URLs when available.",
            "nullable": true
          },
          "Badges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PublicBadgeApiDocument"
            },
            "description": "Computed public badges awarded to the athlete.",
            "nullable": true
          }
        },
        "description": "A hydrated public longevity athlete record. The live endpoint may include additional public fields as the competition data model evolves."
      },
      "PublicBadgeApiDocument": {
        "type": "object",
        "properties": {
          "BadgeLabel": {
            "type": "string",
            "description": "Human-readable badge label.",
            "nullable": true
          },
          "BadgeType": {
            "type": "string",
            "description": "Badge category or kind when provided by the badge system.",
            "nullable": true
          },
          "Place": {
            "type": "integer",
            "description": "Placement associated with a ranking badge when applicable.",
            "format": "int32",
            "nullable": true
          },
          "AwardedAt": {
            "type": "string",
            "description": "Award timestamp or date when provided by the badge system.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Public computed badge awarded to an athlete."
      },
      "PublicBiomarkerRecordApiDocument": {
        "type": "object",
        "properties": {
          "Date": {
            "type": "string",
            "description": "Measurement date in ISO date format.",
            "nullable": true
          },
          "AlbGL": {
            "type": "number",
            "description": "Albumin in g/L.",
            "format": "double",
            "nullable": true
          },
          "AlpUL": {
            "type": "number",
            "description": "Alkaline phosphatase in U/L.",
            "format": "double",
            "nullable": true
          },
          "AltUL": {
            "type": "number",
            "description": "Alanine aminotransferase in U/L.",
            "format": "double",
            "nullable": true
          },
          "ApoA1GL": {
            "type": "number",
            "description": "Apolipoprotein A1 in g/L.",
            "format": "double",
            "nullable": true
          },
          "CholesterolMmolL": {
            "type": "number",
            "description": "Total cholesterol in mmol/L.",
            "format": "double",
            "nullable": true
          },
          "CreatUmolL": {
            "type": "number",
            "description": "Creatinine in umol/L.",
            "format": "double",
            "nullable": true
          },
          "CrpMgL": {
            "type": "number",
            "description": "C-reactive protein in mg/L.",
            "format": "double",
            "nullable": true
          },
          "CystatinCMgL": {
            "type": "number",
            "description": "Cystatin C in mg/L.",
            "format": "double",
            "nullable": true
          },
          "GgtUL": {
            "type": "number",
            "description": "Gamma-glutamyl transferase in U/L.",
            "format": "double",
            "nullable": true
          },
          "GluMmolL": {
            "type": "number",
            "description": "Glucose in mmol/L.",
            "format": "double",
            "nullable": true
          },
          "Hba1cMmolMol": {
            "type": "number",
            "description": "HbA1c in mmol/mol.",
            "format": "double",
            "nullable": true
          },
          "LymPc": {
            "type": "number",
            "description": "Lymphocyte percentage.",
            "format": "double",
            "nullable": true
          },
          "MchPg": {
            "type": "number",
            "description": "Mean corpuscular hemoglobin in pg.",
            "format": "double",
            "nullable": true
          },
          "McvFL": {
            "type": "number",
            "description": "Mean corpuscular volume in fL.",
            "format": "double",
            "nullable": true
          },
          "MonocytePc": {
            "type": "number",
            "description": "Monocyte percentage.",
            "format": "double",
            "nullable": true
          },
          "NeutrophilPc": {
            "type": "number",
            "description": "Neutrophil percentage.",
            "format": "double",
            "nullable": true
          },
          "Rbc10e12L": {
            "type": "number",
            "description": "Red blood cell count in 10e12/L.",
            "format": "double",
            "nullable": true
          },
          "RdwPc": {
            "type": "number",
            "description": "Red cell distribution width percentage.",
            "format": "double",
            "nullable": true
          },
          "ShbgNmolL": {
            "type": "number",
            "description": "Sex hormone-binding globulin in nmol/L.",
            "format": "double",
            "nullable": true
          },
          "UreaMmolL": {
            "type": "number",
            "description": "Urea in mmol/L.",
            "format": "double",
            "nullable": true
          },
          "VitaminDNmolL": {
            "type": "number",
            "description": "Vitamin D in nmol/L.",
            "format": "double",
            "nullable": true
          },
          "Wbc1000cellsuL": {
            "type": "number",
            "description": "White blood cell count in 1000 cells/uL.",
            "format": "double",
            "nullable": true
          }
        },
        "description": "One dated biomarker record. Athletes may have Pheno Age-only records, Bortz Age records, or records that contain fields for both clocks."
      },
      "PublicDataErrorResponse": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "Human-readable error message.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Simple public API error body returned for semantic validation failures."
      },
      "PublicDateOfBirthApiDocument": {
        "type": "object",
        "properties": {
          "Year": {
            "type": "integer",
            "description": "Four-digit birth year.",
            "format": "int32"
          },
          "Month": {
            "type": "integer",
            "description": "Birth month from 1 to 12.",
            "format": "int32"
          },
          "Day": {
            "type": "integer",
            "description": "Birth day from 1 to 31.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Date of birth object stored as separate year, month, and day fields."
      },
      "ValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          }
        },
        "additionalProperties": { }
      }
    }
  },
  "security": [
    { }
  ],
  "tags": [
    {
      "name": "Data"
    }
  ]
}