/** * This file was auto-generated by openapi-typescript. * Do not make direct changes to the file. */ export type paths = { "/health": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Health * @description Liveness probe — returns healthy if the service is running. */ get: operations["health_health_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/ready": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Ready * @description Readiness probe — returns ready if the database is reachable. */ get: operations["ready_ready_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/locations": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Locations * @description List OwnTracks locations with filtering and pagination. * * Returns paginated GPS location data recorded by OwnTracks mobile app. * Filter by device ID and date range. Includes battery, accuracy, and connection metadata. */ get: operations["list_locations_api_v1_locations_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/locations/devices": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Devices * @description List all distinct device IDs. */ get: operations["list_devices_api_v1_locations_devices_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/locations/date-range": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Location Date Range * @description Get the earliest and latest location timestamps. */ get: operations["location_date_range_api_v1_locations_date_range_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/locations/count": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Location Count * @description Get total location count with optional filters. */ get: operations["location_count_api_v1_locations_count_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/locations/{location_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Location * @description Get a single location by ID, including raw payload. */ get: operations["get_location_api_v1_locations__location_id__get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/sync": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Trigger Sync * @description Trigger an on-demand Garmin sync via the in-cluster garmin-sync service. */ post: operations["trigger_sync_api_v1_garmin_sync_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/date-range": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Garmin Date Range * @description Get the earliest and latest Garmin activity timestamps. */ get: operations["garmin_date_range_api_v1_garmin_date_range_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activities * @description List Garmin activities with filtering and pagination. * * Returns paginated Garmin cycling/running activities with track point counts. * Filter by sport type or date range. Sort by start time, distance, duration, etc. */ get: operations["list_activities_api_v1_garmin_activities_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/sports": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Sports * @description List distinct sport types with activity counts. */ get: operations["list_sports_api_v1_garmin_sports_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/device-counts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Device Counts * @description List Garmin recording device labels with activity counts. * * Activities without recording-device metadata are grouped under ``Manual``. * Firmware/software version is intentionally excluded from this aggregate. */ get: operations["list_device_counts_api_v1_garmin_device_counts_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activity-totals": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Totals * @description Aggregate Garmin activities into period totals (week / month / year). * * Buckets are computed via ``DATE_TRUNC(period, start_time)`` and ordered by * ``period_start`` ascending. Each row contains activity count plus sum of * distance, duration, ascent, and calories. Empty result returns ``[]``. */ get: operations["list_activity_totals_api_v1_garmin_activity_totals_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Activity * @description Get a single Garmin activity by ID with track point count. */ get: operations["get_activity_api_v1_garmin_activities__activity_id__get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; /** * Patch Activity * @description Manually patch Garmin activity fields (auth required when OAuth2 is enabled). */ patch: operations["patch_activity_api_v1_garmin_activities__activity_id__patch"]; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/tracks": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Track Points * @description List track points for a specific activity. * * Returns GPS track points with altitude, speed, heart rate, and cadence data. * Use the `simplify` parameter to apply Douglas-Peucker line simplification * for efficient map rendering of the complete route. */ get: operations["list_track_points_api_v1_garmin_activities__activity_id__tracks_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/chart-data": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Chart Data * @description Return track points for chart rendering, in full or time-bucketed. * * Provides time-series data (altitude, speed, heart rate, cadence) for an * activity, ordered by timestamp. Uniqueness of the raw (unbinned) series is * guaranteed by the UNIQUE(activity_id, timestamp) database constraint. Use * `bins` to downsample large activities instead of paying to fetch and * serialize every raw point. */ get: operations["get_chart_data_api_v1_garmin_activities__activity_id__chart_data_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/climbs": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Climbs * @description Return Garmin-native ClimbPro typed splits for an activity. */ get: operations["list_activity_climbs_api_v1_garmin_activities__activity_id__climbs_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/laps": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Laps * @description Return Garmin-native or derived laps for an activity. */ get: operations["list_activity_laps_api_v1_garmin_activities__activity_id__laps_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/sensors": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Sensors * @description Return the FIT device_info rows (head unit + paired sensors) for an activity. */ get: operations["list_activity_sensors_api_v1_garmin_activities__activity_id__sensors_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/weather": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Activity Weather * @description Return Open-Meteo weather conditions for an activity's start location/time. * * Returns ``null`` (not 404) when the activity exists but hasn't been * backfilled with weather yet — garmin-sync's weather backfill job fills * this in asynchronously. */ get: operations["get_activity_weather_api_v1_garmin_activities__activity_id__weather_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/weather-hourly": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Weather Hourly * @description Return route-sampled, hour-by-hour Open-Meteo weather for an activity. * * Unlike ``/weather`` (a single "conditions at the start" snapshot), each * row here is sampled at the GPS location the athlete was actually at * during that hour. Returns an empty list (not 404) when the activity * exists but hasn't been hourly-backfilled yet. */ get: operations["list_activity_weather_hourly_api_v1_garmin_activities__activity_id__weather_hourly_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/laps": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Laps * @description Batch laps across activities for cross-activity comparison. * * Returns activities (newest first) that have at least one lap, each with * its laps ordered by ``lap_index`` ascending, so lap N can be compared * across dates. Pagination applies to activities, not individual laps. */ get: operations["list_laps_api_v1_garmin_laps_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/activities/{activity_id}/addresses": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Activity Addresses * @description Return all reverse-geocoded addresses for a Garmin activity, in timestamp order. * * Includes start, end, and mid-route waypoints as persisted by the Garmin * geocoding pipeline. */ get: operations["list_activity_addresses_api_v1_garmin_activities__activity_id__addresses_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segment-efforts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Segment Efforts * @description Rank activity efforts over an ad-hoc segment defined by start/end coordinates. * * Matches raw GPS track points with PostGIS: an activity qualifies when its * route passes within ``tolerance_meters`` of the start point and, later in * time, within tolerance of the end point (same direction of travel). For each * activity the shortest such start→end traversal is used, and efforts are * ranked fastest-first. Stateless (no stored segment) — the coordinate pair can * be sourced from a detected climb or lap. */ get: operations["list_segment_efforts_api_v1_garmin_segment_efforts_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segments": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Segments * @description List saved segments (paths), newest first. */ get: operations["list_segments_api_v1_garmin_segments_get"]; put?: never; /** * Create Segment * @description Save a new segment (path) from a climb, lap, or manual selection (auth required). * * distance_meters is computed server-side from GPS data rather than * trusting the client -- Garmin devices can report a lap's own recorded * distance (garmin_activity_laps.distance_meters) that disagrees sharply * with that same lap's actual track points (e.g. GPS degradation near * large structures during an auto-lap-by-distance trigger), and the * client (a "save this lap/climb as a segment" button) otherwise passes * that value straight through with no validation. */ post: operations["create_segment_api_v1_garmin_segments_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segments/{segment_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Segment * @description Get a single saved segment by ID. */ get: operations["get_segment_api_v1_garmin_segments__segment_id__get"]; put?: never; post?: never; /** * Delete Segment * @description Delete a saved segment (auth required). * * If the segment has been pushed to Garmin Connect (``garmin_segment_uuid`` is * set) it is marked ``delete_pending`` so the garmin-sync agent removes it from * Garmin and then deletes the row (end-to-end delete). Segments that were never * synced are removed immediately. Either way the segment stops appearing in the * read endpoints right away. */ delete: operations["delete_segment_api_v1_garmin_segments__segment_id__delete"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segments/{segment_id}/efforts": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Segment Efforts * @description Rank activity efforts over a saved segment (matches the saved start/end corridor). */ get: operations["get_segment_efforts_api_v1_garmin_segments__segment_id__efforts_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segments/{segment_id}/effort-series": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Segment Effort Series * @description Return one effort's speed/HR series binned by distance along the segment. * * Bins are normalized to the effort's own traversal; each fraction is the * bin midpoint in the open interval between the start and end corridors. * Series from different activities are therefore directly comparable at the * same fraction despite GPS odometer drift. * The effort window is trusted client input from the efforts endpoint and is * returned normalized to UTC; an arbitrary window merely aggregates the * caller's own read-only track data. */ get: operations["get_segment_effort_series_api_v1_garmin_segments__segment_id__effort_series_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/garmin/segments/{segment_id}/effort-series/batch": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Get Segment Effort Series Batch * @description Return multiple effort series in request order using one database query. */ post: operations["get_segment_effort_series_batch_api_v1_garmin_segments__segment_id__effort_series_batch_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/gps/unified": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Unified Gps * @description Query the unified_gps_points view combining OwnTracks + Garmin data. * * Merges OwnTracks location data and Garmin track points into a single * chronological stream. Filter by data source or date range. * * When no date filters are specified (both date_from and date_to omitted), * defaults to the last 90 days to avoid expensive full-table scans on the * underlying 4M+ row tables. */ get: operations["list_unified_gps_api_v1_gps_unified_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/gps/daily-summary": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Daily Summary * @description Query the daily_activity_summary view for aggregated daily stats. * * Returns per-day aggregates including OwnTracks point counts, battery stats, * and Garmin activity metrics (distance, duration, heart rate, calories). * * When no date filters are specified (both date_from and date_to omitted), * defaults to the last 90 days to avoid expensive full-table aggregations. */ get: operations["daily_summary_api_v1_gps_daily_summary_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/gps/daily-summary/date-range": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Daily Summary Date Range * @description Get the earliest and latest activity dates available in the daily summary view. */ get: operations["daily_summary_date_range_api_v1_gps_daily_summary_date_range_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/reference-locations": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * List Reference Locations * @description List all reference locations. */ get: operations["list_reference_locations_api_v1_reference_locations_get"]; put?: never; /** * Create Reference Location * @description Create a new reference location (auth required). */ post: operations["create_reference_location_api_v1_reference_locations_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/reference-locations/{location_id}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Get Reference Location * @description Get a single reference location by ID. */ get: operations["get_reference_location_api_v1_reference_locations__location_id__get"]; /** * Update Reference Location * @description Update a reference location (auth required). */ put: operations["update_reference_location_api_v1_reference_locations__location_id__put"]; post?: never; /** * Delete Reference Location * @description Delete a reference location (auth required). */ delete: operations["delete_reference_location_api_v1_reference_locations__location_id__delete"]; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/spatial/nearby": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Find Nearby * @description Find GPS points within a radius of a given lat/lon using PostGIS ST_DWithin. * * Searches both OwnTracks locations and Garmin track points within the * specified radius. Results are sorted by distance from the center point. */ get: operations["find_nearby_api_v1_spatial_nearby_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/spatial/distance": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Calculate Distance * @description Calculate the distance in meters between two points using PostGIS ST_Distance. * * Uses geodesic (geography) distance for accurate results on the Earth's surface. */ get: operations["calculate_distance_api_v1_spatial_distance_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/spatial/within-reference/{name}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Within Reference * @description Find all GPS points within a named reference location's radius. * * Looks up a named reference location (e.g. 'home') and finds all GPS points * from OwnTracks and/or Garmin data within its configured radius. */ get: operations["within_reference_api_v1_spatial_within_reference__name__get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/reverse": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Reverse Geocode Point * @description Resolve a point from the dense cell cache, falling back to Pelias. * * Coordinates use the same indexed 4-decimal (~11 m) cell key as the Garmin * dense-geocoding pipeline. A successful cached row avoids a Pelias request; * misses and non-success rows are refreshed through Pelias and persisted. * Authentication is required because a fallback can mutate the cell cache. */ get: operations["reverse_geocode_point_api_v1_geocoding_reverse_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/reverse/batch": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Reverse Geocode Points Batch * @description Resolve up to 300 points from the dense cell cache in one database query. * * Unlike ``/reverse``, this never falls back to Pelias: an uncached or * unresolved cell is reported as ``status='pending'`` rather than resolved * synchronously, so the response time stays bounded regardless of how many * of the requested points have never been geocoded. Callers that need a * guaranteed resolution for a single point should use ``/reverse`` instead. */ post: operations["reverse_geocode_points_batch_api_v1_geocoding_reverse_batch_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/status": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Geocoding Status * @description Get geocoding coverage statistics for both OwnTracks and Garmin sources. * * The underlying aggregates scan large tables (millions of garmin_track_points) * and change slowly, so the response is cached per-process for * ``_STATUS_CACHE_TTL_SECONDS`` to avoid repeatedly running the heavy COUNT * queries on every dashboard poll. */ get: operations["geocoding_status_api_v1_geocoding_status_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/pelias-health": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** * Pelias Health * @description Probe the upstream Pelias reverse-geocoder with a known-good coordinate. * * Returns 200 with ``healthy=false`` rather than failing so that callers * (Airflow sensors, dashboards) can branch on the boolean. Used as a * pre-flight gate before batched trigger runs to avoid recording large * numbers of false-positive errors during a Pelias outage. */ get: operations["pelias_health_api_v1_geocoding_pelias_health_get"]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/trigger": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Trigger Geocoding * @description Trigger batch reverse-geocoding of OwnTracks location records (auth required). */ post: operations["trigger_geocoding_api_v1_geocoding_trigger_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/trigger/garmin": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Trigger Garmin Geocoding * @description Trigger batch reverse-geocoding of Garmin activity waypoints (auth required). */ post: operations["trigger_garmin_geocoding_api_v1_geocoding_trigger_garmin_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; "/api/v1/geocoding/trigger/garmin-dense": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; get?: never; put?: never; /** * Trigger Garmin Dense * @description Trigger batch reverse-geocoding of distinct 4dp GPS cells (auth required). */ post: operations["trigger_garmin_dense_api_v1_geocoding_trigger_garmin_dense_post"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; }; export type webhooks = Record; export type components = { schemas: { /** * DailyActivitySummary * @description Per-day aggregate combining OwnTracks location stats and Garmin activity metrics. * @example { * "activity_date": "2026-02-11", * "avg_accuracy": 4.89, * "avg_heart_rate": 142, * "garmin_activities": 1, * "garmin_sport": "cycling", * "max_battery": 100, * "min_battery": 64, * "owntracks_device": "iphone_stuart", * "owntracks_points": 1429, * "total_calories": 1689, * "total_distance_km": 50.6, * "total_duration_seconds": 6932 * } */ DailyActivitySummary: { /** * Activity Date * @description Calendar date in YYYY-MM-DD format */ activity_date?: string | null; /** * Owntracks Device * @description OwnTracks device that reported data for this day */ owntracks_device?: string | null; /** * Owntracks Points * @description Number of OwnTracks GPS points recorded */ owntracks_points?: number | null; /** * Min Battery * @description Lowest device battery percentage observed */ min_battery?: number | null; /** * Max Battery * @description Highest device battery percentage observed */ max_battery?: number | null; /** * Avg Accuracy * @description Mean horizontal GPS accuracy in meters */ avg_accuracy?: number | null; /** * Garmin Sport * @description Garmin sport type for activities on this day */ garmin_sport?: string | null; /** * Garmin Activities * @description Number of Garmin activities recorded */ garmin_activities?: number | null; /** * Total Distance Km * @description Combined Garmin activity distance in km */ total_distance_km?: number | null; /** * Total Duration Seconds * @description Combined Garmin activity duration in seconds */ total_duration_seconds?: number | null; /** * Avg Heart Rate * @description Mean heart rate across Garmin activities in BPM */ avg_heart_rate?: number | null; /** * Total Calories * @description Total calories burned across Garmin activities */ total_calories?: number | null; }; /** * DailySummaryDateRange * @description Earliest and latest activity dates available in the daily activity summary. * @example { * "max_date": "2026-04-06", * "min_date": "2024-01-15" * } */ DailySummaryDateRange: { /** * Min Date * Format: date * @description Earliest activity date with daily summary data */ min_date: string; /** * Max Date * Format: date * @description Latest activity date with daily summary data */ max_date: string; }; /** * DeviceInfo * @description Distinct OwnTracks device identifier. * @example { * "device_id": "iphone_stuart" * } */ DeviceInfo: { /** * Device Id * @description OwnTracks device identifier */ device_id: string; }; /** * DistanceResult * @description Geodesic distance calculation result between two geographic points. * @example { * "distance_meters": 5309.71, * "from_lat": 40.7128, * "from_lon": -74.006, * "to_lat": 40.758, * "to_lon": -73.9855 * } */ DistanceResult: { /** * Distance Meters * @description Geodesic distance between the two points in meters */ distance_meters: number; /** * From Lat * @description Origin latitude in decimal degrees */ from_lat: number; /** * From Lon * @description Origin longitude in decimal degrees */ from_lon: number; /** * To Lat * @description Destination latitude in decimal degrees */ to_lat: number; /** * To Lon * @description Destination longitude in decimal degrees */ to_lon: number; }; /** * GarminActivity * @description Summary of a Garmin Connect activity parsed from a FIT file. * @example { * "activity_id": "20932993811", * "aerobic_training_effect": 2.6, * "anaerobic_training_effect": 0, * "avg_cadence": 78, * "avg_heart_rate": 142, * "avg_pace": 3.513345, * "avg_respiration_rate": 25, * "avg_speed_kmh": 26.3, * "avg_temperature_c": 18, * "calories": 1689, * "created_at": "2026-02-09T23:56:37+00:00", * "device": { * "device_id": 3444454776, * "garmin_product": 4061, * "manufacturer": "garmin", * "model": "Edge 540 Solar", * "software_version": "31.30" * }, * "device_manufacturer": "garmin", * "distance_km": 50.6, * "duration_seconds": 6932, * "end_time": "2025-11-08T20:16:45+00:00", * "exercise_load": 48, * "hr_available": true, * "max_cadence": 112, * "max_heart_rate": 178, * "max_respiration_rate": 32, * "max_speed_kmh": 48.7, * "max_temperature_c": 22, * "min_heart_rate": 98, * "min_respiration_rate": 16, * "min_temperature_c": 14, * "moderate_intensity_minutes": 88, * "paved_distance_km": 21.09, * "sport": "cycling", * "start_time": "2025-11-08T18:21:13+00:00", * "sub_sport": "road", * "sweat_loss_ml": 1629, * "total_ascent_m": 385, * "total_descent_m": 380, * "total_distance": 50598.95, * "total_elapsed_time": 7200.5, * "total_intensity_minutes": 146, * "total_strokes": 4250, * "total_timer_time": 6932.1, * "track_point_count": 10707, * "unpaved_distance_km": 0.65, * "uploaded_at": "2026-02-09T23:56:37+00:00", * "vigorous_intensity_minutes": 29 * } */ GarminActivity: { /** * Activity Id * @description Garmin Connect activity identifier */ activity_id: string; /** * Sport * @description Primary sport type (e.g. cycling, running) */ sport: string; /** * Sub Sport * @description Sub-sport classification (e.g. road, trail) */ sub_sport?: string | null; /** * Start Time * @description Activity start time in UTC */ start_time?: string | null; /** * End Time * @description Activity end time in UTC */ end_time?: string | null; /** * Distance Km * @description Total distance in kilometres */ distance_km?: number | null; /** * Duration Seconds * @description Active duration in seconds (excludes pauses) */ duration_seconds?: number | null; /** * Avg Heart Rate * @description Average heart rate in beats per minute */ avg_heart_rate?: number | null; /** * Max Heart Rate * @description Maximum heart rate in beats per minute */ max_heart_rate?: number | null; /** * Hr Available * @description Whether this activity has usable heart-rate data in summary or track points * @default false */ hr_available: boolean; /** * Min Heart Rate * @description Minimum heart rate in beats per minute */ min_heart_rate?: number | null; /** * Aerobic Training Effect * @description Aerobic training effect score */ aerobic_training_effect?: number | null; /** * Anaerobic Training Effect * @description Anaerobic training effect score */ anaerobic_training_effect?: number | null; /** * Exercise Load * @description Exercise load score */ exercise_load?: number | null; /** * Avg Respiration Rate * @description Average respiration rate in breaths per minute */ avg_respiration_rate?: number | null; /** * Min Respiration Rate * @description Minimum respiration rate in breaths per minute */ min_respiration_rate?: number | null; /** * Max Respiration Rate * @description Maximum respiration rate in breaths per minute */ max_respiration_rate?: number | null; /** * Sweat Loss Ml * @description Estimated sweat loss in millilitres */ sweat_loss_ml?: number | null; /** * Moderate Intensity Minutes * @description Moderate intensity minutes */ moderate_intensity_minutes?: number | null; /** * Vigorous Intensity Minutes * @description Vigorous intensity minutes */ vigorous_intensity_minutes?: number | null; /** * Total Intensity Minutes * @description Total intensity minutes */ total_intensity_minutes?: number | null; /** * Paved Distance Km * @description Distance over paved surfaces in kilometres */ paved_distance_km?: number | null; /** * Unpaved Distance Km * @description Distance over unpaved surfaces in kilometres */ unpaved_distance_km?: number | null; /** * Avg Cadence * @description Average cadence in RPM */ avg_cadence?: number | null; /** * Max Cadence * @description Maximum cadence in RPM */ max_cadence?: number | null; /** * Total Strokes * @description Total activity strokes */ total_strokes?: number | null; /** * Calories * @description Total calories burned */ calories?: number | null; /** * Avg Speed Kmh * @description Average speed in km/h */ avg_speed_kmh?: number | null; /** * Max Speed Kmh * @description Maximum speed in km/h */ max_speed_kmh?: number | null; /** * Total Ascent M * @description Total elevation gain in meters */ total_ascent_m?: number | null; /** * Total Descent M * @description Total elevation loss in meters */ total_descent_m?: number | null; /** * Total Distance * @description Raw total distance in meters from FIT file */ total_distance?: number | null; /** * Avg Pace * @description Average pace in minutes per kilometre */ avg_pace?: number | null; /** * Device Manufacturer * @description Device manufacturer (e.g. garmin) */ device_manufacturer?: string | null; /** * Avg Temperature C * @description Average ambient temperature in degrees C */ avg_temperature_c?: number | null; /** * Min Temperature C * @description Minimum ambient temperature in degrees C */ min_temperature_c?: number | null; /** * Max Temperature C * @description Maximum ambient temperature in degrees C */ max_temperature_c?: number | null; /** * Total Elapsed Time * @description Total elapsed time in seconds (includes pauses) */ total_elapsed_time?: number | null; /** * Total Timer Time * @description Total timer time in seconds (active recording) */ total_timer_time?: number | null; /** * Created At * @description UTC timestamp when the record was inserted */ created_at?: string | null; /** * Uploaded At * @description UTC timestamp when the FIT file was uploaded */ uploaded_at?: string | null; /** * Track Point Count * @description Number of GPS track points in this activity */ track_point_count?: number | null; /** @description Recording device metadata */ device?: components["schemas"]["GarminDevice"] | null; }; /** * GarminActivityAddress * @description Reverse-geocoded address attached to a Garmin activity waypoint. */ GarminActivityAddress: { /** * Track Point Id * @description garmin_track_points.id this address was geocoded from */ track_point_id: number; /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Waypoint Kind * @description Role of this waypoint: start, end, or mid-route waypoint * @enum {string} */ waypoint_kind: "start" | "end" | "waypoint"; /** * Timestamp * Format: date-time * @description UTC timestamp of the track point this address was derived from */ timestamp: string; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Display Address * @description Full formatted address label from Pelias */ display_address?: string | null; /** * Street * @description Street name */ street?: string | null; /** * Housenumber * @description House or building number */ housenumber?: string | null; /** * Neighbourhood * @description Neighbourhood name */ neighbourhood?: string | null; /** * Locality * @description City or town */ locality?: string | null; /** * Region * @description State or province */ region?: string | null; /** * Country * @description Country name */ country?: string | null; /** * Postalcode * @description Postal or ZIP code */ postalcode?: string | null; /** * Confidence * @description Pelias confidence score (0-1) */ confidence?: number | null; /** * Status * @description Geocoding status: success, no_coverage, error, pending */ status: string; /** * Geocoded At * @description UTC timestamp when geocoding was performed */ geocoded_at?: string | null; }; /** * GarminActivityClimb * @description Garmin-native ClimbPro typed split for an activity. */ GarminActivityClimb: { /** * Id * @description Unique climb row identifier */ id: number; /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Source Split Index * @description Zero-based Garmin typed split order */ source_split_index: number; /** * Message Index * @description Garmin message index */ message_index?: number | null; /** * Split Type * @description Garmin split type label when provided */ split_type?: string | null; /** * Climb Type * @description Garmin ClimbPro typed split type */ climb_type?: string | null; /** * Start Time * @description UTC climb start time */ start_time?: string | null; /** * End Time * @description UTC climb end time */ end_time?: string | null; /** * Start Time Local * @description Local climb start time from Garmin */ start_time_local?: string | null; /** * Duration Seconds * @description Climb duration in seconds */ duration_seconds?: number | null; /** * Elapsed Duration Seconds * @description Elapsed climb duration in seconds */ elapsed_duration_seconds?: number | null; /** * Moving Duration Seconds * @description Moving climb duration in seconds */ moving_duration_seconds?: number | null; /** * Distance Meters * @description Climb distance in meters */ distance_meters?: number | null; /** * Elevation Gain Meters * @description Climb elevation gain in meters */ elevation_gain_meters?: number | null; /** * Elevation Loss Meters * @description Climb elevation loss in meters */ elevation_loss_meters?: number | null; /** * Start Elevation Meters * @description Climb start elevation in meters */ start_elevation_meters?: number | null; /** * Average Grade Percent * @description Average climb grade percent */ average_grade_percent?: number | null; /** * Max Grade Percent * @description Maximum climb grade percent */ max_grade_percent?: number | null; /** * Average Speed Mps * @description Average speed in meters per second */ average_speed_mps?: number | null; /** * Average Moving Speed Mps * @description Average moving speed in meters per second */ average_moving_speed_mps?: number | null; /** * Max Speed Mps * @description Maximum speed in meters per second */ max_speed_mps?: number | null; /** * Average Vertical Speed Mps * @description Average vertical speed in meters per second */ average_vertical_speed_mps?: number | null; /** * Average Elapsed Vertical Speed Mps * @description Average elapsed vertical speed in meters per second */ average_elapsed_vertical_speed_mps?: number | null; /** * Start Latitude * @description Climb start latitude */ start_latitude?: number | null; /** * Start Longitude * @description Climb start longitude */ start_longitude?: number | null; /** * End Latitude * @description Climb end latitude */ end_latitude?: number | null; /** * End Longitude * @description Climb end longitude */ end_longitude?: number | null; /** * Climb Pro Difficulty * @description Garmin ClimbPro difficulty */ climb_pro_difficulty?: string | null; /** * Calories * @description Calories recorded for this climb */ calories?: number | null; /** * Bmr Calories * @description BMR calories recorded for this climb */ bmr_calories?: number | null; /** * Average Temperature C * @description Average temperature in degrees C */ average_temperature_c?: number | null; /** * Min Temperature C * @description Minimum temperature in degrees C */ min_temperature_c?: number | null; /** * Max Temperature C * @description Maximum temperature in degrees C */ max_temperature_c?: number | null; /** * Created At * @description UTC timestamp when the row was inserted */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the row was last updated */ updated_at?: string | null; }; /** * GarminActivityLap * @description Garmin-native or derived activity lap row. */ GarminActivityLap: { /** * Id * @description Unique lap row identifier */ id: number; /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Lap Index * @description One-based lap order within the activity */ lap_index: number; /** * Start Time * @description UTC lap start time */ start_time?: string | null; /** * End Time * @description UTC lap end time */ end_time?: string | null; /** * Duration Seconds * @description Lap timer duration in seconds */ duration_seconds?: number | null; /** * Elapsed Duration Seconds * @description Lap elapsed duration in seconds */ elapsed_duration_seconds?: number | null; /** * Moving Duration Seconds * @description Lap moving duration in seconds */ moving_duration_seconds?: number | null; /** * Distance Meters * @description Lap distance in meters */ distance_meters?: number | null; /** * Paved Distance Meters * @description Lap paved distance in meters */ paved_distance_meters?: number | null; /** * Unpaved Distance Meters * @description Lap unpaved distance in meters */ unpaved_distance_meters?: number | null; /** * Avg Speed Mps * @description Average lap speed in meters per second */ avg_speed_mps?: number | null; /** * Avg Heart Rate * @description Average lap heart rate in bpm */ avg_heart_rate?: number | null; /** * Max Heart Rate * @description Maximum lap heart rate in bpm */ max_heart_rate?: number | null; /** * Total Ascent Meters * @description Lap elevation gain in meters */ total_ascent_meters?: number | null; /** * Total Descent Meters * @description Lap elevation loss in meters */ total_descent_meters?: number | null; /** * Calories * @description Calories recorded for this lap */ calories?: number | null; /** * Created At * @description UTC timestamp when the row was inserted */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the row was last updated */ updated_at?: string | null; }; /** * GarminActivityLapsGroup * @description Laps for a single activity within the batch laps response. */ GarminActivityLapsGroup: { /** @description Parent activity summary */ activity: components["schemas"]["GarminLapsActivity"]; /** * Laps * @description Laps ordered by lap_index ascending */ laps: components["schemas"]["GarminActivityLap"][]; }; /** * GarminActivityManualUpdate * @description Partial manual update payload for Garmin activity records. * @example { * "aerobic_training_effect": 3.2, * "avg_cadence": 82, * "avg_heart_rate": 141, * "device_manufacturer": "polar_electro", * "max_heart_rate": 172 * } */ GarminActivityManualUpdate: { /** * Sport * @description Primary sport type (e.g. cycling, running) */ sport?: string | null; /** * Sub Sport * @description Sub-sport classification (e.g. road, trail) */ sub_sport?: string | null; /** * Start Time * @description Activity start time in UTC */ start_time?: string | null; /** * End Time * @description Activity end time in UTC */ end_time?: string | null; /** * Distance Km * @description Total distance in kilometres */ distance_km?: number | null; /** * Duration Seconds * @description Active duration in seconds (excludes pauses) */ duration_seconds?: number | null; /** * Avg Heart Rate * @description Average heart rate in beats per minute */ avg_heart_rate?: number | null; /** * Max Heart Rate * @description Maximum heart rate in beats per minute */ max_heart_rate?: number | null; /** * Min Heart Rate * @description Minimum heart rate in beats per minute */ min_heart_rate?: number | null; /** * Aerobic Training Effect * @description Aerobic training effect score */ aerobic_training_effect?: number | null; /** * Anaerobic Training Effect * @description Anaerobic training effect score */ anaerobic_training_effect?: number | null; /** * Exercise Load * @description Exercise load score */ exercise_load?: number | null; /** * Avg Respiration Rate * @description Average respiration rate in breaths per minute */ avg_respiration_rate?: number | null; /** * Min Respiration Rate * @description Minimum respiration rate in breaths per minute */ min_respiration_rate?: number | null; /** * Max Respiration Rate * @description Maximum respiration rate in breaths per minute */ max_respiration_rate?: number | null; /** * Sweat Loss Ml * @description Estimated sweat loss in millilitres */ sweat_loss_ml?: number | null; /** * Moderate Intensity Minutes * @description Moderate intensity minutes */ moderate_intensity_minutes?: number | null; /** * Vigorous Intensity Minutes * @description Vigorous intensity minutes */ vigorous_intensity_minutes?: number | null; /** * Total Intensity Minutes * @description Total intensity minutes */ total_intensity_minutes?: number | null; /** * Paved Distance Km * @description Distance over paved surfaces in kilometres */ paved_distance_km?: number | null; /** * Unpaved Distance Km * @description Distance over unpaved surfaces in kilometres */ unpaved_distance_km?: number | null; /** * Avg Cadence * @description Average cadence in RPM */ avg_cadence?: number | null; /** * Max Cadence * @description Maximum cadence in RPM */ max_cadence?: number | null; /** * Total Strokes * @description Total activity strokes */ total_strokes?: number | null; /** * Calories * @description Total calories burned */ calories?: number | null; /** * Avg Speed Kmh * @description Average speed in km/h */ avg_speed_kmh?: number | null; /** * Max Speed Kmh * @description Maximum speed in km/h */ max_speed_kmh?: number | null; /** * Total Ascent M * @description Total elevation gain in meters */ total_ascent_m?: number | null; /** * Total Descent M * @description Total elevation loss in meters */ total_descent_m?: number | null; /** * Total Distance * @description Raw total distance in meters from FIT file */ total_distance?: number | null; /** * Avg Pace * @description Average pace in minutes per kilometre */ avg_pace?: number | null; /** * Device Manufacturer * @description Device manufacturer (e.g. garmin) */ device_manufacturer?: string | null; /** * Avg Temperature C * @description Average ambient temperature in degrees C */ avg_temperature_c?: number | null; /** * Min Temperature C * @description Minimum ambient temperature in degrees C */ min_temperature_c?: number | null; /** * Max Temperature C * @description Maximum ambient temperature in degrees C */ max_temperature_c?: number | null; /** * Total Elapsed Time * @description Total elapsed time in seconds (includes pauses) */ total_elapsed_time?: number | null; /** * Total Timer Time * @description Total timer time in seconds (active recording) */ total_timer_time?: number | null; /** * Uploaded At * @description UTC timestamp when the FIT file was uploaded */ uploaded_at?: string | null; }; /** * GarminActivitySensor * @description A FIT device_info record (head unit or paired sensor) for an activity. */ GarminActivitySensor: { /** * Id * @description Unique sensor row identifier */ id: number; /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Device Index * @description FIT device_index: 0 for the head unit, 1+ for each paired sensor */ device_index: number; /** * Is Primary * @description True for the recording device (head unit / FIT creator record) */ is_primary: boolean; /** * Device Type * @description FIT antplus_device_type (e.g. heart_rate, bike_power) */ device_type?: string | null; /** * Manufacturer * @description Sensor manufacturer (e.g. garmin) */ manufacturer?: string | null; /** * Garmin Product * @description Raw Garmin product enum id from the FIT file */ garmin_product?: number | null; /** * Product Name * @description Friendly product name (e.g. Edge 540 Solar, HRM-Pro) */ product_name?: string | null; /** * Serial Number * @description Sensor serial number, when reported */ serial_number?: number | null; /** * Software Version * @description Sensor firmware/software version */ software_version?: string | null; /** * Hardware Version * @description Sensor hardware revision */ hardware_version?: number | null; /** * Battery Status * @description FIT battery_status: new, good, ok, low, critical, charging, unknown */ battery_status?: string | null; /** * Battery Voltage * @description Sensor battery voltage */ battery_voltage?: number | null; /** * Ant Network * @description ANT network the sensor was paired on */ ant_network?: string | null; /** * Source Type * @description Sensor connection type (ant, antplus, bluetooth_low_energy, ...) */ source_type?: string | null; /** * Created At * @description UTC timestamp when the row was inserted */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the row was last updated */ updated_at?: string | null; }; /** * GarminActivityTotal * @description Aggregated Garmin activity totals for a single time bucket (week/month/year). * @example { * "activity_count": 12, * "period_start": "2025-05-01", * "total_ascent_m": 4521, * "total_calories": 18234, * "total_distance_km": 632.4, * "total_duration_seconds": 90123 * } */ GarminActivityTotal: { /** * Period Start * Format: date * @description UTC start date of the period bucket (week/month/year) */ period_start: string; /** * Activity Count * @description Number of activities recorded in the period */ activity_count: number; /** * Total Distance Km * @description Sum of distance in kilometres */ total_distance_km?: number | null; /** * Total Duration Seconds * @description Sum of active duration in seconds (excludes pauses) */ total_duration_seconds?: number | null; /** * Total Ascent M * @description Sum of elevation gain in meters */ total_ascent_m?: number | null; /** * Total Calories * @description Sum of calories burned */ total_calories?: number | null; }; /** * GarminActivityWeather * @description Open-Meteo weather conditions matched to an activity's start location/time. */ GarminActivityWeather: { /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Observed At * Format: date-time * @description UTC hourly bucket the reading was taken from */ observed_at: string; /** * Latitude * @description Latitude the weather was looked up for */ latitude: number; /** * Longitude * @description Longitude the weather was looked up for */ longitude: number; /** * Temperature C * @description Air temperature in degrees C */ temperature_c?: number | null; /** * Apparent Temperature C * @description Feels-like temperature in degrees C */ apparent_temperature_c?: number | null; /** * Relative Humidity Pct * @description Relative humidity percent */ relative_humidity_pct?: number | null; /** * Precipitation Mm * @description Total precipitation in millimeters */ precipitation_mm?: number | null; /** * Rain Mm * @description Rainfall in millimeters */ rain_mm?: number | null; /** * Snowfall Cm * @description Snowfall in centimeters */ snowfall_cm?: number | null; /** * Cloud Cover Pct * @description Total cloud cover percent */ cloud_cover_pct?: number | null; /** * Wind Speed Kmh * @description Wind speed in km/h */ wind_speed_kmh?: number | null; /** * Wind Gusts Kmh * @description Wind gust speed in km/h */ wind_gusts_kmh?: number | null; /** * Wind Direction Deg * @description Wind direction in degrees */ wind_direction_deg?: number | null; /** * Surface Pressure Hpa * @description Surface pressure in hPa */ surface_pressure_hpa?: number | null; /** * Weather Code * @description WMO weather interpretation code */ weather_code?: number | null; /** * Source * @description Open-Meteo API the row came from: archive or forecast */ source: string; /** * Is Provisional * @description True when sourced from the forecast API pending ERA5 archive settlement */ is_provisional: boolean; /** * Created At * @description UTC timestamp when the row was inserted */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the row was last updated */ updated_at?: string | null; }; /** * GarminActivityWeatherHourly * @description Route-sampled, hour-by-hour Open-Meteo weather for an activity. * * Unlike GarminActivityWeather (a single "conditions at the start" * snapshot), this is one row per hour the activity spans, each sampled at * the GPS location the athlete was actually at during that hour. */ GarminActivityWeatherHourly: { /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Hour Index * @description Zero-based hour offset from the activity start */ hour_index: number; /** * Observed At * Format: date-time * @description UTC hourly bucket the reading was taken from */ observed_at: string; /** * Latitude * @description Latitude sampled from the nearest track point for this hour */ latitude: number; /** * Longitude * @description Longitude sampled from the nearest track point for this hour */ longitude: number; /** * Temperature C * @description Air temperature in degrees C */ temperature_c?: number | null; /** * Apparent Temperature C * @description Feels-like temperature in degrees C */ apparent_temperature_c?: number | null; /** * Relative Humidity Pct * @description Relative humidity percent */ relative_humidity_pct?: number | null; /** * Precipitation Mm * @description Total precipitation in millimeters */ precipitation_mm?: number | null; /** * Rain Mm * @description Rainfall in millimeters */ rain_mm?: number | null; /** * Snowfall Cm * @description Snowfall in centimeters */ snowfall_cm?: number | null; /** * Cloud Cover Pct * @description Total cloud cover percent */ cloud_cover_pct?: number | null; /** * Wind Speed Kmh * @description Wind speed in km/h */ wind_speed_kmh?: number | null; /** * Wind Gusts Kmh * @description Wind gust speed in km/h */ wind_gusts_kmh?: number | null; /** * Wind Direction Deg * @description Wind direction in degrees */ wind_direction_deg?: number | null; /** * Surface Pressure Hpa * @description Surface pressure in hPa */ surface_pressure_hpa?: number | null; /** * Weather Code * @description WMO weather interpretation code */ weather_code?: number | null; /** * Source * @description Open-Meteo API the row came from: archive or forecast */ source: string; /** * Is Provisional * @description True when sourced from the forecast API pending ERA5 archive settlement */ is_provisional: boolean; /** * Created At * @description UTC timestamp when the row was inserted */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the row was last updated */ updated_at?: string | null; }; /** * GarminChartPoint * @description Lightweight track point optimised for time-series chart rendering. * @example { * "altitude": 12.4, * "cadence": 80, * "distance_from_start_km": 0, * "effort_level": "steady", * "heart_rate": 135, * "hr_zone": 3, * "latitude": 40.71501586586237, * "longitude": -74.01768794283271, * "respiration_rate": 22, * "speed_kmh": 24.5, * "surface_type": "paved", * "temperature_c": 18, * "timestamp": "2025-11-08T18:21:13Z" * } */ GarminChartPoint: { /** * Timestamp * Format: date-time * @description UTC timestamp of the data point */ timestamp: string; /** * Altitude * @description Elevation above sea level in meters */ altitude?: number | null; /** * Distance From Start Km * @description Cumulative distance from activity start in km */ distance_from_start_km?: number | null; /** * Speed Kmh * @description Instantaneous speed in km/h */ speed_kmh?: number | null; /** * Heart Rate * @description Heart rate in beats per minute */ heart_rate?: number | null; /** * Hr Zone * @description Heart-rate zone index (1-5) */ hr_zone?: number | null; /** * Respiration Rate * @description Respiration rate in breaths per minute */ respiration_rate?: number | null; /** * Cadence * @description Pedal/step cadence in RPM */ cadence?: number | null; /** * Temperature C * @description Ambient temperature in degrees C */ temperature_c?: number | null; /** * Surface Type * @description Road or terrain type */ surface_type?: string | null; /** * Effort Level * @description Effort classification label */ effort_level?: string | null; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; }; /** * GarminDateRange * @description Earliest and latest Garmin activity timestamps in the database. * @example { * "max_date": "2026-04-06T20:00:00+00:00", * "min_date": "2025-11-08T18:21:13+00:00" * } */ GarminDateRange: { /** * Min Date * Format: date-time * @description Timestamp of the earliest Garmin activity */ min_date: string; /** * Max Date * Format: date-time * @description Timestamp of the latest Garmin activity */ max_date: string; }; /** * GarminDevice * @description Recording device metadata for a Garmin activity. */ GarminDevice: { /** * Device Id * @description Recording device serial number */ device_id?: number | null; /** * Manufacturer * @description Device manufacturer (e.g. garmin) */ manufacturer?: string | null; /** * Garmin Product * @description Raw Garmin product enum id from the FIT file (e.g. 4061) */ garmin_product?: number | null; /** * Model * @description Friendly device model name (e.g. Edge 540 Solar) */ model?: string | null; /** * Software Version * @description Device firmware/software version (e.g. 31.30) */ software_version?: string | null; }; /** * GarminDeviceCount * @description Garmin activity count grouped by recording device model. * @example { * "activity_count": 1237, * "label": "Edge 500" * } * @example { * "activity_count": 194, * "label": "Edge 540 Solar" * } * @example { * "activity_count": 5, * "label": "Manual" * } */ GarminDeviceCount: { /** * Label * @description Device model label, or Manual when no recording device is available */ label: string; /** * Activity Count * @description Number of activities for this device label */ activity_count: number; }; /** * GarminLapsActivity * @description Activity summary metadata for a batch laps response item. */ GarminLapsActivity: { /** * Activity Id * @description Garmin activity identifier */ activity_id: string; /** * Sport * @description Sport type (e.g. cycling) */ sport?: string | null; /** * Sub Sport * @description Sub-sport type (e.g. road) */ sub_sport?: string | null; /** * Start Time * @description UTC activity start time */ start_time?: string | null; /** * Distance Km * @description Total activity distance in kilometers */ distance_km?: number | null; /** * Duration Seconds * @description Total activity duration in seconds */ duration_seconds?: number | null; /** * Avg Speed Kmh * @description Average activity speed in km/h */ avg_speed_kmh?: number | null; /** * Avg Heart Rate * @description Average activity heart rate in bpm */ avg_heart_rate?: number | null; /** * Max Heart Rate * @description Maximum activity heart rate in bpm */ max_heart_rate?: number | null; /** * Total Ascent M * @description Total activity elevation gain in meters */ total_ascent_m?: number | null; }; /** * GarminSegment * @description A saved named segment (path) for cross-activity effort comparison. */ GarminSegment: { /** * Id * @description Unique saved segment identifier */ id: number; /** * Name * @description Human-readable segment name */ name: string; /** * Sport * @description Sport type (e.g. cycling) */ sport?: string | null; /** * Start Latitude * @description Segment start latitude */ start_latitude: number; /** * Start Longitude * @description Segment start longitude */ start_longitude: number; /** * End Latitude * @description Segment end latitude */ end_latitude: number; /** * End Longitude * @description Segment end longitude */ end_longitude: number; /** * Distance Meters * @description Segment distance in meters */ distance_meters?: number | null; /** * Match Tolerance Meters * @description Corridor radius (m) used to match traversing activities */ match_tolerance_meters: number; /** * Source Activity Id * @description Activity the segment was created from */ source_activity_id?: string | null; /** * Source Lap Index * @description Lap index the segment was created from */ source_lap_index?: number | null; /** * Source Climb Index * @description Climb split index the segment was created from */ source_climb_index?: number | null; /** * Created At * @description UTC creation timestamp */ created_at?: string | null; /** * Updated At * @description UTC last-update timestamp */ updated_at?: string | null; /** * Route * @description Ordered [latitude, longitude] pairs tracing the segment path, recovered and simplified from the source activity's GPS track. Null when no source activity track can be matched. */ route?: [ number, number ][] | null; }; /** * GarminSegmentCreate * @description Request body to save a new segment (path). */ GarminSegmentCreate: { /** * Name * @description Human-readable segment name */ name: string; /** * Sport * @description Sport type; defaults to cycling * @default cycling */ sport: string | null; /** * Start Latitude * @description Segment start latitude */ start_latitude: number; /** * Start Longitude * @description Segment start longitude */ start_longitude: number; /** * End Latitude * @description Segment end latitude */ end_latitude: number; /** * End Longitude * @description Segment end longitude */ end_longitude: number; /** * Distance Meters * @description Segment distance in meters */ distance_meters?: number | null; /** * Match Tolerance Meters * @description Corridor radius (m) used to match traversing activities * @default 35 */ match_tolerance_meters: number; /** * Source Activity Id * @description Activity the segment was created from */ source_activity_id?: string | null; /** * Source Lap Index * @description Lap index the segment was created from */ source_lap_index?: number | null; /** * Source Climb Index * @description Climb split index the segment was created from */ source_climb_index?: number | null; }; /** * GarminSyncResponse * @description Response payload for Garmin on-demand sync trigger requests. * @example { * "message": "Sync started", * "status": "accepted", * "triggered_at": "2026-03-12T01:25:14.586353+00:00", * "window_hours": 48, * "window_start": "2026-03-10T01:25:14.586331+00:00" * } * @example { * "message": "Sync already in progress", * "started_at": "2026-03-12T01:24:58.102924+00:00", * "status": "conflict" * } */ GarminSyncResponse: { /** * Status * @description Sync trigger status (accepted, conflict, bad_request, error) */ status: string; /** * Message * @description Human-readable status message */ message: string; /** * Triggered At * @description UTC timestamp when sync was triggered */ triggered_at?: string | null; /** * Started At * @description UTC timestamp when active sync started */ started_at?: string | null; /** * Lookback * @description Effective lookback override used for this trigger */ lookback?: number | null; /** * Window Hours * @description Effective window in hours used for this trigger */ window_hours?: number | null; /** * Window Start * @description Computed UTC window start timestamp */ window_start?: string | null; } & { [key: string]: unknown; }; /** * GarminTrackPoint * @description Individual GPS track point within a Garmin activity. * @example { * "activity_id": "20932993811", * "altitude": 12.4, * "cadence": 80, * "created_at": "2026-02-09T23:56:37Z", * "distance_from_start_km": 0, * "effort_level": "steady", * "heart_rate": 135, * "hr_zone": 3, * "id": 7454, * "latitude": 40.71501586586237, * "longitude": -74.01768794283271, * "respiration_rate": 22, * "speed_kmh": 24.5, * "surface_type": "paved", * "temperature_c": 18, * "timestamp": "2025-11-08T18:21:13Z" * } */ GarminTrackPoint: { /** * Id * @description Unique track point record identifier */ id: number; /** * Activity Id * @description Parent Garmin activity identifier */ activity_id: string; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Timestamp * Format: date-time * @description UTC timestamp of the track point recording */ timestamp: string; /** * Altitude * @description Elevation above sea level in meters */ altitude?: number | null; /** * Distance From Start Km * @description Cumulative distance from activity start in km */ distance_from_start_km?: number | null; /** * Speed Kmh * @description Instantaneous speed in km/h */ speed_kmh?: number | null; /** * Heart Rate * @description Heart rate in beats per minute */ heart_rate?: number | null; /** * Hr Zone * @description Heart-rate zone index (1-5) */ hr_zone?: number | null; /** * Respiration Rate * @description Respiration rate in breaths per minute */ respiration_rate?: number | null; /** * Cadence * @description Pedal/step cadence in RPM */ cadence?: number | null; /** * Temperature C * @description Ambient temperature in degrees C */ temperature_c?: number | null; /** * Surface Type * @description Road or terrain type */ surface_type?: string | null; /** * Effort Level * @description Effort classification label */ effort_level?: string | null; /** * Created At * @description UTC timestamp when the record was inserted */ created_at?: string | null; /** @description Reverse-geocoded address for this track point (Garmin pipeline). Only populated for waypoints that have been geocoded. */ address?: components["schemas"]["GeocodedAddressSummary"] | null; }; /** * GeocodedAddress * @description Reverse-geocoded address components from Pelias. * @example { * "confidence": 0.95, * "country": "United States", * "display_address": "123 Main St, Hoboken, NJ 07030", * "geocoded_at": "2026-02-12T08:10:55+00:00", * "housenumber": "123", * "locality": "Hoboken", * "neighbourhood": "Downtown", * "postalcode": "07030", * "region": "New Jersey", * "status": "success", * "street": "Main St" * } */ GeocodedAddress: { /** * Display Address * @description Full formatted address label from Pelias */ display_address?: string | null; /** * Street * @description Street name */ street?: string | null; /** * Housenumber * @description House or building number */ housenumber?: string | null; /** * Neighbourhood * @description Neighbourhood name */ neighbourhood?: string | null; /** * Locality * @description City or town */ locality?: string | null; /** * Region * @description State or province */ region?: string | null; /** * Country * @description Country name */ country?: string | null; /** * Postalcode * @description Postal or ZIP code */ postalcode?: string | null; /** * Confidence * @description Pelias confidence score (0-1) */ confidence?: number | null; /** * Status * @description Geocoding status: success, no_coverage, error, pending */ status: string; /** * Geocoded At * @description UTC timestamp when geocoding was performed */ geocoded_at?: string | null; }; /** * GeocodedAddressSummary * @description Compact address summary embedded in track-point payloads. */ GeocodedAddressSummary: { /** * Display Address * @description Full formatted address label from Pelias */ display_address?: string | null; /** * Street * @description Street name */ street?: string | null; /** * Housenumber * @description House or building number */ housenumber?: string | null; /** * Neighbourhood * @description Neighbourhood name */ neighbourhood?: string | null; /** * Locality * @description City or town */ locality?: string | null; /** * Region * @description State or province */ region?: string | null; /** * Country * @description Country name */ country?: string | null; /** * Postalcode * @description Postal or ZIP code */ postalcode?: string | null; /** * Confidence * @description Pelias confidence score (0-1) */ confidence?: number | null; /** * Waypoint Kind * @description Role of this waypoint (Garmin only) */ waypoint_kind?: ("start" | "end" | "waypoint") | null; /** * Status * @description Geocoding status: success, no_coverage, error, pending */ status: string; /** * Geocoded At * @description UTC timestamp when geocoding was performed */ geocoded_at?: string | null; }; /** * GeocodedPointAddress * @description Address resolved for a rounded GPS coordinate cell. * @example { * "confidence": 0.95, * "country": "United States", * "display_address": "123 Main St, Hoboken, NJ 07030", * "geocoded_at": "2026-02-12T08:10:55+00:00", * "housenumber": "123", * "locality": "Hoboken", * "neighbourhood": "Downtown", * "postalcode": "07030", * "region": "New Jersey", * "status": "success", * "street": "Main St" * } */ GeocodedPointAddress: { /** * Display Address * @description Full formatted address label from Pelias */ display_address?: string | null; /** * Street * @description Street name */ street?: string | null; /** * Housenumber * @description House or building number */ housenumber?: string | null; /** * Neighbourhood * @description Neighbourhood name */ neighbourhood?: string | null; /** * Locality * @description City or town */ locality?: string | null; /** * Region * @description State or province */ region?: string | null; /** * Country * @description Country name */ country?: string | null; /** * Postalcode * @description Postal or ZIP code */ postalcode?: string | null; /** * Confidence * @description Pelias confidence score (0-1) */ confidence?: number | null; /** * Status * @description Geocoding status: success, no_coverage, error, pending */ status: string; /** * Geocoded At * @description UTC timestamp when geocoding was performed */ geocoded_at?: string | null; /** * Latitude * @description Resolved 4-decimal cell latitude */ latitude: number; /** * Longitude * @description Resolved 4-decimal cell longitude */ longitude: number; /** * Resolution Source * @description Whether the response came from the database cache or a Pelias fallback * @enum {string} */ resolution_source: "database" | "pelias"; }; /** * GeocodingSourceStatus * @description Coverage statistics for a single geocoding source (owntracks or garmin). */ GeocodingSourceStatus: { /** * Success * @description Number of successfully geocoded records for this source */ success: number; /** * Pending * @description Number of records awaiting geocoding for this source * @default 0 */ pending: number; /** * No Coverage * @description Number of records outside Pelias coverage area */ no_coverage: number; /** * Errors * @description Number of records that failed geocoding */ errors: number; /** * Total * @description Total number of geocoded_addresses rows for this source */ total: number; }; /** * GeocodingStatus * @description Coverage statistics for geocoded location records. * @example { * "coverage_percent": 26.67, * "errors": 100, * "geocoded": 12000, * "no_coverage": 400, * "pending": 33000, * "success": 11500, * "total_locations": 45000 * } */ GeocodingStatus: { /** * Total Locations * @description Total number of OwnTracks location records */ total_locations: number; /** * Geocoded * @description Number of locations with a geocoded address (any status) */ geocoded: number; /** * Success * @description Number of successfully geocoded locations */ success: number; /** * Pending * @description Number of locations awaiting geocoding */ pending: number; /** * No Coverage * @description Number of locations outside Pelias coverage area */ no_coverage: number; /** * Errors * @description Number of locations that failed geocoding */ errors: number; /** * Coverage Percent * @description Percentage of locations with a geocoded address */ coverage_percent: number; /** @description Per-source breakdown of geocoding coverage (owntracks, garmin) */ by_source: components["schemas"]["GeocodingStatusBySource"]; /** * Dense Cells Total * @description Total number of distinct 4dp (~11m) GPS cells observed in garmin_track_points * @default 0 */ dense_cells_total: number; /** * Dense Cells Geocoded * @description Number of dense cells with any geocoding row (any status) * @default 0 */ dense_cells_geocoded: number; /** * Dense Cells Success * @description Number of dense cells with status='success' * @default 0 */ dense_cells_success: number; /** * Dense Cells Pending * @description Number of dense cells awaiting geocoding * @default 0 */ dense_cells_pending: number; /** * Dense Cells No Coverage * @description Number of dense cells outside Pelias coverage * @default 0 */ dense_cells_no_coverage: number; /** * Dense Cells Errors * @description Number of dense cells that failed geocoding * @default 0 */ dense_cells_errors: number; /** * Dense Point Coverage Percent * @description Percentage of garmin_track_points whose 4dp cell has any geocoded row * @default 0 */ dense_point_coverage_percent: number; }; /** * GeocodingStatusBySource * @description Per-source breakdown of geocoding coverage. */ GeocodingStatusBySource: { /** @description Coverage stats for OwnTracks rows */ owntracks: components["schemas"]["GeocodingSourceStatus"]; /** @description Coverage stats for Garmin rows */ garmin: components["schemas"]["GeocodingSourceStatus"]; /** * Garmin Activities Total * @description Total number of Garmin activities (denominator for activity-level coverage) */ garmin_activities_total: number; /** * Garmin Activities Geocoded * @description Number of Garmin activities that have at least one address row */ garmin_activities_geocoded: number; /** * Garmin Coverage Percent * @description Percentage of Garmin activities with at least one geocoded address */ garmin_coverage_percent: number; /** * Garmin Waypoint Success Percent * @description Percentage of Garmin waypoint rows with status='success' (success / (success + pending + no_coverage + error)). * @default 0 */ garmin_waypoint_success_percent: number; }; /** * GeocodingTriggerResponse * @description Result of triggering a batch geocoding operation. * @example { * "processed": 100, * "remaining": 32900, * "skipped_dedup": 35 * } */ GeocodingTriggerResponse: { /** * Processed * @description Number of records processed in this batch */ processed: number; /** * Remaining * @description Number of records still awaiting geocoding */ remaining: number; /** * Skipped Dedup * @description Number of records skipped via proximity deduplication */ skipped_dedup: number; }; /** HTTPValidationError */ HTTPValidationError: { /** Detail */ detail?: components["schemas"]["ValidationError"][]; }; /** * Location * @description GPS location recorded by the OwnTracks mobile app. * @example { * "accuracy": 7, * "altitude": 4, * "battery": 100, * "battery_status": 2, * "connection_type": "w", * "created_at": "2026-02-12T08:10:55+00:00", * "device_id": "iphone_stuart", * "display_address": "123 Main St, Hoboken, NJ 07030", * "id": 101160, * "latitude": 40.736238, * "longitude": -74.039405, * "tid": "ss", * "timestamp": "2026-02-12T08:10:55+00:00", * "trigger": "t" * } */ Location: { /** * Id * @description Unique location record identifier */ id: number; /** * Device Id * @description OwnTracks device identifier (e.g. iphone_stuart) */ device_id: string; /** * Tid * @description Two-character tracker ID set in the OwnTracks app */ tid?: string | null; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Accuracy * @description Horizontal accuracy of the GPS fix in meters */ accuracy?: number | null; /** * Altitude * @description Altitude above sea level in meters */ altitude?: number | null; /** * Velocity * @description Device velocity in km/h at time of report */ velocity?: number | null; /** * Battery * @description Device battery level as a percentage (0-100) */ battery?: number | null; /** * Battery Status * @description Battery charging state (0=unknown, 1=unplugged, 2=charging, 3=full) */ battery_status?: number | null; /** * Connection Type * @description Network connection type (w=WiFi, m=mobile) */ connection_type?: string | null; /** * Trigger * @description What triggered this location report (p=ping, c=circular, t=timer) */ trigger?: string | null; /** * Timestamp * Format: date-time * @description UTC timestamp when the device recorded the location */ timestamp: string; /** * Created At * @description UTC timestamp when the record was inserted into the database */ created_at?: string | null; /** * Display Address * @description Short formatted address from reverse geocoding (e.g. '123 Main St, Hoboken') */ display_address?: string | null; }; /** * LocationCount * @description Aggregate location count with optional filter context. * @example { * "count": 45883, * "device_id": "iphone_stuart" * } */ LocationCount: { /** * Count * @description Total number of location records matching the filter */ count: number; /** * Date * @description Date filter applied (YYYY-MM-DD), if any */ date?: string | null; /** * Device Id * @description Device ID filter applied, if any */ device_id?: string | null; }; /** * LocationDateRange * @description Earliest and latest location timestamps in the database. * @example { * "max_date": "2026-04-06T20:00:00+00:00", * "min_date": "2025-12-27T08:44:52+00:00" * } */ LocationDateRange: { /** * Min Date * Format: date-time * @description Timestamp of the earliest location record */ min_date: string; /** * Max Date * Format: date-time * @description Timestamp of the latest location record */ max_date: string; }; /** * LocationDetail * @description Full location detail including the original OwnTracks JSON payload. * @example { * "accuracy": 7, * "altitude": 4, * "battery": 100, * "battery_status": 2, * "connection_type": "w", * "created_at": "2026-02-12T08:10:55Z", * "device_id": "iphone_stuart", * "id": 101160, * "latitude": 40.736238, * "longitude": -74.039405, * "raw_payload": { * "_type": "location", * "acc": 7, * "batt": 100, * "lat": 40.736238, * "lon": -74.039405, * "tid": "ss" * }, * "tid": "ss", * "timestamp": "2026-02-12T08:10:55Z", * "trigger": "t" * } */ LocationDetail: { /** * Id * @description Unique location record identifier */ id: number; /** * Device Id * @description OwnTracks device identifier (e.g. iphone_stuart) */ device_id: string; /** * Tid * @description Two-character tracker ID set in the OwnTracks app */ tid?: string | null; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Accuracy * @description Horizontal accuracy of the GPS fix in meters */ accuracy?: number | null; /** * Altitude * @description Altitude above sea level in meters */ altitude?: number | null; /** * Velocity * @description Device velocity in km/h at time of report */ velocity?: number | null; /** * Battery * @description Device battery level as a percentage (0-100) */ battery?: number | null; /** * Battery Status * @description Battery charging state (0=unknown, 1=unplugged, 2=charging, 3=full) */ battery_status?: number | null; /** * Connection Type * @description Network connection type (w=WiFi, m=mobile) */ connection_type?: string | null; /** * Trigger * @description What triggered this location report (p=ping, c=circular, t=timer) */ trigger?: string | null; /** * Timestamp * Format: date-time * @description UTC timestamp when the device recorded the location */ timestamp: string; /** * Created At * @description UTC timestamp when the record was inserted into the database */ created_at?: string | null; /** * Display Address * @description Short formatted address from reverse geocoding (e.g. '123 Main St, Hoboken') */ display_address?: string | null; /** * Raw Payload * @description Original OwnTracks JSON payload as received from the MQTT broker */ raw_payload?: { [key: string]: unknown; } | null; /** @description Full reverse-geocoded address components from Pelias */ address?: components["schemas"]["GeocodedAddress"] | null; }; /** * NearbyPoint * @description GPS point found within a spatial proximity search. * @example { * "distance_meters": 0.4, * "id": 35144, * "latitude": 40.736202, * "longitude": -74.039404, * "source": "owntracks", * "timestamp": "2026-02-02T10:30:53Z" * } */ NearbyPoint: { /** * Source * @description Data source: 'owntracks' or 'garmin' */ source: string; /** * Id * @description Record identifier in the source table */ id: number; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Distance Meters * @description Distance from the search center point in meters */ distance_meters: number; /** * Timestamp * Format: date-time * @description UTC timestamp of the GPS recording */ timestamp: string; }; /** PaginatedResponse[DailyActivitySummary] */ PaginatedResponse_DailyActivitySummary_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["DailyActivitySummary"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** PaginatedResponse[GarminActivityLapsGroup] */ PaginatedResponse_GarminActivityLapsGroup_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["GarminActivityLapsGroup"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** PaginatedResponse[GarminActivity] */ PaginatedResponse_GarminActivity_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["GarminActivity"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** PaginatedResponse[GarminTrackPoint] */ PaginatedResponse_GarminTrackPoint_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["GarminTrackPoint"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** PaginatedResponse[Location] */ PaginatedResponse_Location_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["Location"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** PaginatedResponse[UnifiedGpsPoint] */ PaginatedResponse_UnifiedGpsPoint_: { /** * Items * @description List of items in the current page */ items: components["schemas"]["UnifiedGpsPoint"][]; /** * Total * @description Total number of items matching the query */ total: number; /** * Limit * @description Maximum number of items per page */ limit: number; /** * Offset * @description Number of items skipped from the start */ offset: number; }; /** * PeliasHealth * @description Result of an upstream Pelias reverse-geocoder health probe. */ PeliasHealth: { /** * Healthy * @description True when Pelias returned a usable feature for the probe coordinate. */ healthy: boolean; /** * Latency Ms * @description Round-trip latency for the probe request, in milliseconds. */ latency_ms: number; /** * Sample Features Count * @description Number of features returned by the probe (0 means the probe failed). * @default 0 */ sample_features_count: number; /** * Detail * @description Failure detail when not healthy (timeout, transport error, non-2xx status). */ detail?: string | null; }; /** * ReferenceLocation * @description Named geographic reference point used for spatial queries (e.g. home, office). * @example { * "created_at": "2026-02-03T22:49:07+00:00", * "description": "Primary apartment - 40m radius", * "id": 1, * "latitude": 40.7362, * "longitude": -74.0394, * "name": "home", * "radius_meters": 40, * "updated_at": "2026-02-03T22:50:01+00:00" * } */ ReferenceLocation: { /** * Id * @description Unique reference location identifier */ id: number; /** * Name * @description Short, unique name for the location (e.g. home, office) */ name: string; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Radius Meters * @description Geofence radius in meters for proximity queries * @default 50 */ radius_meters: number; /** * Description * @description Optional human-readable description of the location */ description?: string | null; /** * Created At * @description UTC timestamp when the record was created */ created_at?: string | null; /** * Updated At * @description UTC timestamp when the record was last updated */ updated_at?: string | null; }; /** * ReferenceLocationCreate * @description Request body for creating a new reference location. * @example { * "description": "Downtown office building", * "latitude": 40.7128, * "longitude": -74.006, * "name": "office", * "radius_meters": 100 * } */ ReferenceLocationCreate: { /** * Name * @description Short, unique name for the location (e.g. home, office) */ name: string; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Radius Meters * @description Geofence radius in meters for proximity queries * @default 50 */ radius_meters: number; /** * Description * @description Optional human-readable description of the location */ description?: string | null; }; /** * ReferenceLocationUpdate * @description Request body for partially updating a reference location. All fields are optional. * @example { * "description": "Updated radius for office building", * "radius_meters": 75 * } */ ReferenceLocationUpdate: { /** * Name * @description Updated location name */ name?: string | null; /** * Latitude * @description Updated GPS latitude in decimal degrees */ latitude?: number | null; /** * Longitude * @description Updated GPS longitude in decimal degrees */ longitude?: number | null; /** * Radius Meters * @description Updated geofence radius in meters */ radius_meters?: number | null; /** * Description * @description Updated description text */ description?: string | null; }; /** * ReverseGeocodeBatchItem * @description One coordinate's cached address, or a cache miss, from a batch lookup. * * Unlike GeocodedPointAddress, this never triggers a Pelias fallback: the * batch endpoint is a single set-based database read, so an uncached cell * is reported as status='pending' rather than resolved synchronously. * @example { * "confidence": 0.95, * "country": "United States", * "display_address": "123 Main St, Hoboken, NJ 07030", * "geocoded_at": "2026-02-12T08:10:55+00:00", * "housenumber": "123", * "locality": "Hoboken", * "neighbourhood": "Downtown", * "postalcode": "07030", * "region": "New Jersey", * "status": "success", * "street": "Main St" * } */ ReverseGeocodeBatchItem: { /** * Display Address * @description Full formatted address label from Pelias */ display_address?: string | null; /** * Street * @description Street name */ street?: string | null; /** * Housenumber * @description House or building number */ housenumber?: string | null; /** * Neighbourhood * @description Neighbourhood name */ neighbourhood?: string | null; /** * Locality * @description City or town */ locality?: string | null; /** * Region * @description State or province */ region?: string | null; /** * Country * @description Country name */ country?: string | null; /** * Postalcode * @description Postal or ZIP code */ postalcode?: string | null; /** * Confidence * @description Pelias confidence score (0-1) */ confidence?: number | null; /** * Status * @description Geocoding status: success, no_coverage, error, pending */ status: string; /** * Geocoded At * @description UTC timestamp when geocoding was performed */ geocoded_at?: string | null; /** * Latitude * @description Resolved 4-decimal cell latitude */ latitude: number; /** * Longitude * @description Resolved 4-decimal cell longitude */ longitude: number; }; /** * ReverseGeocodeBatchRequest * @description Bounded collection of coordinates to resolve from the dense cell cache. */ ReverseGeocodeBatchRequest: { /** * Points * @description Coordinates to resolve, processed and returned in request order */ points: components["schemas"]["ReverseGeocodePointInput"][]; }; /** * ReverseGeocodeBatchResponse * @description Multiple coordinates' cached addresses, returned in request order. */ ReverseGeocodeBatchResponse: { /** * Items * @description Resolved addresses in request order */ items: components["schemas"]["ReverseGeocodeBatchItem"][]; }; /** * ReverseGeocodePointInput * @description One coordinate requested as part of a batch reverse-geocode lookup. */ ReverseGeocodePointInput: { /** * Latitude * @description Latitude in decimal degrees */ latitude: number; /** * Longitude * @description Longitude in decimal degrees */ longitude: number; }; /** * SegmentDefinition * @description The ad-hoc segment queried for efforts (a start→end corridor). */ SegmentDefinition: { /** * Start Lat * @description Segment start latitude */ start_lat: number; /** * Start Lon * @description Segment start longitude */ start_lon: number; /** * End Lat * @description Segment end latitude */ end_lat: number; /** * End Lon * @description Segment end longitude */ end_lon: number; /** * Tolerance Meters * @description Corridor radius around the start/end points in meters */ tolerance_meters: number; }; /** * SegmentEffort * @description A single activity's best traversal of a segment, for cross-activity comparison. */ SegmentEffort: { /** * Rank * @description 1-based rank by elapsed time (1 = fastest) */ rank: number; /** * Activity Id * @description Garmin activity identifier */ activity_id: string; /** * Sport * @description Sport type (e.g. cycling) */ sport?: string | null; /** * Activity Start Time * @description UTC start time of the parent activity */ activity_start_time?: string | null; /** * Effort Start * Format: date-time * @description UTC timestamp entering the segment start corridor */ effort_start: string; /** * Effort End * Format: date-time * @description UTC timestamp reaching the segment end corridor */ effort_end: string; /** * Elapsed Seconds * @description Segment elapsed time in seconds */ elapsed_seconds: number; /** * Distance Km * @description Distance covered across the segment in km */ distance_km?: number | null; /** * Avg Speed Kmh * @description Average speed across the segment in km/h */ avg_speed_kmh?: number | null; /** * Avg Heart Rate * @description Average heart rate across the segment in bpm */ avg_heart_rate?: number | null; /** * Max Heart Rate * @description Maximum heart rate across the segment in bpm */ max_heart_rate?: number | null; }; /** * SegmentEffortSeriesBatchItem * @description One effort window requested as part of a batch series lookup. */ SegmentEffortSeriesBatchItem: { /** * Activity Id * @description Garmin activity identifier */ activity_id: string; /** * Effort Start * Format: date-time * @description Effort start timestamp returned by the efforts endpoint */ effort_start: string; /** * Effort End * Format: date-time * @description Effort end timestamp returned by the efforts endpoint */ effort_end: string; }; /** * SegmentEffortSeriesBatchRequest * @description Bounded collection of effort windows to bin in one database query. */ SegmentEffortSeriesBatchRequest: { /** * Efforts * @description Effort windows processed and returned in request order */ efforts: components["schemas"]["SegmentEffortSeriesBatchItem"][]; /** * Bins * @description Number of distance bins per effort * @default 100 */ bins: number; }; /** * SegmentEffortSeriesBatchResponse * @description Distance-binned series returned in the same order as the batch request. */ SegmentEffortSeriesBatchResponse: { /** * Items * @description Effort series in request order */ items: components["schemas"]["SegmentEffortSeriesResponse"][]; }; /** * SegmentEffortSeriesBin * @description One distance bin of an effort's speed/heart-rate series along a segment. */ SegmentEffortSeriesBin: { /** * Index * @description 0-based bin index from segment start */ index: number; /** * Fraction * @description Bin midpoint strictly within (0, 1) of the effort's traversal distance */ fraction: number; /** * Speed Kmh * @description Average speed within the bin in km/h */ speed_kmh?: number | null; /** * Heart Rate * @description Average heart rate within the bin in bpm */ heart_rate?: number | null; }; /** * SegmentEffortSeriesResponse * @description A single effort's speed/HR series, binned by normalized distance along the segment. * * ``bins`` always contains exactly ``bin_count`` entries ordered by index; * bins with no samples (GPS gaps, degenerate traversals) carry null metrics. */ SegmentEffortSeriesResponse: { /** * Activity Id * @description Garmin activity identifier */ activity_id: string; /** * Effort Start * Format: date-time * @description UTC timestamp entering the segment start corridor */ effort_start: string; /** * Effort End * Format: date-time * @description UTC timestamp reaching the segment end corridor */ effort_end: string; /** * Bin Count * @description Number of distance bins in the series */ bin_count: number; /** * Bins * @description Distance-ordered bins spanning the traversal */ bins: components["schemas"]["SegmentEffortSeriesBin"][]; }; /** * SegmentEffortsResponse * @description Ranked efforts for a segment across all matching activities. */ SegmentEffortsResponse: { /** @description The queried segment definition */ segment: components["schemas"]["SegmentDefinition"]; /** * Total * @description Number of matching efforts returned */ total: number; /** * Items * @description Efforts ordered fastest-first */ items: components["schemas"]["SegmentEffort"][]; }; /** * SportInfo * @description Sport type with its activity count. * @example { * "activity_count": 20, * "sport": "cycling" * } */ SportInfo: { /** * Sport * @description Sport type name (e.g. cycling, running) */ sport: string; /** * Activity Count * @description Number of activities for this sport */ activity_count: number; }; /** * UnifiedGpsPoint * @description Single GPS data point from the unified view combining OwnTracks and Garmin sources. * @example { * "accuracy": 7, * "battery": 100, * "created_at": "2026-02-12T08:11:55+00:00", * "identifier": "iphone_stuart", * "latitude": 40.736238, * "longitude": -74.039405, * "source": "owntracks", * "timestamp": "2026-02-12T08:11:55+00:00" * } */ UnifiedGpsPoint: { /** * Source * @description Data source: 'owntracks' or 'garmin' */ source: string; /** * Identifier * @description Device or activity identifier from the source */ identifier: string; /** * Latitude * @description GPS latitude in decimal degrees (WGS 84) */ latitude: number; /** * Longitude * @description GPS longitude in decimal degrees (WGS 84) */ longitude: number; /** * Timestamp * Format: date-time * @description UTC timestamp of the GPS recording */ timestamp: string; /** * Accuracy * @description Horizontal GPS accuracy in meters (OwnTracks only) */ accuracy?: number | null; /** * Battery * @description Device battery percentage (OwnTracks only) */ battery?: number | null; /** * Speed Kmh * @description Instantaneous speed in km/h (Garmin only) */ speed_kmh?: number | null; /** * Heart Rate * @description Heart rate in BPM (Garmin only) */ heart_rate?: number | null; /** * Created At * @description UTC timestamp when the record was inserted */ created_at?: string | null; }; /** ValidationError */ ValidationError: { /** Location */ loc: (string | number)[]; /** Message */ msg: string; /** Error Type */ type: string; /** Input */ input?: unknown; /** Context */ ctx?: Record; }; /** * WithinReferenceResult * @description GPS points found within a named reference location's geofence radius. * @example { * "points": [ * { * "distance_meters": 0.4, * "id": 35144, * "latitude": 40.736202, * "longitude": -74.039404, * "source": "owntracks", * "timestamp": "2026-02-02T10:30:53Z" * } * ], * "radius_meters": 40, * "reference_name": "home", * "total_points": 2 * } */ WithinReferenceResult: { /** * Reference Name * @description Name of the reference location searched */ reference_name: string; /** * Radius Meters * @description Geofence radius used for the search in meters */ radius_meters: number; /** * Total Points * @description Number of GPS points found within the radius */ total_points: number; /** * Points * @description GPS points within the radius, sorted by distance */ points: components["schemas"]["NearbyPoint"][]; }; }; responses: never; parameters: never; requestBodies: never; headers: never; pathItems: never; }; export type $defs = Record; export interface operations { health_health_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { [key: string]: unknown; }; }; }; }; }; ready_ready_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": unknown; }; }; }; }; list_locations_api_v1_locations_get: { parameters: { query?: { /** @description Filter by device ID */ device_id?: string | null; /** @description Filter from date (YYYY-MM-DD) */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) */ date_to?: string | null; /** @description Maximum number of locations to return per page */ limit?: number; /** @description Number of locations to skip for pagination */ offset?: number; /** @description Sort column (id, device_id, timestamp, created_at, battery, accuracy) */ sort?: string; /** @description Sort direction: asc (oldest first) or desc (newest first) */ order?: "asc" | "desc"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_Location_"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_devices_api_v1_locations_devices_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["DeviceInfo"][]; }; }; }; }; location_date_range_api_v1_locations_date_range_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["LocationDateRange"]; }; }; /** @description No location data found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; }; }; location_count_api_v1_locations_count_get: { parameters: { query?: { /** @description Filter by date (YYYY-MM-DD) */ date?: string | null; /** @description Filter by device ID */ device_id?: string | null; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["LocationCount"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; get_location_api_v1_locations__location_id__get: { parameters: { query?: never; header?: never; path: { /** @description Unique location record ID */ location_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["LocationDetail"]; }; }; /** @description Location not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; trigger_sync_api_v1_garmin_sync_post: { parameters: { query?: { /** @description Optional activity lookback override. Non-negative integer. */ lookback?: number | null; /** @description Optional sync window in hours. Positive integer. */ window_hours?: number | null; /** @description Whether to re-sync activities that already exist in the database. */ resync_existing?: boolean | null; /** @description Optional Garmin activity_id filter (repeatable). */ activity_id?: string[] | null; /** @description Optional Garmin activity_ids filter (repeatable). */ activity_ids?: string[] | null; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 202: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; /** @description Invalid sync trigger parameters */ 400: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; /** @description Sync already in progress */ 409: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Bad gateway from Garmin sync service */ 502: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; /** @description Garmin sync service unavailable */ 503: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; /** @description Garmin sync service timeout */ 504: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSyncResponse"]; }; }; }; }; garmin_date_range_api_v1_garmin_date_range_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminDateRange"]; }; }; /** @description No Garmin activity data found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_activities_api_v1_garmin_activities_get: { parameters: { query?: { /** @description Filter by sport type */ sport?: string | null; /** @description Filter from date (YYYY-MM-DD) */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) */ date_to?: string | null; /** @description Maximum number of activities to return per page */ limit?: number; /** @description Number of activities to skip for pagination */ offset?: number; /** @description Sort column (start_time, distance_km, duration_seconds, sport, created_at) */ sort?: string; /** @description Sort direction: asc (oldest first) or desc (newest first) */ order?: "asc" | "desc"; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_GarminActivity_"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_sports_api_v1_garmin_sports_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SportInfo"][]; }; }; }; }; list_device_counts_api_v1_garmin_device_counts_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminDeviceCount"][]; }; }; }; }; list_activity_totals_api_v1_garmin_activity_totals_get: { parameters: { query: { /** @description Time bucket for aggregation: week, month, or year */ period: "week" | "month" | "year"; /** @description Filter to a single sport (e.g. cycling) */ sport?: string | null; /** @description Inclusive lower bound on start_time (YYYY-MM-DD, UTC) */ date_from?: string | null; /** @description Inclusive upper bound on start_time (YYYY-MM-DD, UTC) */ date_to?: string | null; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityTotal"][]; }; }; /** @description Invalid query parameter */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; get_activity_api_v1_garmin_activities__activity_id__get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivity"]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; patch_activity_api_v1_garmin_activities__activity_id__patch: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["GarminActivityManualUpdate"]; }; }; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivity"]; }; }; /** @description No fields to update */ 400: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_track_points_api_v1_garmin_activities__activity_id__tracks_get: { parameters: { query?: { /** @description Maximum number of track points to return per page */ limit?: number; /** @description Number of track points to skip for pagination */ offset?: number; /** @description Sort column (timestamp, altitude, speed_kmh, heart_rate, created_at) */ sort?: string; /** @description Sort direction: asc (earliest first) or desc (latest first) */ order?: "asc" | "desc"; /** @description Douglas-Peucker simplification tolerance in degrees. When set, returns the full route simplified via PostGIS ST_Simplify, ignoring limit/offset. Recommended: 0.00001 (~1m), 0.00005 (~5m). */ simplify?: number | null; }; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_GarminTrackPoint_"]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; get_chart_data_api_v1_garmin_activities__activity_id__chart_data_get: { parameters: { query?: { /** @description When set, downsamples to at most this many time-bucketed points (numeric columns averaged, categorical columns use the per-bucket mode) instead of every raw row -- large activities can have tens of thousands of points. Omit for the full, unbinned series. */ bins?: number | null; }; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminChartPoint"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_activity_climbs_api_v1_garmin_activities__activity_id__climbs_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityClimb"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_activity_laps_api_v1_garmin_activities__activity_id__laps_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityLap"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_activity_sensors_api_v1_garmin_activities__activity_id__sensors_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivitySensor"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; get_activity_weather_api_v1_garmin_activities__activity_id__weather_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityWeather"] | null; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_activity_weather_hourly_api_v1_garmin_activities__activity_id__weather_hourly_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityWeatherHourly"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_laps_api_v1_garmin_laps_get: { parameters: { query?: { /** @description Filter by sport type */ sport?: string | null; /** @description Filter from date (YYYY-MM-DD) */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) */ date_to?: string | null; /** @description Maximum number of activities to return per page */ limit?: number; /** @description Number of activities to skip for pagination */ offset?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_GarminActivityLapsGroup_"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_activity_addresses_api_v1_garmin_activities__activity_id__addresses_get: { parameters: { query?: never; header?: never; path: { /** @description Garmin activity ID */ activity_id: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminActivityAddress"][]; }; }; /** @description Activity not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_segment_efforts_api_v1_garmin_segment_efforts_get: { parameters: { query: { /** @description Segment start latitude */ start_lat: number; /** @description Segment start longitude */ start_lon: number; /** @description Segment end latitude */ end_lat: number; /** @description Segment end longitude */ end_lon: number; /** @description Corridor radius around the start/end points in meters */ tolerance_meters?: number; /** @description Filter by sport type; pass an empty value to include all sports */ sport?: string | null; /** @description Filter from date (YYYY-MM-DD) on activity start_time */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) on activity start_time */ date_to?: string | null; /** @description Ignore traversals longer than this (filters loop/return mismatches) */ max_effort_seconds?: number; /** @description Maximum number of efforts to return */ limit?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SegmentEffortsResponse"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_segments_api_v1_garmin_segments_get: { parameters: { query?: { /** @description Filter by sport type */ sport?: string | null; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSegment"][]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; create_segment_api_v1_garmin_segments_post: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["GarminSegmentCreate"]; }; }; responses: { /** @description Successful Response */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSegment"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Failed to create segment */ 500: { headers: { [name: string]: unknown; }; content?: never; }; }; }; get_segment_api_v1_garmin_segments__segment_id__get: { parameters: { query?: never; header?: never; path: { /** @description Saved segment ID */ segment_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GarminSegment"]; }; }; /** @description Segment not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; delete_segment_api_v1_garmin_segments__segment_id__delete: { parameters: { query?: never; header?: never; path: { /** @description Saved segment ID */ segment_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Segment not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; get_segment_efforts_api_v1_garmin_segments__segment_id__efforts_get: { parameters: { query?: { /** @description Filter from date (YYYY-MM-DD) on activity start_time */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) on activity start_time */ date_to?: string | null; /** @description Ignore traversals longer than this */ max_effort_seconds?: number; /** @description Maximum number of efforts to return */ limit?: number; }; header?: never; path: { /** @description Saved segment ID */ segment_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SegmentEffortsResponse"]; }; }; /** @description Segment not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; get_segment_effort_series_api_v1_garmin_segments__segment_id__effort_series_get: { parameters: { query: { /** @description Garmin activity ID */ activity_id: string; /** @description Effort start timestamp, exactly as returned by the efforts endpoint */ effort_start: string; /** @description Effort end timestamp, exactly as returned by the efforts endpoint */ effort_end: string; /** @description Number of distance bins in the series */ bins?: number; }; header?: never; path: { /** @description Saved segment ID */ segment_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SegmentEffortSeriesResponse"]; }; }; /** @description Segment not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; get_segment_effort_series_batch_api_v1_garmin_segments__segment_id__effort_series_batch_post: { parameters: { query?: never; header?: never; path: { /** @description Saved segment ID */ segment_id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["SegmentEffortSeriesBatchRequest"]; }; }; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["SegmentEffortSeriesBatchResponse"]; }; }; /** @description Segment not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; list_unified_gps_api_v1_gps_unified_get: { parameters: { query?: { /** @description Filter by source: owntracks or garmin */ source?: string | null; /** @description Filter from date (YYYY-MM-DD). Defaults to 90 days ago when both date_from and date_to are omitted. */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) */ date_to?: string | null; /** @description Maximum number of GPS points to return per page */ limit?: number; /** @description Number of GPS points to skip for pagination */ offset?: number; /** @description Sort direction: asc (oldest first) or desc (newest first) */ order?: "asc" | "desc"; /** @description Exclude stationary points where speed_kmh = 0 */ exclude_stationary?: boolean; /** @description Remove points with duplicate coordinates (rounded to ~11m precision) */ deduplicate?: boolean; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_UnifiedGpsPoint_"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; daily_summary_api_v1_gps_daily_summary_get: { parameters: { query?: { /** @description Filter from date (YYYY-MM-DD). Defaults to 90 days ago when both date_from and date_to are omitted. */ date_from?: string | null; /** @description Filter to date (YYYY-MM-DD) */ date_to?: string | null; /** @description Maximum number of daily summaries to return per page */ limit?: number; /** @description Number of daily summaries to skip for pagination */ offset?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PaginatedResponse_DailyActivitySummary_"]; }; }; /** @description Invalid date format */ 422: { headers: { [name: string]: unknown; }; content?: never; }; }; }; daily_summary_date_range_api_v1_gps_daily_summary_date_range_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["DailySummaryDateRange"]; }; }; /** @description No daily summary data found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; }; }; list_reference_locations_api_v1_reference_locations_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ReferenceLocation"][]; }; }; }; }; create_reference_location_api_v1_reference_locations_post: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ReferenceLocationCreate"]; }; }; responses: { /** @description Successful Response */ 201: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ReferenceLocation"]; }; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Failed to create reference location */ 500: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; get_reference_location_api_v1_reference_locations__location_id__get: { parameters: { query?: never; header?: never; path: { /** @description Unique reference location ID */ location_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ReferenceLocation"]; }; }; /** @description Reference location not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; update_reference_location_api_v1_reference_locations__location_id__put: { parameters: { query?: never; header?: never; path: { /** @description Unique reference location ID */ location_id: number; }; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ReferenceLocationUpdate"]; }; }; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ReferenceLocation"]; }; }; /** @description No fields to update */ 400: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Reference location not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; delete_reference_location_api_v1_reference_locations__location_id__delete: { parameters: { query?: never; header?: never; path: { /** @description Unique reference location ID */ location_id: number; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 204: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Reference location not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; find_nearby_api_v1_spatial_nearby_get: { parameters: { query: { /** @description Latitude of center point */ lat: number; /** @description Longitude of center point */ lon: number; /** @description Search radius in meters */ radius_meters?: number; /** @description Filter by source: owntracks or garmin */ source?: string | null; /** @description Maximum number of nearby points to return */ limit?: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["NearbyPoint"][]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; calculate_distance_api_v1_spatial_distance_get: { parameters: { query: { /** @description From latitude (e.g. NYC) */ from_lat: number; /** @description From longitude (e.g. NYC) */ from_lon: number; /** @description To latitude (e.g. Times Square) */ to_lat: number; /** @description To longitude (e.g. Times Square) */ to_lon: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["DistanceResult"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; within_reference_api_v1_spatial_within_reference__name__get: { parameters: { query?: { /** @description Filter by source: owntracks or garmin */ source?: string | null; /** @description Maximum number of points to return within the reference area */ limit?: number; }; header?: never; path: { /** @description Reference location name */ name: string; }; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["WithinReferenceResult"]; }; }; /** @description Reference location not found */ 404: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; reverse_geocode_point_api_v1_geocoding_reverse_get: { parameters: { query: { /** @description Latitude in decimal degrees */ latitude: number; /** @description Longitude in decimal degrees */ longitude: number; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GeocodedPointAddress"]; }; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Pelias fallback result could not be persisted */ 502: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; reverse_geocode_points_batch_api_v1_geocoding_reverse_batch_post: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody: { content: { "application/json": components["schemas"]["ReverseGeocodeBatchRequest"]; }; }; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["ReverseGeocodeBatchResponse"]; }; }; /** @description Authentication required or token invalid */ 401: { headers: { [name: string]: unknown; }; content?: never; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; /** @description Authentication service unavailable */ 503: { headers: { [name: string]: unknown; }; content?: never; }; }; }; geocoding_status_api_v1_geocoding_status_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GeocodingStatus"]; }; }; }; }; pelias_health_api_v1_geocoding_pelias_health_get: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["PeliasHealth"]; }; }; }; }; trigger_geocoding_api_v1_geocoding_trigger_post: { parameters: { query?: { /** @description Number of locations to geocode in this batch */ batch_size?: number; /** @description Re-process records with statuses no_coverage or error */ retry_failed?: boolean; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GeocodingTriggerResponse"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; trigger_garmin_geocoding_api_v1_geocoding_trigger_garmin_post: { parameters: { query?: { /** @description Number of Garmin activities to process in this batch */ batch_size?: number; /** @description Approximate spacing between mid-route waypoints in kilometres */ waypoint_spacing_km?: number; /** @description Re-process activities with at least one waypoint in statuses no_coverage or error */ retry_failed?: boolean; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GeocodingTriggerResponse"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; trigger_garmin_dense_api_v1_geocoding_trigger_garmin_dense_post: { parameters: { query?: { /** @description Number of dense cells to process in this batch */ batch_size?: number; /** @description Re-process cells whose status is no_coverage, error, or pending */ retry_failed?: boolean; }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { /** @description Successful Response */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["GeocodingTriggerResponse"]; }; }; /** @description Validation Error */ 422: { headers: { [name: string]: unknown; }; content: { "application/json": components["schemas"]["HTTPValidationError"]; }; }; }; }; }