{"openapi":"3.1.1","info":{"title":"George Kelly Contribution Calculator","version":"1.0.0","description":"Read-only arithmetic for commerce scenarios. No authentication, transactions, external data retrieval, or side effects. Use the same currency for every monetary input. GET query strings can appear in hosting or client logs; use the local browser calculator for sensitive figures."},"servers":[{"url":"https://www.iamgeorgekelly.com"}],"paths":{"/api/tools/contribution":{"get":{"operationId":"calculateContribution","summary":"Calculate contribution after advertising and explicit return ratios","description":"All four parameters are required exactly once as non-negative decimal numbers, at most 1e12. Unknown, duplicate, empty, signed, exponent, and non-finite values are rejected. Excludes fixed overhead. Zero ad spend returns null spend ratios; non-positive pre-ad margin returns null breakEvenRoas. Calculations use JavaScript double precision. Inputs that underflow to zero or cause a non-finite output are rejected. No display rounding is applied to the JSON result.","parameters":[{"name":"netRevenue","in":"query","required":true,"description":"Net revenue. Revenue after discounts and refunds, excluding sales tax.","schema":{"type":"number","minimum":0,"maximum":1000000000000},"example":1000},{"name":"costOfGoods","in":"query","required":true,"description":"Cost of goods. Cost assigned to the items sold.","schema":{"type":"number","minimum":0,"maximum":1000000000000},"example":550},{"name":"variableCosts","in":"query","required":true,"description":"Other variable costs. Other variable order costs not already included in costOfGoods.","schema":{"type":"number","minimum":0,"maximum":1000000000000},"example":150},{"name":"adSpend","in":"query","required":true,"description":"Advertising spend. Advertising spend for the same cohort.","schema":{"type":"number","minimum":0,"maximum":1000000000000},"example":200}],"responses":{"200":{"description":"Calculated scenario, not a forecast or attribution claim","content":{"application/json":{"schema":{"type":"object","required":["formulaVersion","input","grossProfit","contributionBeforeAds","contributionAfterAds","revenueRoas","grossProfitReturn","contributionReturn","breakEvenRoas","contributionMarginBeforeAds","units","scope"],"properties":{"formulaVersion":{"const":"1.0"},"input":{"type":"object","additionalProperties":false,"required":["netRevenue","costOfGoods","variableCosts","adSpend"],"properties":{"netRevenue":{"type":"number","minimum":0,"maximum":1000000000000},"costOfGoods":{"type":"number","minimum":0,"maximum":1000000000000},"variableCosts":{"type":"number","minimum":0,"maximum":1000000000000},"adSpend":{"type":"number","minimum":0,"maximum":1000000000000}}},"grossProfit":{"type":"number"},"contributionBeforeAds":{"type":"number"},"contributionAfterAds":{"type":"number"},"revenueRoas":{"type":["number","null"],"description":"A multiple, or null when the denominator is zero. Negative returns are possible."},"grossProfitReturn":{"type":["number","null"],"description":"A multiple, or null when the denominator is zero. Negative returns are possible."},"contributionReturn":{"type":["number","null"],"description":"A multiple, or null when the denominator is zero. Negative returns are possible."},"breakEvenRoas":{"type":["number","null"],"description":"Net revenue divided by contribution before ads when both are positive; otherwise null."},"contributionMarginBeforeAds":{"type":["number","null"],"description":"Contribution before ads divided by net revenue, as a decimal fraction; null when revenue is zero."},"units":{"type":"string"},"scope":{"type":"string"}}}}}},"400":{"description":"Missing or invalid input","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}}}}}}