{"openapi":"3.1.0","info":{"title":"Body Metrics","version":"1.0.0","summary":"BMI, calories, and protein — with the uncertainty the other calculators hide.","description":"Convert height and weight in any common unit, then compute BMI, resting and total energy expenditure, and protein targets. Reports all three standard BMR equations side by side rather than picking one, because they disagree by hundreds of calories a day — and that disagreement is the real precision of the estimate, not the two decimal places a single formula gives you.\n\n**Not for:** Not medical advice, and not a substitute for talking to a clinician or a dietitian. Produces population-level estimates from formulas fitted to population averages; it knows nothing about an individual's health, medication, pregnancy, or history. Does not diagnose anything, and BMI in particular is not a measure of health.\n\nFree tier: 250 calls per UTC day per caller. Past that, endpoints return 402 with x402 payment requirements. An MCP server exposing the same capabilities is available at https://body-metrics.gumballtools.com/api/mcp.","contact":{"url":"https://github.com/bwalvoord/gumball"}},"servers":[{"url":"https://body-metrics.gumballtools.com","description":"Production"}],"externalDocs":{"url":"https://body-metrics.gumballtools.com/llms-full.txt","description":"Full documentation for agents"},"paths":{"/api/v1/metrics":{"get":{"operationId":"bodyMetrics","summary":"BMI, calories, and protein — with the uncertainty the other calculators hide.","description":"Returns BMI, every standard BMR estimate with the spread between them, a TDEE range, protein targets, and a not-medical-advice disclaimer in the payload.","parameters":[{"name":"height","in":"query","required":true,"description":"Height WITH a unit (178cm, 5'10\", 70in). A bare number is refused. Also send weight, sex, and age.","schema":{"type":"string"}}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid input. The body names the field and how to fix it.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","fix_hint","docs"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string"},"fix_hint":{"type":"string","description":"What to change before retrying."},"field":{"type":"string"},"token":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"docs":{"type":"string","format":"uri"}}}}}}}},"402":{"description":"Free quota of 250 calls per UTC day exhausted. Body is an x402 v1 payment requirement ($0.001 per call). While settlement is disabled the body carries payment_enabled: false and the call cannot be unblocked by paying — wait for quota.resetsAt.","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}