{"openapi":"3.1.0","info":{"title":"freddy Personal API","version":"1.0.0","description":"Read-only access to your own health data. Authenticate with a personal API key (Authorization: Bearer fk_live_...). Your plan's history window applies."},"servers":[{"url":"https://freddy.coach"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"fk_live_..."}},"schemas":{"Meta":{"type":"object","properties":{"plan":{"type":"string"},"history_window_days":{"type":["integer","null"]},"history_floor":{"type":["string","null"],"format":"date"},"source_cap":{"type":["integer","null"]}}},"Metric":{"type":"object","properties":{"date":{"type":"string","format":"date"},"provider":{"type":"string"},"metric":{"type":"string"},"numValue":{"type":["number","null"]},"textValue":{"type":["string","null"]},"unit":{"type":["string","null"]},"stream":{"type":"boolean"}}}}},"paths":{"/api/v1/metrics":{"get":{"summary":"List your normalized health metrics","description":"Returns your metrics newest-first, bounded by your plan's history window. Paginate with the opaque cursor from next_cursor.","parameters":[{"name":"metric","in":"query","schema":{"type":"string"},"description":"Filter to one or more metric names. Repeat the param (?metric=a&metric=b) or comma-separate (?metric=a,b)."},{"name":"provider","in":"query","schema":{"type":"string"},"description":"Filter to one or more providers (e.g. OURA, GARMIN), case-insensitive. Repeat the param (?provider=oura&provider=polar) or comma-separate (?provider=oura,polar)."},{"name":"from","in":"query","schema":{"type":"string","format":"date"},"description":"Start date (clamped to your plan window if earlier)."},{"name":"to","in":"query","schema":{"type":"string","format":"date"},"description":"End date (inclusive)."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque pagination cursor from next_cursor."},{"name":"limit","in":"query","schema":{"type":"integer","default":200,"maximum":1000},"description":"Page size (max 1000)."}],"responses":{"200":{"description":"A page of metrics.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Metric"}},"next_cursor":{"type":["string","null"]},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/catalog":{"get":{"summary":"Distinct metrics + providers available to you (within your window)","responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/sources":{"get":{"summary":"Your connected sources","responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key."}}}},"/api/v1/profile":{"get":{"summary":"Your profile + plan window","responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key."}}}}}}