OD600 to CFU calculator
Turn a spectrophotometer reading into a viable cell estimate: an OD600 of 0.5 with a factor of 8 × 10⁸ CFU/mL per OD unit gives 4 × 10⁸ CFU/mL. Add the dilution when the cuvette held a diluted sample. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Od600
- 0.5
- Factor
- 800,000,000
- Dilution
- 1
- Cfu per ml
- 400,000,000
- Cfu scientific
- 4e8
Microbiology labs estimate culture density from spectrophotometer readings at six hundred nanometers, then convert that optical density into viable colony forming units per milliliter using an organism- and setup-specific factor. This OD600 to CFU calculator multiplies a non-negative OD600 by your conversion factor in CFU per milliliter per OD unit, optionally scales by a dilution factor when the cuvette sample was diluted before measurement, and returns both a full numeric CFU per milliliter value and a compact scientific-notation string for lab notebooks.
What OD600 to CFU conversion means in the lab
Optical density at six hundred nanometers is a bulk turbidity measurement: more cells and debris scatter more light, so the spectrophotometer reports a higher OD600 as a culture thickens. Colony forming units per milliliter count only viable cells that can form colonies on plates, which is the quantity you need for inoculum planning, challenge studies, and quality release. Those two numbers are related but not identical: dead cells, media particles, and chain-forming morphology all affect turbidity without matching plate counts one-to-one.
Labs therefore establish a conversion factor—CFU per milliliter per OD unit—by calibrating plate counts against OD600 under fixed strain, medium, temperature, path length, and instrument settings. A widely cited Escherichia coli rule of thumb near eight times ten to the eighth CFU per milliliter per OD unit is only a starting guess; your factor may differ by strain and spectrophotometer.
Once you have a factor, the estimate is simple multiplication: CFU per milliliter equals OD600 times factor, and if the OD was taken on a diluted aliquot you multiply again by the fold dilution so the result refers to the undiluted culture. This capability does not invent a universal microbial constant; it applies your stated factor deterministically so growth-curve software, LIMS fields, and student homework share one contract.
Workflows, limits, and related search intent
Teaching labs can fix factor to a textbook value so students focus on reading OD and applying dilution math. Limits: this tool does not replace plate counts, flow cytometry, or qPCR; it multiplies the numbers you supply. It does not correct for non-linear OD at high density—dilute into the linear range and pass the dilution factor instead of trusting OD above roughly one without calibration.
It is not a growth-rate fitter, not a Beer–Lambert path-length converter, and not a dry-weight estimator, though those workflows often sit next to OD600 to CFU conversion in lab notebooks. Search intent for this landing includes OD600 to CFU calculator, optical density to colony forming units, viable cell concentration from OD, and CFU per milliliter conversion factor online.
What you can do with it
Growth curves and inoculum planning
Convert each OD600 time point with your strain-specific factor (and dilution when needed) into CFU/mL for log-phase harvest targets and reproducible inoculum sizes.
Bioreactor and LIMS logging
Pipe spectrophotometer OD readings into automated viable-cell estimates using a fixed conversion factor stored per organism and medium in manufacturing or QC pipelines.
Teaching OD versus plate counts
Show students how turbidity maps to CFU/mL only through a calibrated factor, and how a 1:10 dilution multiplies the estimated undiluted titer by ten.
FAQ
How do I convert OD600 to CFU/mL?
Send non-negative od600 and a positive factor (CFU/mL per OD unit).
What conversion factor should I use?
Use a factor calibrated for your organism, medium, and spectrophotometer. Common E. coli rules of thumb near 8×10^8 CFU/mL per OD are only starting points—not universal constants.
When do I set the dilution field?
When the OD600 was measured on a diluted aliquot. For a 1:10 dilution set dilution to 10 so the result estimates the undiluted culture. Leave it at 1 for undiluted samples.
Why does the calculator refuse a negative OD600?
A negative reading usually means a bad blank or the wrong wavelength, not a negative number of cells, so the value is rejected instead of being silently flipped. Re-blank the spectrophotometer and measure again.
Can an OD600 estimate replace a plate count?
No. Turbidity also picks up dead cells and media particles, so the result is only as good as your calibration factor. The tool multiplies the numbers you supply; plate counts, flow cytometry or qPCR remain the reference.
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/bio/od-to-cfu \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"od600":0.5,"factor":800000000}'const res = await fetch("https://api.kit.forhosting.com/bio/od-to-cfu", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"od600": 0.5,
"factor": 800000000
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/od-to-cfu",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"od600": 0.5,
"factor": 800000000
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/od-to-cfu", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"od600":0.5,"factor":800000000}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"od600":0.5,"factor":800000000}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/od-to-cfu", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"od600": 0.5,
"factor": 800000000
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.od_to_cfu",
"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 optical density, non-positive factor, and non-positive dilution fail with invalid_input instead of inventing a titer.
What OD600 to CFU conversion means in the lab
Blank-corrected OD should already be non-negative before you call the API; negative readings are rejected as invalid rather than absolute-valued silently, because a negative OD usually means a bad blank or wrong wavelength, not a negative cell density.
Input contract, response fields, and validation
Example: OD600 zero point five with factor eight hundred million and dilution one yields four hundred million CFU per milliliter; the same OD on a one-to-ten diluted cuvette with dilution ten yields four billion CFU per milliliter for the undiluted stock. Keep factor and OD on the same instrument path length; mixing cuvettes of different path lengths without renormalizing OD will mis-scale CFU estimates even when the arithmetic is correct. POST a JSON body with required od600 as a finite non-negative number—aliases include od, optical_density, absorbance, and a600—and required factor as a finite positive conversion in CFU per milliliter per OD600 unit, with aliases conversion_factor, cfu_per_od, cfu_factor, k, and cells_per_od. Optional dilution defaults to one for undiluted measurements; when present it must be a finite positive fold dilution (aliases dilution_factor, df, fold_dilution, dil). On success the response echoes od600, factor, and dilution with stable twelve-decimal rounding, plus cfu_per_ml as the primary numeric result, cfu_scientific as a compact scientific string for large titers, formula restating whether dilution was unity or not, and message as a short English summary. Missing fields, non-finite strings, boolean types, negative OD600, non-positive factor, and non-positive dilution fail with invalid_input and are not billed. Pricing for successful work is a flat $0.002 with unit item.
Workflows, limits, and related search intent
Typical workflow: blank the spectrophotometer with sterile medium, measure OD600 of a well-mixed culture or a known dilution, enter your calibrated factor, set dilution when the cuvette was diluted, and log cfu_per_ml or cfu_scientific next to the time point. Bioreactor scripts can call the API after each OD sample to fill viable-cell estimates without embedding organism tables in every service. Failed validation does not consume prepaid balance, so exploratory scripts that probe empty factors stay cheap. Round-trip checks are straightforward: recompute od600 times factor times dilution and confirm equality with cfu_per_ml within published rounding, then confirm that a negative OD flips the response from success to invalid_input with a clear field message.
Technical questions
Why was my request rejected?
Negative OD600, non-positive factor or dilution, missing fields, or non-finite values fail with invalid_input and are not billed.
What does the OD600 to CFU calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.