COVID lockdown pollution calculator
A city that went from ten million to four million vehicle-kilometres at 0.32 g of NOx per kilometre avoided 1,920 kg of NOx: turn a traffic drop into grams, kilograms and tonnes you can cite. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Baseline vkm
- 10,000,000
- Lockdown vkm
- 4,000,000
- Emission factor g per km
- 0.32
- Reduced vkm
- 6,000,000
- Avoided mass g
- 1,920,000
- Avoided mass kg
- 1,920
- Avoided mass t
- 1.92
Stay-at-home orders in 2020 cut road traffic in almost every city that published vehicle-kilometer statistics, and satellite and roadside monitors recorded a matching drop in nitrogen oxides, fine particles, and carbon monoxide. Researchers, city air-quality desks, and classroom climate labs therefore need a transparent way to turn that mobility shock into avoided pollutant mass rather than a vague claim that lockdowns cleaned the air. This COVID lockdown pollution calculator estimates the avoided mass of a chosen air pollutant by subtracting lockdown vehicle-kilometers from the baseline of a matching period and multiplying the reduced vehicle-kilometers by a per-kilometer emission factor in grams. Zero on any factor is valid and yields a well-defined mass, including a zero result when traffic did not change or the fleet factor is zero.
What a lockdown pollution inventory is and how avoided mass is computed
A lockdown air-pollution inventory answers a narrow, bookkeeping question: if a fleet that used to drive a known number of vehicle-kilometers instead drove a smaller number for the same window of days, how many grams of a named pollutant were not emitted? You supply the emission factor because it is not a universal constant.
It depends on the pollutant (nitrogen oxides, PM2.5, carbon monoxide, volatile organics, or carbon dioxide), the fleet mix of cars, vans, buses, and trucks, the fuel, the speed distribution, and whether the figure is a tailpipe factor or a well-to-wheel factor. A city that drove ten million vehicle-kilometers before lockdown and four million during lockdown, at 0.32 grams of NOx per kilometer, avoided 1 920 000 grams, which is 1 920 kilograms or 1.92 metric tonnes.
What you can do with it
City lockdown air-quality briefings
Turn a published drop in vehicle-kilometers and a fleet NOx or PM2.5 factor into avoided grams, kilograms, and tonnes for a public briefing.
Academic mobility-to-mass replication
Reproduce the lockdown inventory identity used in 2020 traffic papers: reduced vehicle-kilometers times a grams-per-kilometer emission factor.
Classroom climate and journalism estimates
Let students or reporters vary baseline traffic, lockdown traffic, and the emission factor, then verify that avoided mass tracks the VKM reduction.
FAQ
How is the pollution avoided during a lockdown calculated?
Subtract lockdown vehicle-kilometres from those of a baseline period of the same length, then multiply the difference by the emission factor in grams per kilometre. Ten million minus four million at 0.32 g of NOx gives 1,920,000 grams.
Which emission factor should I use?
Use a fleet-average factor for the pollutant you care about, in grams per vehicle-kilometre, such as 0.32 g of NOx or 0.025 g of PM2.5. It depends on fleet mix, fuel and speeds, so take it from a source that matches your city.
Does it show how much cleaner the air became?
No. It gives the pollutant mass not emitted at the tailpipe, not the concentration people breathe. Turning that mass into air quality needs a chemical transport model, which sits outside this calculation.
What happens if traffic rose during the lockdown?
The result turns negative and is reported as an increase instead of being cut off at zero, so a rebound in traffic shows up honestly in your inventory.
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/covid-pollution \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"baseline_vkm":10000000,"lockdown_vkm":4000000,"emission_factor_g_per_km":0.32}'const res = await fetch("https://api.kit.forhosting.com/eco/covid-pollution", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"baseline_vkm": 10000000,
"lockdown_vkm": 4000000,
"emission_factor_g_per_km": 0.32
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/eco/covid-pollution",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"baseline_vkm": 10000000,
"lockdown_vkm": 4000000,
"emission_factor_g_per_km": 0.32
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/eco/covid-pollution", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"baseline_vkm":10000000,"lockdown_vkm":4000000,"emission_factor_g_per_km":0.32}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"baseline_vkm":10000000,"lockdown_vkm":4000000,"emission_factor_g_per_km":0.32}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/eco/covid-pollution", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"baseline_vkm": 10000000,
"lockdown_vkm": 4000000,
"emission_factor_g_per_km": 0.32
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "eco.covid_pollution",
"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 vehicle-kilometers and a negative emission factor are rejected as invalid_input because a physical inventory cannot start from a negative distance or a negative grams-per-kilometer intensity.
What a lockdown pollution inventory is and how avoided mass is computed
The identity is the same one used in COVID mobility papers that convert a traffic shock into a mass: reduced vehicle-kilometers equal baseline_vkm minus lockdown_vkm, and avoided_mass_g equals that difference times emission_factor_g_per_km. If lockdown traffic exceeds the baseline the difference is negative and the endpoint reports an increase rather than inventing a floor at zero, because a honest inventory must be able to show a rebound. The calculator does not invent a fleet factor from a city name, does not call a traffic API, and does not apply a chemical transport model; those layers sit outside this multiply and should be applied in your own study if you need ambient concentrations rather than avoided mass at the tailpipe.
Input contract, aliases, negatives, and the mass you get back
Zero is valid on every factor. Example: ten million baseline vehicle-kilometers, four million lockdown vehicle-kilometers, and 0.32 grams per kilometer yield a sixty percent reduction and 1 920 000 grams avoided. POST a JSON body with three required finite numbers: baseline_vkm, the vehicle-kilometers traveled in the comparison or pre-lockdown period; lockdown_vkm, the vehicle-kilometers traveled during the lockdown window of the same length; and emission_factor_g_per_km, the fleet-average grams of pollutant per vehicle-kilometer. Accepted aliases for the baseline are baseline_vkt, vkm_baseline, vehicle_km_baseline, and baseline_vehicle_km. Accepted aliases for the lockdown total are lockdown_vkt, vkm_lockdown, vehicle_km_lockdown, and lockdown_vehicle_km. Accepted aliases for the factor are ef_g_per_km, emission_factor, g_per_km, factor_g_km, and ef. Each field may arrive as a JSON number or as a decimal numeric string. Missing fields, empty strings, non-finite values, and magnitudes beyond the supported absolute ceiling fail with invalid_input naming the field. A negative baseline, a negative lockdown total, or a negative emission factor is rejected because vehicle-kilometers and grams per kilometer cannot be negative; the error message states that the field cannot be negative and the request is not billed. On success the body echoes the cleaned inputs and returns reduced_vkm, avoided_mass_g as the primary mass, plus avoided_mass_kg, avoided_mass_t, and avoided_mass_lb, a direction of avoided, increased, or unchanged, and formula and equation strings for display. When the baseline is positive it also returns reduction_percent.
Where a COVID lockdown pollution calculator earns its keep
City air-quality desks use a COVID lockdown pollution calculator so a published drop in vehicle-kilometers times a fleet NOx or PM2.5 factor becomes a tonnes total they can drop into a briefing without opening a workbook of unit conversions. Failed validation does not consume balance. Keep requests small, pin the rounded gram, kilogram, tonne, and pound figures in tests, and you get reproducible avoided-mass estimates for homework, LMS plugins, sustainability scripts, and edge workers without standing up an emissions-inventory stack of your own. Academic groups that replicate 2020 mobility papers need a deterministic oracle that rejects a negative kilometer total as invalid_input instead of returning a hollow success with a negative distance that a buggy pipeline might treat as a credit. Classroom environmental-science labs and journalism desks often convert a stay-at-home traffic chart into a grams figure before they load a chemical transport model; calling a tiny parse API avoids pulling a desktop spreadsheet for a three-factor inventory.
Technical questions
How is avoided pollutant mass during lockdown calculated?
Send finite non-negative numbers baseline_vkm, lockdown_vkm, and emission_factor_g_per_km. The API returns avoided_mass_g = (baseline_vkm − lockdown_vkm) × emission_factor_g_per_km, plus kilograms, tonnes, and pounds.
What happens if any input is negative?
The task fails with invalid_input naming the field. Vehicle-kilometers and a grams-per-kilometer emission factor cannot be negative, and the request is not billed.
What units does the COVID pollution calculator return?
The primary mass is avoided_mass_g. The same mass is also reported as avoided_mass_kg, avoided_mass_t (metric tonnes), and avoided_mass_lb (international avoirdupois pounds).
What if lockdown traffic is higher than the baseline?
The request succeeds. reduced_vkm and avoided mass are negative, and direction is increased. That is the honest inventory for a rebound, not an error.
What does the COVID lockdown pollution calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.