{"openapi":"3.1.0","info":{"title":"Barbell & Lifting API","version":"1.0.0","description":"Barbell and weight-training maths as an API, computed locally and deterministically — the plate-loading and percentage numbers a lifter, coach or gym app works out at the rack. The plates endpoint solves the everyday gym puzzle of which plates go on each side for a target weight: 100 kg on a standard 20 kg bar means 40 kg a side, loaded heaviest first as a 25 and a 15; 102.5 kg adds the 1.25 micro-plate; and if a target is not reachable with the plates on hand it loads the closest it can and tells you the shortfall, so you never guess. It works in kilograms or pounds (225 lb on a 45 lb bar is two 45s a side), with a custom bar weight and a custom plate set. The percent endpoint turns a one-rep-max into the working weight you actually load: 80 % of a 100 kg max is 80 kg, and asking for a five-rep weight returns about 85.7 kg via the Epley formula (1RM = weight × (1 + reps ÷ 30)) — five reps sits near 86 % of max, ten reps near 75 %. The warmup endpoint builds a ramp from the empty bar to the working set at roughly 40, 55, 70 and 85 %, each rounded to a loadable increment, with the rep count dropping as the bar gets heavy. Everything is computed locally and deterministically, so it is instant and private. Ideal for gym, strength-training, powerlifting and fitness app developers, workout-logger and coaching tools, and smart-rack and plate-calculator builders. Pure local computation — no key, no third-party service, instant. Exact maths, no simulation. Live, nothing stored. 3 compute endpoints. For one-rep-max estimation from a set use a strength API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/barbell-api","description":"oanor gateway"}],"tags":[{"name":"Barbell"},{"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/percent":{"get":{"operationId":"get_v1_percent","tags":["Barbell"],"summary":"Working weight from a 1RM","description":"","parameters":[{"name":"one_rep_max","in":"query","required":true,"description":"One-rep-max weight","schema":{"type":"string"},"example":"100"},{"name":"percent","in":"query","required":false,"description":"Percent of 1RM (1-100)","schema":{"type":"string"},"example":"80"},{"name":"reps","in":"query","required":false,"description":"Target reps (Epley estimate)","schema":{"type":"string"},"example":"5"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Working weight = 1RM × percent. Common loads: 5×5 around 80%, triples 85–90%, heavy singles 90%+.","inputs":{"one_rep_max":100},"percent":80,"working_weight":80},"meta":{"timestamp":"2026-06-06T07:14:06.504Z","request_id":"2d440cb8-74c3-4d00-bd6e-d6adf1915cc2"},"status":"ok","message":"Percent of 1RM","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/plates":{"get":{"operationId":"get_v1_plates","tags":["Barbell"],"summary":"Plate loading per side","description":"","parameters":[{"name":"target_weight","in":"query","required":true,"description":"Target total weight","schema":{"type":"string"},"example":"100"},{"name":"bar_weight","in":"query","required":false,"description":"Bar weight (default 20 kg / 45 lb)","schema":{"type":"string"},"example":"20"},{"name":"unit","in":"query","required":false,"description":"kg or lb (default kg)","schema":{"type":"string"},"example":"kg"},{"name":"plates","in":"query","required":false,"description":"Comma list of available plate sizes","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Plates per side, loaded heaviest first. If it can't hit the target exactly, it loads the closest you can reach below it — the difference shows the shortfall (add micro-plates or round the target).","exact":true,"inputs":{"unit":"kg","bar_weight":20,"target_weight":100},"per_side":[25,15],"total_loaded":100,"per_side_weight":40,"difference_from_target":0},"meta":{"timestamp":"2026-06-06T07:14:06.600Z","request_id":"28efac13-9f62-48a1-b5f0-ec2eeeb16d2b"},"status":"ok","message":"Plate loading","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/warmup":{"get":{"operationId":"get_v1_warmup","tags":["Barbell"],"summary":"Warm-up ramp","description":"","parameters":[{"name":"working_weight","in":"query","required":true,"description":"Working-set weight","schema":{"type":"string"},"example":"100"},{"name":"bar_weight","in":"query","required":false,"description":"Bar weight (default 20)","schema":{"type":"string"},"example":"20"},{"name":"rounding","in":"query","required":false,"description":"Plate increment to round to (default 2.5)","schema":{"type":"string"},"example":"2.5"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"A 4-step ramp at ~40/55/70/85% of the working weight, rounded to a loadable increment, then your working sets. Fewer reps as the bar gets heavier.","inputs":{"bar_weight":20,"working_weight":100},"warmup_sets":[{"reps":8,"weight":40,"percent":40},{"reps":5,"weight":55,"percent":55},{"reps":3,"weight":70,"percent":70},{"reps":2,"weight":85,"percent":85},{"reps":"working sets","weight":100,"percent":100}]},"meta":{"timestamp":"2026-06-06T07:14:06.693Z","request_id":"f8a54532-c39a-4931-b9d3-55bdc9cbbe62"},"status":"ok","message":"Warmup ramp","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":{"notes":"Keep one unit per call (kg or lb). Default bar 20 kg / 45 lb; default plate set is the standard gym selection. Plate loading is greedy heaviest-first. For 1RM estimation from a set use a strength API.","service":"barbell-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/plates":"Which plates to load per side for a target weight (kg or lb).","GET /v1/warmup":"A warm-up ramp from the bar to a working weight.","GET /v1/percent":"Working weight from a 1RM by percentage or by target reps (Epley)."},"description":"Barbell maths: plate loading per side, %1RM working weights and rep-max estimates, and warm-up ramps."},"meta":{"timestamp":"2026-06-06T07:14:06.784Z","request_id":"df36a6d1-97db-4749-8e0d-d72ee204a4cf"},"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":7100,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":420,"monthly_call_quota":56500,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1170,"monthly_call_quota":232000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":3700,"monthly_call_quota":1340000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/barbell-api"}