{"openapi":"3.0.3","info":{"title":"Public dashboard API","version":"1.0.0","description":"Read-only Strava activities and Garmin measurements displayed on the public dashboard. No credentials required. Private Silvio operations are excluded. Responses are cached for 60 seconds; poll at most once per minute.","contact":{"url":"https://jimbo.sh/contact"}},"servers":[{"url":"https://jimbo.sh"}],"security":[],"paths":{"/api/public/activities":{"get":{"operationId":"listPublicActivities","summary":"Latest ten Strava activities and fourteen days of Garmin measurements","responses":{"200":{"description":"Activities newest first; Garmin days oldest first. Missing measurements are null.","content":{"application/json":{"schema":{"type":"object","required":["activities","garmin"],"properties":{"activities":{"type":"array","maxItems":10,"items":{"allOf":[{"$ref":"#/components/schemas/Run"},{"type":"object","properties":{"type":{"type":"string","description":"Any Strava sport type, including rides, walks, swims and weight training."},"polyline":{"type":"string","nullable":true,"description":"Encoded route when recorded."}}}]}},"garmin":{"type":"array","maxItems":14,"items":{"type":"object","required":["date","steps","resting_hr"],"properties":{"date":{"type":"string","format":"date"},"steps":{"type":"integer","minimum":0,"nullable":true},"resting_hr":{"type":"number","nullable":true,"description":"Resting heart rate in bpm."}}}}}}}}},"503":{"description":"Data temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/public/runs":{"get":{"operationId":"listPublicRuns","summary":"List public run summaries","description":"Returns public running activity summaries grouped newest day first. This legacy endpoint remains available alongside /api/public/activities. No parameters or authentication are required. Cached for 60 seconds. It does not return bodyweight or private calendar records.","parameters":[],"responses":{"200":{"description":"Public run summaries. An empty runs array means no public runs are available.","content":{"application/json":{"schema":{"type":"object","required":["runs"],"properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/Run"}}}}}}},"500":{"description":"Data temporarily unavailable; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Run":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Activity day in the owner's local time zone."},"id":{"type":"integer","description":"Activity identifier."},"name":{"type":"string","description":"Public activity title."},"type":{"type":"string","description":"Run activity type."},"start":{"type":"string","description":"Activity start timestamp, when available."},"distance_mi":{"type":"number","description":"Distance in miles."},"moving_min":{"type":"number","description":"Moving time in minutes."},"pace_min_mi":{"type":"number","nullable":true,"description":"Average pace in minutes per mile, if available."},"avg_hr":{"type":"number","nullable":true,"description":"Average heart rate in beats per minute, if available."},"elev_ft":{"type":"number","description":"Elevation gain in feet."}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string","description":"Human-readable error summary."},"hint":{"type":"string","description":"Suggested next action."}}}}}}}}