CO2 breathing emission calculator
Ten people working eight hours at 0.045 kg per person-hour breathe out 3.6 kg of CO2 over 80 person-hours, a quick and auditable figure for a classroom, office or venue. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- People
- 10
- Hours
- 8
- Interest rate
- 0.045
- Rate kg per person hour
- 0.045
- Person hours
- 80
- Co2 kg
- 3.6
Human lungs constantly exchange gases, and every occupant in a room, office, classroom or venue therefore adds carbon dioxide to the indoor air. This CO2 breathing emission calculator estimates the mass of carbon dioxide exhaled by a group from three numbers you already know: how many people are present, how many hours they stay, and the emission rate in kilograms of carbon dioxide per person-hour. It multiplies those three finite values and returns the total mass in kilograms, plus the person-hours that produced it.
How exhaled CO2 from breathing is calculated
A breathing-emission estimate is a screening product, not a metabolic laboratory measurement. The mass of carbon dioxide a group exhales equals the number of people times the hours they occupy a space times the emission rate in kilograms of carbon dioxide per person-hour. Person-hours are the first product: ten people for eight hours are eighty person-hours, and those eighty hours then scale by the rate you supply.
A typical sedentary adult at rest or at a desk oxidises roughly thirty-five to fifty grams of carbon dioxide per hour, which is why many indoor-air screening notes use a round 0.045 or 0.05 kilograms per person-hour; sleeping is lower, light walking or teaching is higher, and a gym class can exceed one tenth of a kilogram per person-hour. You bring the rate that matches the activity you are modelling, because this calculator does not guess a metabolic equivalent or a body mass.
The product is returned in kilograms so it can sit next to other carbon inventories that already speak in kilograms rather than litres of exhaled gas. The method does not convert volume through temperature, pressure or humidity, does not apply an occupancy schedule inside the hour, and does not subtract outdoor background concentration: those belong in a full indoor-air mass-balance model. What you get is a transparent operational mass you can audit.
Change any one of the three factors and the kilograms move in lockstep. One hundred people in a hall for two hours at 0.045 kilograms per person-hour produce nine kilograms of carbon dioxide from breathing alone, which is why a crowded poorly ventilated room climbs in parts per million even when no combustion is taking place. This tool is not a substitute for a fuel-travel compare or a combustion inventory: those pages answer a different search, about engines and tanks, not about exhaled gas from lungs.
What to enter and in which units
Fractional people are allowed so an average occupancy of twelve and a half does not have to be rounded first, and fractional hours are allowed so a ninety-minute class is sent as 1.5. Missing fields, empty strings, booleans, objects and tokens that are not plain decimal or scientific numbers fail the same way. Zero is accepted and returns zero kilograms, because an empty room or a zero-hour booking really does add no exhaled mass.
Numbers are rounded to twelve decimal places so goldens and clients compare byte-for-byte across runtimes. If the product overflows to Infinity the task fails rather than returning a non-finite mass.
Who uses a breathing CO2 estimate
Facilities teams, indoor-air desks and event planners use a deterministic CO2 breathing calculator to turn a stated headcount, a booking length and a published activity rate into kilograms they can put next to ventilation notes, instead of quoting a slogan about stale air. Campaign pages that ask visitors to log a week of occupied rooms can send the same three numbers the visitor already typed and show the exhaled mass without inventing an activity class. Failed validation does not consume balance.
Keep requests small, pin the rounded fields in tests, and you get a reproducible occupancy product without standing up a computational-fluid-dynamics model of your own.
What you can do with it
Office occupancy carbon memo
Turn a desk-count, a working day in hours and a sedentary kg-per-person-hour rate into the kilograms of CO2 the team exhales, for a facilities or sustainability note.
FAQ
How is CO2 from breathing calculated?
Total kilograms equal people times hours times the emission rate in kilograms of CO2 per person-hour. Person-hours are the first product. Ten people for eight hours at 0.045 kg/person-hour give 3.6 kilograms.
What rate should I use per person-hour?
A typical sedentary adult sits near 0.04–0.05 kilograms of CO2 per hour. Sleeping is lower; light activity and teaching are higher; vigorous exercise can exceed 0.1. Supply the rate that matches the activity you are modelling. The calculator does not guess metabolic equivalent.
Does this estimate indoor CO2 in parts per million?
No. It returns exhaled mass in kilograms, not a room concentration. Concentration also needs room volume, outdoor background and ventilation.
What happens if people, hours or rate is negative?
A negative headcount, duration or rate is not a physical occupancy. Zero is allowed and returns zero kilograms. Invalid input is not billed.
Is this the same as car or combustion CO2, and what does it cost?
No. This page estimates exhaled gas from lungs, not fuel burned in an engine or a boiler. The browser tool is free.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/eco/co2-breathing-emission \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"people":10,"hours":8,"rate":0.045}'const res = await fetch("https://api.kit.forhosting.com/eco/co2-breathing-emission", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"people": 10,
"hours": 8,
"rate": 0.045
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/eco/co2-breathing-emission",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"people": 10,
"hours": 8,
"rate": 0.045
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/eco/co2-breathing-emission", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"people":10,"hours":8,"rate":0.045}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"people":10,"hours":8,"rate":0.045}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/eco/co2-breathing-emission", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"people": 10,
"hours": 8,
"rate": 0.045
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "eco.co2_breathing_emission",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Negative people, hours or rates fail with invalid_input instead of inventing a footprint.
Inputs, units, aliases and error behaviour
Send a JSON object with three required finite numbers: people, the occupancy headcount; hours, the duration of stay; and rate, the emission factor in kilograms of carbon dioxide per person-hour. Each field also accepts a numeric string and a short list of aliases (persons, n, occupancy, headcount, duration, duration_hours, t, time_hours, emission_rate, kg_per_person_hour, factor, co2_rate) so spreadsheets and forms do not have to rename columns. Any negative value is rejected: a negative headcount, a negative duration or a negative rate is not a physical occupancy, so the task fails with invalid_input that names the field. On success the response echoes the resolved people, hours and rate_kg_per_person_hour, then reports person_hours, co2_kg, a compact formula string, and the method label person_hours_times_rate. There is no network lookup, no random draw, and no dependence on the current date: the same three numbers always produce the same JSON.
Where a breathing-emission API earns its keep
Classroom and lecture-theatre studies that already log attendance and period length can post one task per session and store co2_kg beside the room identifier without opening a spreadsheet of metabolic factors. If you later need indoor concentration in parts per million, feed these kilograms into a volume-and-ventilation step that you control; this endpoint stops at exhaled mass on purpose.
Integration use cases
Classroom and venue session logs
Post one task per lesson or event with attendance, duration and an activity rate, then store person_hours and co2_kg beside the room identifier.
Classroom and campaign widgets
Let visitors type a headcount, a stay in hours and a rate and see the exhaled kilograms on a live tool that matches the API byte-for-byte.