Crude protein calculator
Convert a lab nitrogen result into the crude protein figure used on labels and ration sheets: 16 % nitrogen times the default factor of 6.25 gives 100 % protein. Supply a food-specific factor, such as 6.38 for dairy, when your method calls for it. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Nitrogen percent
- 16
- Conversion factor
- 6.25 %
- Crude protein
- 100
Crude protein is the conventional laboratory estimate of protein in food, feed, grain, and dairy: measured nitrogen multiplied by a fixed conversion factor. Kjeldahl and Dumas assays report nitrogen percent; they do not report protein directly. This crude protein calculator accepts that nitrogen percentage, multiplies it by the Jones factor (6.25 by default, or a food-specific factor you supply), and returns the protein percentage used on labels, ration sheets, and AOAC worksheets. Negative nitrogen is rejected as invalid input so a sign error never becomes a negative protein claim. Zero nitrogen is allowed and correctly yields zero protein.
What crude protein means and why laboratories multiply nitrogen by a factor
The Kjeldahl method and the combustion Dumas method measure nitrogen in a sample, not protein itself. Most mixed dietary proteins contain about sixteen percent nitrogen by mass, so dividing one hundred by sixteen yields the Jones conversion factor 6.25 that AOAC methods use for mixed foods and unknown commodities. The word crude is deliberate.
The product is not true protein from amino-acid chromatography; it is an estimate that also counts non-protein nitrogen from urea, nucleic acids, and free amino acids. Feed mills, grain elevators, dairy plants, and nutrition labels still report crude protein because it is cheap, standardized, and comparable across lots. Food-specific Jones factors exist when the nitrogen content of the typical protein differs from sixteen percent: milk and dairy often use 6.38, wheat 5.70, soy 5.71, rice 5.95, and meat or mixed diets remain at 6.25.
What you can do with it
Feed mill and grain protein checks
Convert Kjeldahl or Dumas nitrogen percent from incoming lots into crude protein for ration sheets using 6.25 or a specified Jones factor.
Dairy and food-label specification
Apply a dairy factor of 6.38 (or another method factor) to laboratory N% and compare the crude protein result with the claimed specification.
Homework, LMS, and LIMS oracles
Grade nitrogen-to-protein items with a deterministic contract that rejects negative nitrogen and never invents a protein percentage from a missing field.
FAQ
Why is the default conversion factor 6.25?
Most mixed proteins are treated as 16% nitrogen, and 100 divided by 16 is 6.25.
Which conversion factor should I use for milk, wheat or soy?
Common Jones factors are 6.38 for milk and dairy, 5.70 for wheat, 5.71 for soy and 5.95 for rice, while meat and mixed diets stay at 6.25. Enter the factor your method specifies instead of the default.
Why is it called crude protein?
Because it is an estimate, not true protein measured from amino acids. Multiplying total nitrogen also counts nitrogen that is not in protein, such as urea, nucleic acids and unbound amino acids.
What happens if the nitrogen percentage is negative?
The calculator rejects it, so a sign error never turns into a negative protein claim. A nitrogen value of zero is accepted and simply gives zero crude protein.
Does it convert the result to a dry-matter basis?
No. It multiplies the nitrogen you enter by the factor and nothing more. Converting wet results to dry basis, subtracting non-protein nitrogen or choosing a factor from a commodity table must be done beforehand.
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/chem/crude-protein \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"nitrogen_percent":16}'const res = await fetch("https://api.kit.forhosting.com/chem/crude-protein", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"nitrogen_percent": 16
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/chem/crude-protein",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"nitrogen_percent": 16
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/chem/crude-protein", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"nitrogen_percent":16}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"nitrogen_percent":16}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/chem/crude-protein", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"nitrogen_percent": 16
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "chem.crude_protein",
"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
What crude protein means and why laboratories multiply nitrogen by a factor
Crude protein percent is therefore nitrogen percent times that factor: sixteen times 6.25 is one hundred, which is the classic identity every food-chemistry course drills. This calculator applies whichever positive factor you send and defaults to 6.25 when you omit conversion_factor, matching the AOAC mixed-food convention. It does not look up a commodity table, does not subtract non-protein nitrogen, and does not convert wet-basis results to dry-basis; those steps belong upstream of this closed identity.
Input contract, response shape, and error behaviour
When you do send a factor it must be a finite number strictly greater than zero, because a zero or negative nitrogen-to-protein multiplier would invent a meaningless protein percentage. Zero nitrogen is valid and returns zero crude protein. POST a JSON body with nitrogen_percent, a finite non-negative number for the measured nitrogen content as a percentage. Aliases nitrogen, n_percent, n, nitrogen_pct, and kjeldahl_n are accepted when your client already uses a shorter name. conversion_factor is optional and defaults to 6.25, the Jones mixed-food factor; aliases factor, jones_factor, protein_factor, and n_factor are accepted. Each field may arrive as a JSON number or as a numeric string that parses as a finite value; missing fields, empty strings, and non-finite values fail with invalid_input naming the field. On success the body echoes rounded nitrogen_percent and conversion_factor, sets crude_protein to their product rounded to twelve decimal places, unit to the percent sign, formula to crude_protein equals nitrogen_percent times conversion_factor, and method to kjeldahl_jones so downstream routers can branch without sniffing shapes. A classic classroom check is nitrogen_percent sixteen with the default factor, which yields crude_protein one hundred. Pair the response with your own moisture or dry-matter conversion if you still need protein on a dry basis; this endpoint multiplies only.
Where a crude protein API earns its keep
Feed mills and nutritionists convert Kjeldahl nitrogen from incoming grain, oilseed meal, and mixed rations into crude protein for least-cost formulation without re-deriving 6.25 in every spreadsheet. Food-label and QA teams check that a laboratory N% times the method factor matches the protein claim on a specification sheet before a lot ships. Failed validation does not consume balance. Dairy plants that report protein on a 6.38 Jones factor can send that conversion_factor explicitly instead of baking a second formula into a custom script. Classroom and exam tools need a deterministic oracle that marks a negative nitrogen entry as invalid_input rather than silently printing a negative protein that a buggy grader might treat as success. Keep requests small, pin the rounded crude_protein in tests, and you get reproducible protein percentages for homework, LMS plugins, and edge workers without standing up a chemistry CAS. Prefer this capability when you already have nitrogen percent and only need the Jones product; if your source is still a wet digest titre, finish the Kjeldahl N% calculation first, then call this endpoint.
Technical questions
How do I calculate crude protein from nitrogen percent?
Send nitrogen_percent as a finite non-negative number. The API multiplies it by conversion_factor (default 6.25, the Jones mixed-food factor) and returns crude_protein as a percentage.
What happens if the nitrogen percentage is negative?
The task fails with invalid_input. A negative nitrogen percentage is not a valid assay result, so the request is not billed.
Can I use a food-specific Jones factor?
Yes. Send conversion_factor (or aliases factor, jones_factor, protein_factor, n_factor) as a positive number such as 6.38 for dairy, 5.70 for wheat, or 5.71 for soy.
What does the crude protein calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.