Skip to content

Shot Data Model ​

A Shot is the record Element produces for a single struck ball.

DRAFT

Field names, units, and which metrics are measured vs. derived are all placeholders.

Ball data ​

FieldTypeUnitNotes
ballSpeednumbermphTODO
launchAnglenumberdegreesTODO
launchDirectionnumberdegreesNegative left, positive right — TODO confirm
backSpinnumberrpmTODO
sideSpinnumberrpmTODO
spinAxisnumberdegreesTODO

Club data ​

FieldTypeUnitNotes
clubSpeednumbermphTODO
clubPathnumberdegreesTODO
faceAnglenumberdegreesTODO
attackAnglenumberdegreesTODO
smashFactornumberratioDerived: ballSpeed / clubSpeed

Calculated flight ​

FieldTypeUnitNotes
carryDistancenumberyardsTODO — state the atmospheric model
totalDistancenumberyardsTODO
apexnumberfeetTODO
offlinenumberyardsTODO

Metadata ​

FieldTypeNotes
idstringUnique shot ID
sessionIdstringSession this shot belongs to
timestampstringISO 8601, UTC
clubstring | nullClub selected in the app, if any
confidenceTODOTODO: how a low-confidence reading is signalled

Example ​

json
{
  "id": "shot_TODO",
  "sessionId": "sess_TODO",
  "timestamp": "2026-01-01T00:00:00Z",
  "club": "7i",
  "ball": {
    "ballSpeed": 0,
    "launchAngle": 0,
    "backSpin": 0
  },
  "club_data": {
    "clubSpeed": 0,
    "clubPath": 0,
    "faceAngle": 0
  }
}

Missing values ​

TODO: Explain what happens when a metric can't be measured — is the field null, omitted, or estimated?