{"openapi":"3.1.0","info":{"title":"Ventilation & Airflow API","version":"1.0.0","description":"Ventilation and airflow maths as an API, computed locally and deterministically. The air-changes endpoint relates the air changes per hour, the airflow in CFM and the room volume — ACH = CFM × 60 ÷ volume — and solves whichever you leave out (the volume can be given directly or as length × width × height), reporting the airflow in cubic metres per hour too. The required-cfm endpoint applies the ASHRAE 62.1 breathing-zone rule, outdoor airflow = people × Rp + floor area × Ra, with sensible office defaults (5 CFM per person and 0.06 CFM per square foot), to size the fresh-air a space needs. The duct-velocity endpoint computes the air velocity in a round or rectangular duct from the flow and the duct size, V = CFM ÷ area, in feet per minute, metres per second and miles per hour, with guidance on whether it is in the quiet residential or noisier high-velocity range. Everything is computed locally and deterministically, so it is instant and private. Ideal for HVAC, building-services, indoor-air-quality and facilities app developers, ventilation-sizing and duct-design tools, and engineering education. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This is ventilation and airflow; for heating and cooling load sizing use an HVAC API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/ventilation-api","description":"oanor gateway"}],"tags":[{"name":"Ventilation"},{"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/air-changes":{"get":{"operationId":"get_v1_air_changes","tags":["Ventilation"],"summary":"Air changes per hour","description":"","parameters":[{"name":"volume","in":"query","required":false,"description":"Room volume (ft³)","schema":{"type":"string"},"example":"1000"},{"name":"length","in":"query","required":false,"description":"Or length (ft)","schema":{"type":"string"}},{"name":"width","in":"query","required":false,"description":"Width (ft)","schema":{"type":"string"}},{"name":"height","in":"query","required":false,"description":"Height (ft)","schema":{"type":"string"}},{"name":"cfm","in":"query","required":false,"description":"Airflow (CFM)","schema":{"type":"string"},"example":"200"},{"name":"ach","in":"query","required":false,"description":"Air changes per hour","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"ach":12,"cfm":200,"note":"ACH = CFM × 60 / volume(ft³). Air changes per hour is how many times the room's air is fully replaced each hour.","inputs":{"solved_for":"ach","volume_ft3":1000},"volume_ft3":1000,"airflow_m3h":339.8022},"meta":{"timestamp":"2026-06-04T18:38:01.952Z","request_id":"e54036be-e3a1-474f-885d-ef3766764616"},"status":"ok","message":"Air changes","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/duct-velocity":{"get":{"operationId":"get_v1_duct_velocity","tags":["Ventilation"],"summary":"Duct velocity","description":"","parameters":[{"name":"cfm","in":"query","required":true,"description":"Airflow (CFM)","schema":{"type":"string"},"example":"400"},{"name":"diameter","in":"query","required":false,"description":"Round duct diameter (in)","schema":{"type":"string"},"example":"10"},{"name":"width","in":"query","required":false,"description":"Or rectangular width (in)","schema":{"type":"string"}},{"name":"height","in":"query","required":false,"description":"Rectangular height (in)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Velocity = CFM ÷ duct area. Round area = π(d/2)²; rectangular = w·h. Keep main ducts roughly under 1200–1500 fpm to limit noise.","inputs":{"cfm":400,"shape":"round","duct_area_ft2":0.545415},"guidance":"residential / branch ducts","velocity_ms":3.7256,"velocity_fpm":733.386,"velocity_mph":8.3339},"meta":{"timestamp":"2026-06-04T18:38:02.059Z","request_id":"ce2a264d-75ed-4e7d-b0c9-992cf75563e3"},"status":"ok","message":"Duct velocity","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/required-cfm":{"get":{"operationId":"get_v1_required_cfm","tags":["Ventilation"],"summary":"ASHRAE required CFM","description":"","parameters":[{"name":"people","in":"query","required":false,"description":"Number of occupants","schema":{"type":"string"},"example":"5"},{"name":"area","in":"query","required":false,"description":"Floor area (ft²)","schema":{"type":"string"},"example":"500"},{"name":"rate_per_person","in":"query","required":false,"description":"Rp (CFM/person)","schema":{"type":"string"},"example":"5"},{"name":"rate_per_area","in":"query","required":false,"description":"Ra (CFM/ft²)","schema":{"type":"string"},"example":"0.06"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"ASHRAE 62.1: outdoor airflow = people × Rp + area × Ra. Office defaults Rp = 5 cfm/person, Ra = 0.06 cfm/ft².","inputs":{"people":5,"area_ft2":500,"rate_per_area":0.06,"rate_per_person":5},"area_cfm":30,"people_cfm":25,"required_cfm":55,"required_m3h":93.4456},"meta":{"timestamp":"2026-06-04T18:38:02.164Z","request_id":"004ba6b5-7d85-4d32-bc72-72063e8d74ed"},"status":"ok","message":"Required CFM","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":"Imperial: volume ft³, airflow CFM, area ft², duct size inches, velocity fpm (also m/s and m³/h). ASHRAE office defaults Rp = 5, Ra = 0.06.","service":"ventilation-api","formulae":{"air_changes":"ACH = CFM × 60 / volume(ft³)","required_cfm":"CFM = people·Rp + area·Ra","duct_velocity":"V(fpm) = CFM / area(ft²)"},"endpoints":{"GET /v1/meta":"This document.","GET /v1/air-changes":"ACH ⇄ CFM ⇄ room volume — supply any two.","GET /v1/required-cfm":"ASHRAE 62.1 outdoor airflow from people and floor area.","GET /v1/duct-velocity":"Air velocity in a round or rectangular duct from the flow."},"description":"Ventilation and airflow calculator: air changes per hour from flow and room volume, ASHRAE required ventilation from occupancy and area, and duct air velocity from flow and duct size."},"meta":{"timestamp":"2026-06-04T18:38:02.284Z","request_id":"75c8dd85-20a6-4bd9-b7c5-bb60d10bdb33"},"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":2000,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":900,"monthly_call_quota":30000,"rps_limit":5,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2400,"monthly_call_quota":150000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":6900,"monthly_call_quota":750000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/ventilation-api"}