{"openapi":"3.1.0","info":{"title":"Paint Calculator API","version":"1.0.0","description":"Paint estimating and mixing maths as an API, computed locally and deterministically. The coverage endpoint works out how much paint an area needs — paint = area × coats ÷ spreading rate — from an area (in square metres or square feet), the number of coats and the paint's coverage (in m² per litre or square feet per US gallon, defaulting to a typical emulsion), and returns the volume in litres and US gallons and, given a tin size, the number of tins to buy. The room endpoint computes the paintable wall area of a room from its length, width and height — perimeter × height minus the door and window openings, optionally plus the ceiling — and then the paint needed, with sensible default door and window sizes you can override. The ratio endpoint splits a total volume by a mixing ratio such as 4:1 (base to hardener) or 4:1:10 (base, hardener, thinner) into each component's amount and percentage, or scales the whole mix up from one known component amount — for two-part epoxies, catalysed paints and thinning. Everything is computed locally and deterministically, so it is instant and private. Ideal for decorating, trade and DIY tools, hardware-store and paint-shop apps, estimating and quoting software, and home-improvement projects. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This is paint coverage and mixing; for mulch, soil and gravel volumes use a landscaping API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/paint-api","description":"oanor gateway"}],"tags":[{"name":"Paint"},{"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/coverage":{"get":{"operationId":"get_v1_coverage","tags":["Paint"],"summary":"Paint needed for an area","description":"","parameters":[{"name":"area","in":"query","required":false,"description":"Area (m²)","schema":{"type":"string"},"example":"50"},{"name":"area_sqft","in":"query","required":false,"description":"Or area (sq ft)","schema":{"type":"string"}},{"name":"coats","in":"query","required":false,"description":"Number of coats (default 2)","schema":{"type":"string"},"example":"2"},{"name":"coverage","in":"query","required":false,"description":"Coverage (m²/L, default 11)","schema":{"type":"string"}},{"name":"can_size","in":"query","required":false,"description":"Tin size (L) for tin count","schema":{"type":"string"},"example":"5"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"coats":2,"area_m2":50,"formula":"paint = area · coats / coverage_rate.","cans_needed":2,"paint_litres":9.0909,"can_size_litres":5,"paint_us_gallons":2.4016,"coverage_m2_per_litre":11},"meta":{"timestamp":"2026-06-04T10:18:51.623Z","request_id":"a38276a1-1e53-4507-9c83-08e4f8b654df"},"status":"ok","message":"Paint needed for an area","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/ratio":{"get":{"operationId":"get_v1_ratio","tags":["Paint"],"summary":"Split a volume by a mixing ratio","description":"","parameters":[{"name":"ratio","in":"query","required":true,"description":"Mixing ratio, e.g. 4:1 or 4:1:10","schema":{"type":"string"},"example":"4:1"},{"name":"total","in":"query","required":false,"description":"Total volume to split","schema":{"type":"string"},"example":"5"},{"name":"known_part_amount","in":"query","required":false,"description":"Or scale from one known component","schema":{"type":"string"}},{"name":"known_part_index","in":"query","required":false,"description":"Index of the known component (0-based)","schema":{"type":"string"}},{"name":"labels","in":"query","required":false,"description":"Optional component labels (comma-separated)","schema":{"type":"string"},"example":"base,hardener"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"ratio":"4:1","formula":"each component = total · part / sum(parts).","ratio_sum":5,"components":[{"index":0,"label":"base","ratio":4,"amount":4,"percent":80},{"index":1,"label":"hardener","ratio":1,"amount":1,"percent":20}],"total_volume":5},"meta":{"timestamp":"2026-06-04T10:18:51.761Z","request_id":"e970a496-bc21-469b-b587-36fd7aba509a"},"status":"ok","message":"Split a volume by a mixing ratio","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/room":{"get":{"operationId":"get_v1_room","tags":["Paint"],"summary":"Paintable wall area of a room","description":"","parameters":[{"name":"length","in":"query","required":true,"description":"Room length (m)","schema":{"type":"string"},"example":"4"},{"name":"width","in":"query","required":true,"description":"Room width (m)","schema":{"type":"string"},"example":"3"},{"name":"height","in":"query","required":true,"description":"Room height (m)","schema":{"type":"string"},"example":"2.5"},{"name":"doors","in":"query","required":false,"description":"Number of doors (default 1)","schema":{"type":"string"},"example":"1"},{"name":"windows","in":"query","required":false,"description":"Number of windows (default 0)","schema":{"type":"string"},"example":"2"},{"name":"include_ceiling","in":"query","required":false,"description":"Include the ceiling (true/false)","schema":{"type":"string"},"example":"false"},{"name":"coats","in":"query","required":false,"description":"Number of coats (default 2)","schema":{"type":"string"},"example":"2"},{"name":"coverage","in":"query","required":false,"description":"Coverage (m²/L, default 11)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"coats":2,"doors":1,"formula":"paintable = perimeter · height − doors − windows (+ ceiling); paint = paintable · coats / coverage.","width_m":3,"windows":2,"height_m":2.5,"length_m":4,"perimeter_m":14,"paint_litres":5.5273,"ceiling_area_m2":0,"include_ceiling":false,"openings_area_m2":4.6,"paint_us_gallons":1.4602,"paintable_area_m2":30.4,"gross_wall_area_m2":35,"coverage_m2_per_litre":11},"meta":{"timestamp":"2026-06-04T10:18:51.868Z","request_id":"d7834b9c-9b4c-4680-a8ef-99f7037b839c"},"status":"ok","message":"Paintable wall area of a room","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":{"api":"paint","note":"Paint estimating & mixing maths — computed locally and deterministically, no key, no third-party service.","defaults":{"coats":2,"door_area_m2":1.8,"window_area_m2":1.4,"coverage_m2_per_litre":11},"endpoints":["/v1/coverage","/v1/room","/v1/ratio","/v1/meta"]},"meta":{"timestamp":"2026-06-04T10:18:51.979Z","request_id":"d6ac120f-bf51-4695-95ac-834419395e81"},"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":3000,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":400,"monthly_call_quota":40000,"rps_limit":5,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1100,"monthly_call_quota":250000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":3900,"monthly_call_quota":1530000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/paint-api"}