{"sensor_state":{"heading_deg":{"unit":"degrees","range":[0,360],"desc":"compass bearing, 0=N clockwise"},"altitude_m":{"unit":"meters","range":[-500,9000],"desc":"altitude above sea level"},"speed_mps":{"unit":"m/s","range":[0,120],"desc":"ground speed"},"accuracy_m":{"unit":"meters","range":[0,10000],"desc":"horizontal GPS accuracy (lower = better)"},"pitch_deg":{"unit":"degrees","range":[-90,90],"desc":"device pitch"},"roll_deg":{"unit":"degrees","range":[-180,180],"desc":"device roll"},"vertical_accuracy_m":{"unit":"meters","range":[0,10000],"desc":"vertical GPS accuracy"},"source":{"unit":"enum","values":["phone","watch","cart","launch_monitor","simulator","other"],"desc":"sensor source"}},"standard":"Moments","license":"CC0-1.0","ingest":"POST /api/v1/moments (keyed)","principle":"Send what you have. Any golf-relevant signal is welcome — breadcrumbs are the floor, richer signals are additive. One flexible event absorbs them all; omit what you don't have.","common_columns":["moment_type","lat","lng","accuracy_m","recorded_at","course_id","hole","player_id","session_id","device"],"units":"SI preferred — temp_c, wind_mps, distance_m, altitude_m, pressure_hpa, *_deg, heart_rate bpm.","note":"Type-specific data rides in `payload` — one flexible store, no per-type tables. These are the canonical payload keys so every connector names fields identically.","types":{"breadcrumb":{"from":"phone/watch GPS + barometer","payload":{"altitude_m":"","speed_mps":"","heading_deg":"+=clockwise from north","pressure_hpa":"barometer (elevation input)","v_accuracy_m":""}},"motion":{"from":"IMU (accel/gyro/mag)","payload":{"accel":"[x,y,z]","gyro":"[x,y,z]","mag":"[x,y,z]","sample_hz":"","samples":"[{t,accel,gyro}] for high-rate"}},"swing":{"from":"phone/watch/Hackmotion/Blast/deWiz","payload":{"tempo":"","wrist_angle":"","plane":"","peak_accel_mps2":"","speed_profile":"number[]"}},"putt":{"from":"putting sensor / LM putt mode","payload":{"speed":"","path":"","face":"","roll_pct":"","distance":""}},"biometric":{"from":"Apple Watch / Garmin / Whoop / Health Connect","consent":"opt-in only — health data; send solely with explicit user consent","payload":{"heart_rate":"bpm","hrv_ms":"","vo2max":"","active_energy_kcal":"","resp_rate":"","steps":"","cadence_spm":"","pulse_ox_pct":"","body_battery":"Garmin","stress":"Garmin"}},"condition":{"from":"WeatherKit / onboard / station","payload":{"temp_c":"","wind_mps":"","wind_dir_deg":"","humidity_pct":"","pressure_hpa":"","source":"weatherkit|googleweather|station|onboard"}},"club":{"from":"Arccos / Garmin CT10 / Shot Scope","payload":{"club":"e.g. '7i'","event":"selected|struck","specs":"object"}},"score":{"from":"scoring app / GHIN","payload":{"strokes":"","putts":"","penalties":""}},"pin":{"from":"rangefinder / sighting","payload":{"color":"","note":""}},"tee":{"from":"GPS","payload":{}},"green":{"from":"GPS","payload":{}},"shot":{"from":"LM / sim","payload":{"note":"lightweight position marker — full shots go to POST /api/v1/shots (OpenShot)"}},"presence":{"from":"live location","note":"group/opt-in only — ephemeral, scoped by visibility; default private","payload":{"visibility":"private|group|mutuals (default private)"}},"message":{"from":"app P2P chat","note":"simple direct/group message; consent-scoped, broadcastable via the Live Room","payload":{"to":"recipient player_id or group jti","body":"text","thread_id":"optional conversation id"}}}}