Fish mercury calculator
Two weekly 113 g servings of salmon at 0.022 ppm give 4.972 µg of mercury, while one serving of canned albacore gives 39.55 µg: compare plates on one scale, species by species. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Species
- Salmon
- Servings per week
- 2
- Portion g
- 113
- Mercury ppm
- 0.022
- Mercury ug per serving
- 2.486
- Weekly mercury ug
- 4.972
People who eat fish regularly need a number, not a slogan: how many micrograms of mercury that weekly plate actually delivers. This fish mercury calculator estimates weekly mercury intake from three facts you already know — the commercial species, how many servings you eat per week, and the portion size in grams — using published FDA mean wet-weight concentrations in parts per million. Because one ppm is one microgram of mercury per gram of flesh, weekly mercury in micrograms is simply concentration times portion grams times servings per week. The result is a single weekly microgram total you can log next to a pregnancy diet, a school-lunch audit, or a personal seafood diary. Zero servings or a zero-gram portion is allowed and correctly yields zero micrograms.
How species, portion, and frequency become weekly micrograms
Methylmercury is the form of mercury that accumulates in fish muscle as it moves up the food web. Larger, longer-lived predators such as swordfish, shark, tilefish, and king mackerel sit at the high end of published commercial means, often near or above one part per million. Short-lived, low-trophic species such as salmon, sardine, tilapia, shrimp, and oyster sit near the bottom, typically a few hundredths of a part per million.
A part per million of mercury in wet flesh is one milligram per kilogram, which is also one microgram per gram, so a 113 gram (about four ounce) serving of a fish at 0.350 ppm — canned albacore tuna — carries 0.350 times 113, or 39.55 micrograms in that single plate. Eat three such servings in a week and the weekly total is 118.65 micrograms. The same 113 gram plate of salmon at 0.022 ppm is only 2.486 micrograms, or 4.972 micrograms across two weekly servings.
This capability stores those FDA mean wet-weight concentrations as a closed planning table and never fetches a live laboratory result. It does not distinguish farmed from wild lots, does not adjust for cooking loss, and does not apply a body-weight reference dose; it reports the weekly microgram intake implied by species, portion, and frequency so you can compare plates on one scale. Negative servings or a negative portion cannot describe an eaten meal, so those values are rejected rather than silently absolute-valued into a fake exposure.
An unknown species is rejected by name so a misspelled fish never silently becomes salmon.
Where a weekly fish-mercury estimate earns its keep
Dietitians and prenatal clinics use a weekly mercury microgram total so a patient who loves tuna can see the difference between canned light and albacore on the same 113 gram plate, instead of a binary slide that only says fish is healthy. School-meal planners convert a proposed Friday fish menu into expected micrograms per child-week when the vendor rotates pollock, salmon, and canned tuna.
Environmental-health students need a deterministic oracle that rejects an unknown species and a negative serving count instead of silently substituting swordfish or taking an absolute value that would hide a sign error on a worksheet. Households logging a pescatarian week can pin salmon twice at 113 grams against one swordfish steak and see why the high-trophic plate dominates the weekly microgram budget. Failed validation does not consume balance.
What you can do with it
Prenatal and clinic seafood diaries
Turn a week's fish plates into one weekly mercury microgram total so albacore, canned light tuna, and salmon can be compared on the same 113 gram serving.
School-meal and cafeteria planning
Convert a proposed fish menu (pollock, salmon, canned tuna) into expected micrograms per child-week before the vendor lock-in.
Environmental-health worksheets
Grade species-and-portion problems with a deterministic oracle that rejects unknown fish and negative amounts instead of inventing an exposure.
FAQ
How is weekly mercury from fish calculated?
One ppm is one microgram of mercury per gram of flesh, using FDA mean wet-weight concentrations for the chosen species.
Which fish are highest in mercury?
Large, long-lived predators such as swordfish, shark, tilefish and king mackerel sit at the top of the published averages, often near or above one part per million. Salmon, sardine, tilapia, shrimp and oyster sit near the bottom.
How much mercury is in a serving of canned albacore tuna?
At the published average of 0.350 ppm, a 113 gram serving of canned albacore carries 39.55 micrograms of mercury. Three such servings a week add up to 118.65 micrograms.
Does the calculator tell me whether my intake is safe?
No. It reports the weekly micrograms implied by species, portion and frequency, without applying a body-weight reference dose. Compare the total with the guidance from your doctor or health authority.
Does it account for farmed versus wild fish or for cooking?
No. It uses one published average per species and does not separate farmed from wild lots or adjust for weight lost in cooking. Treat the result as a planning estimate for comparing plates.
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/fish-mercury \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"species":"salmon","servings_per_week":2,"portion_g":113}'const res = await fetch("https://api.kit.forhosting.com/eco/fish-mercury", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"species": "salmon",
"servings_per_week": 2,
"portion_g": 113
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/eco/fish-mercury",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"species": "salmon",
"servings_per_week": 2,
"portion_g": 113
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/eco/fish-mercury", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"species":"salmon","servings_per_week":2,"portion_g":113}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"species":"salmon","servings_per_week":2,"portion_g":113}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/eco/fish-mercury", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"species": "salmon",
"servings_per_week": 2,
"portion_g": 113
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "eco.fish_mercury",
"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.
Limits
max_servings_per_week | 21 |
max_portion_g | 2000 |
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
Unknown species and negative amounts fail with invalid_input so a typo never invents an exposure. The same pure arithmetic powers the free browser tool and the API at $0.002 per successful call.
Input contract, response shape, and error behaviour
Values above twenty-one servings per week or two thousand grams per portion are rejected so a unit mistake cannot explode the product. POST a JSON body with three required fields. species is a canonical commercial name from the closed table: salmon, tuna_canned_light, tuna_albacore, tuna_yellowfin, tuna_bigeye, swordfish, shark, king_mackerel, tilefish, orange_roughy, marlin, grouper, sea_bass, halibut, mahi_mahi, snapper, cod, lobster, trout, crab, flounder, haddock, mackerel_atlantic, herring, pollock, catfish, sardine, tilapia, oyster, and shrimp. Common aliases such as albacore, skipjack, canned tuna, mahi, and prawn map onto those keys; anything else fails as an unknown species. servings_per_week is a finite non-negative number of plates in seven days; aliases include servings, per_week, weekly_servings, and times_per_week. portion_g is the edible portion in grams for one serving (aliases portion_size, portion, serving_size_g, grams); a typical four-ounce plate is 113 grams. Each numeric field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. Negative servings_per_week or portion_g fail with a message that the amount must be non-negative, and those failures are not billed. On success the body echoes the canonical species, the table mercury_ppm, the rounded servings_per_week and portion_g, mercury_ug_per_serving as concentration times grams, weekly_mercury_ug as that serving dose times frequency, a formula string, and a short English message. Pricing is a flat $0.002 per successful request with unit item.
Where a weekly fish-mercury estimate earns its keep
Keep species inside the published table, keep amounts non-negative and inside the published ceilings, pin weekly_mercury_ug in tests, and you get reproducible intake figures for clinics, classrooms, and edge workers without standing up a toxicology stack of your own.
Technical questions
What happens if the species is unknown?
The task fails with invalid_input naming the unknown species. Only the closed commercial table is accepted (salmon, tuna_albacore, swordfish, shrimp, and the other listed keys, plus documented aliases).
What if servings per week or portion size is negative?
The task fails with invalid_input. A negative serving count or portion cannot describe an eaten meal, so the estimator refuses to invent a negative exposure and the call is not billed.
Is zero servings or a zero-gram portion allowed?
Yes. Zero is a valid skip-fish week or empty plate and returns weekly_mercury_ug of 0. A typical four-ounce serving is 113 grams.
What does the fish mercury calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.