Fertilizer NPK rate per hectare calculator
This fertilizer NPK rate calculator finds the minimum kilograms of a fertilizer product to apply per hectare so that its analysis supplies all entered nitrogen, phosphorus, and potassium targets.
Run — free
It evaluates each nutrient separately, selects the nutrient requiring the greatest product rate, and shows how much of every nutrient that rate supplies. The result also identifies the controlling nutrient and any surplus caused by a product ratio that does not exactly match the target ratio. Targets and product percentages must be expressed on the same nutrient basis.
Enter compatible target rates and fertilizer analysis
Start with the agronomic target for each nutrient in kilograms per hectare, then enter the three percentages printed or specified for the fertilizer product. A target may be zero when that nutrient is not required, but at least one target must be positive. The percentage for any nutrient with a positive target must also be greater than zero; a product containing none of a required nutrient cannot meet that target at any application rate. Most importantly, keep the nutrient basis consistent. Fertilizer labels in many markets express phosphorus and potassium as phosphate and potash equivalents, commonly P2O5 and K2O, while some soil recommendations use elemental P and K. Do not combine an elemental target with an oxide percentage without converting one side first. The calculator deliberately does not guess which convention your label or recommendation uses, because an automatic assumption could create a materially wrong field rate. Nitrogen is normally stated as N on both sides. Treat all percentages as mass percentages: a 20 percent nitrogen product supplies 20 kilograms of nitrogen in 100 kilograms of product.
Understand how the product rate is selected
For each nutrient, the calculator divides the target kilograms per hectare by that nutrient's decimal fraction in the product. A nitrogen target of 120 kg/ha with a product containing 20 percent nitrogen therefore requires 600 kg/ha of product. The same calculation is performed independently for phosphorus and potassium. Because one blended product has only one application rate, the calculator chooses the largest of those three required rates. That is the minimum rate that meets or exceeds every positive target in a single application of the selected product. The nutrient responsible for that largest requirement is reported as the controlling nutrient. More than one nutrient can control when two or three requirements are equal within numerical precision. This approach prioritizes meeting all targets; it does not minimize nutrient surplus. If the fertilizer grade has a different N:P:K ratio from the recommendation, meeting the controlling target necessarily supplies more than the target for another nutrient. The supplied and surplus fields make that consequence visible before an application decision is made.
Use the result as a planning quantity
The primary result is fertilizer product kilograms per hectare. Multiply it by the treated area in hectares to obtain the total product mass for a field, then account separately for equipment calibration, product density, legal label restrictions, split-application strategy, and operational losses. Review every supplied nutrient and surplus rather than using only the headline rate. A large phosphorus or potassium surplus can indicate that this blend is a poor match for the recommendation, even though the calculation is mathematically correct. In that situation, consider a different grade, separate nutrient sources, or advice from a qualified agronomist. The calculator is a mass-balance tool, not a crop recommendation: it does not interpret soil tests, estimate nutrient availability, account for residual fertility, choose a product, or override local application limits. Its deterministic result is useful for comparing candidate grades because each product can be evaluated against the same targets. For purchasing, use the actual treated hectares and allow only the operational margin appropriate to your setting rather than silently increasing the nutrient target.
What you can do with it
Compare fertilizer grades
Run several product analyses against one recommendation and compare both the required product rate and the nutrient surpluses.
Prepare a per-hectare application plan
Convert N, P, and K targets into a single blended-product rate that meets every positive target.
Check whether a blend fits a recommendation
Identify the controlling nutrient and expose oversupply caused by a mismatch between the product ratio and the target ratio.
FAQ
What does the calculator cost?
It is free to use in the browser. An API request costs $0.002.
Does the result apply to one hectare only?
The result is a rate in kilograms per hectare. Multiply it by the treated hectares to obtain total kilograms of product.
Can I enter zero for a nutrient target?
Yes. Zero means that nutrient does not set a minimum product rate, although the selected product may still supply it. At least one target must be positive.
Why does the calculator show a nutrient surplus?
A single product has a fixed nutrient ratio. When that ratio differs from the target ratio, the rate needed for one nutrient can oversupply another.
Should phosphorus and potassium be elemental values or oxide equivalents?
Either convention works only when each target uses the same basis as its corresponding product percentage. Convert first if the recommendation and label use different conventions.
Does this replace an agronomic recommendation?
No. It converts an existing recommendation into a product rate; it does not interpret soil tests, set safe rates, or account for nutrient availability and regulations.
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/fertilizer-npk-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"target_nitrogen_kg_ha":120,"target_phosphorus_kg_ha":60,"target_potassium_kg_ha":90,"product_nitrogen_percent":20,"product_phosphorus_percent":10,"product_potassium_percent":15}'const res = await fetch("https://api.kit.forhosting.com/bio/fertilizer-npk-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"target_nitrogen_kg_ha": 120,
"target_phosphorus_kg_ha": 60,
"target_potassium_kg_ha": 90,
"product_nitrogen_percent": 20,
"product_phosphorus_percent": 10,
"product_potassium_percent": 15
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/fertilizer-npk-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"target_nitrogen_kg_ha": 120,
"target_phosphorus_kg_ha": 60,
"target_potassium_kg_ha": 90,
"product_nitrogen_percent": 20,
"product_phosphorus_percent": 10,
"product_potassium_percent": 15
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/fertilizer-npk-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"target_nitrogen_kg_ha":120,"target_phosphorus_kg_ha":60,"target_potassium_kg_ha":90,"product_nitrogen_percent":20,"product_phosphorus_percent":10,"product_potassium_percent":15}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"target_nitrogen_kg_ha":120,"target_phosphorus_kg_ha":60,"target_potassium_kg_ha":90,"product_nitrogen_percent":20,"product_phosphorus_percent":10,"product_potassium_percent":15}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/fertilizer-npk-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"target_nitrogen_kg_ha": 120,
"target_phosphorus_kg_ha": 60,
"target_potassium_kg_ha": 90,
"product_nitrogen_percent": 20,
"product_phosphorus_percent": 10,
"product_potassium_percent": 15
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.fertilizer_npk_rate",
"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. |