{"openapi":"3.1.0","info":{"title":"Running Pace API","version":"1.0.0","description":"A running-pace calculator as an API. Work out pace and speed from a distance and a time (pace per kilometre and per mile, plus km/h, mph and m/s); compute the finish time from a distance and a target pace; predict your time at another distance using Peter Riegel's formula (T2 = T1 × (D2/D1)^1.06) — e.g. estimate a half-marathon from a 10K; and generate a split-time table for even pacing. Times accept seconds, M:SS or H:MM:SS. Perfect for running and fitness apps, race planning, training logs and pace bands. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 5 endpoints. Distinct from general unit conversion and from body-metric (BMI/BMR) health calculators.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/pace-api","description":"oanor gateway"}],"tags":[{"name":"Pace"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/pace":{"get":{"operationId":"get_v1_pace","tags":["Pace"],"summary":"Pace + speed from distance & time","description":"","parameters":[{"name":"distance","in":"query","required":true,"description":"Distance","schema":{"type":"string"},"example":"10"},{"name":"distance_unit","in":"query","required":false,"description":"m|km|mi (default km)","schema":{"type":"string"},"example":"km"},{"name":"time","in":"query","required":true,"description":"seconds, M:SS or H:MM:SS","schema":{"type":"string"},"example":"50:00"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"speed_ms":3.333,"speed_kmh":12,"speed_mph":7.456,"pace_per_km":"5:00","time_seconds":3000,"pace_per_mile":"8:03","distance_meters":10000,"pace_per_km_seconds":300,"pace_per_mile_seconds":482.803},"meta":{"timestamp":"2026-06-03T01:09:44.556Z","request_id":"b88bae07-cea4-417b-9e37-308de921ec83"},"status":"ok","message":"Pace + speed from distance & time","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/predict":{"get":{"operationId":"get_v1_predict","tags":["Pace"],"summary":"Predict a race time (Riegel)","description":"","parameters":[{"name":"distance1","in":"query","required":true,"description":"Known distance","schema":{"type":"string"},"example":"10"},{"name":"time1","in":"query","required":true,"description":"Known time","schema":{"type":"string"},"example":"50:00"},{"name":"distance2","in":"query","required":true,"description":"Target distance","schema":{"type":"string"},"example":"21.0975"},{"name":"distance_unit","in":"query","required":false,"description":"m|km|mi (default km)","schema":{"type":"string"},"example":"km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":{"distance_meters":21097.5},"from":{"time":"50:00","distance_meters":10000},"formula":"Riegel (exponent 1.06)","predicted_time":"1:50:19.2","predicted_pace_per_km":"5:14","predicted_time_seconds":6619.209},"meta":{"timestamp":"2026-06-03T01:09:44.648Z","request_id":"31d03910-a25b-453e-b6a1-9660c1fff529"},"status":"ok","message":"Predict a race time","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/splits":{"get":{"operationId":"get_v1_splits","tags":["Pace"],"summary":"Split-time table","description":"","parameters":[{"name":"distance","in":"query","required":true,"description":"Distance","schema":{"type":"string"},"example":"21.0975"},{"name":"distance_unit","in":"query","required":false,"description":"m|km|mi (default km)","schema":{"type":"string"},"example":"km"},{"name":"time","in":"query","required":true,"description":"Total time","schema":{"type":"string"},"example":"1:45:00"},{"name":"split","in":"query","required":false,"description":"km|mi (default km)","schema":{"type":"string"},"example":"km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"splits":[{"split":1,"distance":1,"cumulative_time":"4:58.6"},{"split":2,"distance":2,"cumulative_time":"9:57.2"},{"split":3,"distance":3,"cumulative_time":"14:55.8"},{"split":4,"distance":4,"cumulative_time":"19:54.5"},{"split":5,"distance":5,"cumulative_time":"24:53.1"},{"split":6,"distance":6,"cumulative_time":"29:51.7"},{"split":7,"distance":7,"cumulative_time":"34:50.3"},{"split":8,"distance":8,"cumulative_time":"39:48.9"},{"split":9,"distance":9,"cumulative_time":"44:47.5"},{"split":10,"distance":10,"cumulative_time":"49:46.1"},{"split":11,"distance":11,"cumulative_time":"54:44.7"},{"split":12,"distance":12,"cumulative_time":"59:43.4"},{"split":13,"distance":13,"cumulative_time":"1:04:42"},{"split":14,"distance":14,"cumulative_time":"1:09:40.6"},{"split":15,"distance":15,"cumulative_time":"1:14:39.2"},{"split":16,"distance":16,"cumulative_time":"1:19:37.8"},{"split":17,"distance":17,"cumulative_time":"1:24:36.4"},{"split":18,"distance":18,"cumulative_time":"1:29:35"},{"split":19,"distance":19,"cumulative_time":"1:34:33.7"},{"split":20,"distance":20,"cumulative_time":"1:39:32.3"},{"split":21,"distance":21,"cumulative_time":"1:44:30.9"},{"split":22,"distance":21.098,"cumulative_time":"1:44:60"}],"split_unit":"km","pace_per_split":"4:59"},"meta":{"timestamp":"2026-06-03T01:09:44.744Z","request_id":"48cc3fb9-f2a2-4465-b2b8-19ed24932e19"},"status":"ok","message":"Split-time table","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/time":{"get":{"operationId":"get_v1_time","tags":["Pace"],"summary":"Finish time from distance & pace","description":"","parameters":[{"name":"distance","in":"query","required":true,"description":"Distance","schema":{"type":"string"},"example":"10"},{"name":"distance_unit","in":"query","required":false,"description":"m|km|mi (default km)","schema":{"type":"string"},"example":"km"},{"name":"pace","in":"query","required":true,"description":"Pace (e.g. 5:00)","schema":{"type":"string"},"example":"5:00"},{"name":"pace_unit","in":"query","required":false,"description":"per_km|per_mile","schema":{"type":"string"},"example":"per_km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"pace":"5:00","time":"50:00","pace_unit":"per_km","time_seconds":3000,"distance_meters":10000},"meta":{"timestamp":"2026-06-03T01:09:44.824Z","request_id":"a64aa323-46af-4db1-ae5c-d12d88f3a485"},"status":"ok","message":"Finish time from distance & pace","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"Running Pace API","notes":"Race prediction uses Peter Riegel's T2 = T1 × (D2/D1)^1.06; treat it as an estimate. Nothing is stored.","version":"v1","endpoints":[{"path":"/v1/pace","params":{"time":"seconds, M:SS or H:MM:SS (required)","distance":"required","distance_unit":"m|km|mi (default km)"},"returns":"pace per km/mile and speed in km/h, mph, m/s"},{"path":"/v1/time","params":{"pace":"e.g. 5:00 (required)","distance":"required","pace_unit":"per_km|per_mile","distance_unit":"default km"},"returns":"the finish time"},{"path":"/v1/predict","params":{"time1":"required","distance1":"required","distance2":"required","distance_unit":"default km"},"returns":"predicted time at distance2 (Riegel)"},{"path":"/v1/splits","params":{"time":"required","split":"km|mi","distance":"required","distance_unit":"default km"},"returns":"cumulative split times"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"A running-pace toolkit: compute pace and speed from a distance and time, the finish time from a distance and pace, predict a race time at another distance (Riegel formula), and build a split-time table. Pure local, no key."},"meta":{"timestamp":"2026-06-03T01:09:44.893Z","request_id":"051db23d-985e-40a7-9a5f-0ad6d0fc87b6"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":1035,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":75,"monthly_call_quota":8750,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2065,"monthly_call_quota":138500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":5865,"monthly_call_quota":730000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/pace-api"}