Output Examples — Activities
All examples show default output. Add --json to any command for raw JSON.
fitops activities import-mobile <PATH>
fitops activities import-mobile fitops-export.json --jsonThe response contains formatted activity records under activities. This shortened example shows the import-specific fields:
{
"_meta": {
"tool": "fitops",
"version": "0.1.0",
"generated_at": "2026-11-12T12:00:00+00:00",
"total_count": 1,
"filters_applied": {
"format": "fitops.activities",
"version": 1,
"post_to_strava": false
}
},
"activities": [
{
"activity_id": 42,
"strava_activity_id": null,
"origin": "fitops-mobile",
"name": "Morning run",
"source_identity": {
"provider": "file",
"provider_account_id": "local",
"provider_activity_id": "tcx:Run:2026-11-01T08:00:00.000Z"
}
}
],
"import": {"created_count": 1, "updated_count": 0},
"publication": {"requested": false, "status": "not_requested"},
"data_availability": {
"streams_imported": true,
"calibration_transferred": false,
"moving_time_available": false,
"metrics": "computed_where_supported_using_desktop_settings"
}
}fitops activities import <PATH>
fitops activities import morning-run.tcx --gear "Daily Trainer" --json{
"_meta": {
"tool": "fitops",
"total_count": 1,
"filters_applied": {
"sport": "auto",
"name": null,
"gear": "Daily Trainer",
"post_to_strava": true
}
},
"activity": {
"activity_id": 42,
"strava_activity_id": 1234567890,
"origin": "tcx",
"name": "Outdoor run",
"sport_type": "Run",
"equipment": {
"gear_id": "local-a1b2c3",
"gear_name": "Daily Trainer",
"gear_type": "shoes"
},
"data_availability": {
"has_gps": true,
"streams_fetched": true,
"laps_fetched": true,
"detail_fetched": true
}
},
"import": {
"created": true,
"match_type": "new",
"file_format": "tcx",
"original_filename": "morning-run.tcx",
"sha256": "…",
"sport_inference_source": "file_metadata",
"sport_inference_confidence": "high"
},
"weather": {
"status": "fetched",
"data": {
"temperature_c": 18.4,
"humidity_pct": 68,
"wbgt_c": 15.2,
"wap_factor": 1.008,
"true_pace_s_per_km": 302.7
}
},
"publication": {
"requested": true,
"status": "completed",
"strava_id": 1234567890,
"error": null
}
}Posting is enabled by default. Use --local-only for "status": "not_requested". If posting fails, the command returns "status": "failed" and a structured error while preserving the imported local activity. Repeating the same import returns the existing local activity with "created": false and "match_type": "file_hash". An equivalent GPX/TCX file or an activity already synced from Strava returns "match_type": "activity_signature".
fitops activities stamp --local-id <ID>
{
"_meta": {
"tool": "fitops",
"total_count": 1,
"filters_applied": {"local_activity_id": 42}
},
"activity_id": 42,
"status": "stamped"
}The command stores the same analytics stamp used for Strava activities without contacting Strava. Repeating it without --force returns "status": "already_stamped".
fitops activities list
fitops activities list --sport Run --limit 3 ID Date Sport Dist Duration Pace/Speed HR
──────────────────────────────────────────────────────────────────────
17972016511 2026-04-04 Run 12.12 km 58:05 4:47/km 168
17954157500 2026-04-02 Run 16.52 km 1:27:11 5:16/km 154
17930412200 2026-03-30 Run 10.05 km 50:22 5:00/km 161fitops activities get <ID>
fitops activities get 17972016511Outdoor run Run | 2026-04-04
Distance 12.12 km (7.53 mi)
Duration 58:05
Pace 4:47/km | 7:42/mi
Elevation +29.4 m
Heart Rate 168 avg bpm | 190 max
Calories 720
Gear Adidas Adizero SL2 (shoes)
Training Aerobic 3.5 | Anaerobic 1.4Running race activities with an official override also show:
Chip Time 40:30
Race Dist 10.0 km
Race Corr distance x1.01833 | time x0.987805 | corrected pace 4:03/kmfitops activities streams <ID>
fitops activities streams 17972016511Streams for activity 17972016511
altitude 3492 data points
latlng 3492 data points
grade_adjusted_speed 3492 data points
moving 3492 data points
cadence 3492 data points
velocity_smooth 3492 data points
time 3492 data points
heartrate 3492 data points
grade_smooth 3492 data points
distance 3492 data pointsUse --json to get the full data arrays for scripting or analysis:
fitops activities streams 17972016511 --json{
"_meta": { "generated_at": "2026-04-04T09:15:00+00:00" },
"activity_strava_id": 17972016511,
"streams": {
"heartrate": { "data_length": 3492, "data": [142, 145, 148, ...] },
"velocity_smooth": { "data_length": 3492, "data": [3.1, 3.2, ...] },
"altitude": { "data_length": 3492, "data": [45.2, 45.4, ...] }
}
}Data arrays contain one value per second.
fitops activities chart <ID>
fitops activities chart 17985851162 --stream heartrateActivity chart | Heart Rate (bpm) over time (s) [res: 71]
min: 142 bpm avg: 163 bpm max: 190 bpm samples: 3492
190| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
166| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
142|▪▪
-------+-----------------------------------------------------------------------
0:00 66:39 133:17Pace chart (Y-axis inverted — faster pace at top):
fitops activities chart 17985851162 --stream paceActivity chart | Pace (min/km) over time (s) [res: 71]
fastest: 3:27/km avg: 4:50/km slowest: 9:05/km samples: 3485
3:27| ▪▪▪▪▪▪▪▪▪ ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
6:16| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
|▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
9:05|▪
-------+-----------------------------------------------------------------------
0:00 66:39 133:17Zoom into the first 10 minutes of heart rate, with tight resolution to show variance:
fitops activities chart 17985851162 --stream heartrate --from 0 --to 600 --resolution 60Activity chart | Heart Rate (bpm) over time (s) [res: 60]
min: 142 bpm avg: 154 bpm max: 170 bpm samples: 600
170| ·▪· ·▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ·▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
156| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
| ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
142|▪▪▪▪
-------+-----------------------------------------------------------------------
0:00 5:00 10:00· range dots appear when zoomed tightly (≤10 source samples per chart column), showing within-bucket variance.