Protein net charge calculator
This protein net charge calculator estimates the electrical charge of a peptide at a selected pH using the counts of its ionizable groups.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Enter the numbers of lysine, arginine, histidine, aspartate, glutamate, cysteine, and tyrosine residues, then include any free termini. Standard pKa values are supplied as defaults, while every pKa remains editable for a particular experimental model. The result includes positive, negative, and net charge together with a group-by-group breakdown, making the estimate easy to inspect rather than presenting a single unexplained number.
Turn a peptide composition into an estimated charge
A peptide does not carry one fixed charge under every condition. Its basic groups can accept protons and contribute positive charge, while its acidic groups can lose protons and contribute negative charge. The balance changes continuously with pH. To use this calculator, count the ionizable side chains in the peptide: lysine, arginine, and histidine on the basic side, and aspartate, glutamate, cysteine, and tyrosine on the acidic side. Then specify how many free N-termini and C-termini are present. A conventional linear peptide normally has one of each, which is why both fields default to one. Set a terminus count to zero when that end is chemically blocked, amidated, acetylated, joined in a cyclic peptide, or otherwise unavailable for ordinary ionization. The calculator applies the selected pH to every group and sums their fractional charges. It therefore gives a continuous estimate such as 1.42 rather than forcing every group to be either fully charged or uncharged. That fractional result is the useful quantity for comparing conditions near a pKa.
How Henderson–Hasselbalch fractions are applied
For each basic group, the calculation uses the protonated fraction 1 divided by 1 plus 10 raised to the power of pH minus pKa. That fraction is multiplied by the group count to obtain its positive contribution. For each acidic group, it uses the deprotonated fraction 1 divided by 1 plus 10 raised to the power of pKa minus pH, multiplies by the count, and assigns a negative sign. All positive contributions are added, all negative contributions are added, and their sum is the estimated net charge. The detailed response shows the count, pKa, ionized fraction, and charge contribution for every supported group, including groups whose count is zero. Default pKa values provide a practical general estimate, but they are not universal physical constants. Local sequence context, solvent exposure, ionic strength, temperature, nearby charges, and experimental method can shift a residue’s effective pKa. If measured or model-specific pKa values are available, enter them directly. Keeping the assumptions visible makes comparisons reproducible and helps prevent a default value from being mistaken for an experimentally determined property.
Interpret the estimate and understand its limits
The net charge indicates the direction and approximate magnitude of the molecule’s charge under the stated assumptions. A positive result means protonated basic groups outweigh deprotonated acidic groups; a negative result means the acidic contributions dominate. A value close to zero suggests approximate electrical neutrality at that pH, but this calculator is not an isoelectric-point solver and does not search across pH values. It also does not infer counts from an amino-acid sequence, model conformational coupling, include cofactors or post-translational modifications automatically, or predict electrophoretic mobility and solubility. Add only groups represented by the available fields, and adjust terminus counts and pKa values when the chemical form requires it. The calculation is most useful for quick design checks, teaching, buffer comparisons, and reproducible screening of known compositions. For folded proteins, unusual microenvironments, or decisions that depend on precise experimental behavior, treat the result as an estimate and compare it with a structure-aware pKa model or laboratory measurement. API automation costs $0.002 per request, while the same deterministic calculation can run in the browser.
What you can do with it
Compare buffer conditions
Estimate how the same peptide composition changes charge across candidate experimental pH values.
Check peptide design
Review whether substitutions or blocked termini shift a designed peptide toward a positive or negative charge.
Teach acid-base behavior
Show how fractional protonation from each residue class contributes to the total instead of using an all-or-none approximation.
FAQ
What does the result represent?
It is an estimated average net charge per peptide molecule at the supplied pH, based on independent ionization of the counted groups.
Which pKa values are used by default?
The defaults are 10.5 for lysine, 12.5 for arginine, 6.0 for histidine, 3.9 for aspartate, 4.1 for glutamate, 8.3 for cysteine, 10.1 for tyrosine, 8.0 for the N-terminus, and 3.1 for the C-terminus.
Should blocked termini be counted?
No. Set the corresponding terminus count to zero when it is capped, cyclized, or otherwise not available to ionize according to the model.
Why can the net charge be fractional?
A population of identical molecules has a fractional average because an ionizable group is only protonated or deprotonated in a fraction of molecules near its pKa.
Does this calculate the isoelectric point?
No. It evaluates one supplied pH. An isoelectric-point calculation instead searches for the pH at which the modeled net charge is zero.
How much does an API request cost?
Each API request costs $0.002. The browser calculation uses the same deterministic logic.
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/protein-net-charge \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"ph":7.4}'const res = await fetch("https://api.kit.forhosting.com/bio/protein-net-charge", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"ph": 7.4
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/bio/protein-net-charge",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"ph": 7.4
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/bio/protein-net-charge", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"ph":7.4}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"ph":7.4}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/bio/protein-net-charge", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"ph": 7.4
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "bio.protein_net_charge",
"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. |