CHEM-211 · Lesson 8 of 12 · 28 min

Acid-base titrations: curves, indicators and endpoints

Acid–base titration is one of the oldest and still most widely used quantitative methods. Water utilities titrate alkalinity every day; food laboratories titrate the acidity of vinegar, wine and milk; the Kjeldahl titration of ammonia is still the reference method for protein in food and feed; and pharmacopoeias specify titrations for the assay of many drugs. This lesson develops the exact theory of titration curves, explains how indicators work and how to choose them, shows how to locate endpoints from pH data, and works through the key applications.

Vocabulary

In a titration, a solution of accurately known concentration, the titrant, is added from a burette to the analyte until the reaction is complete. The equivalence point is the point at which the amount of titrant added is exactly stoichiometric with the analyte. It is a theoretical point. The endpoint is what we actually observe: a sudden change in indicator color, pH or another property. The difference between the endpoint and the equivalence point is the titration error, which a good choice of indicator or endpoint method keeps small. A blank titration, in which the same procedure is carried out without analyte, measures the titrant needed to change the indicator itself and any acidic or basic impurities in the reagents; it is subtracted from the sample titration.

Requirements for a titration reaction: it must have a known stoichiometry, go essentially to completion (a large equilibrium constant), be fast, and have a way of detecting the equivalence point. The reaction of a strong acid with a strong base (K = 1/Kw = 10¹⁴) satisfies all of these superbly; the titration of a weak acid with a strong base is less complete but still excellent if Ka is not too small.

Standardizing the titrants

Sodium hydroxide titrant is standardized against potassium hydrogen phthalate (KHP), dried at 110 °C, using phenolphthalein. NaOH solutions absorb CO₂ from the air, forming carbonate: 2OH⁻ + CO₂ → CO₃²⁻ + H₂O. Carbonate is a weaker base, and depending on the endpoint pH it reacts with one or two protons, which causes a carbonate error. To minimize it, NaOH is prepared from a 50 % (w/w) stock, in which sodium carbonate is insoluble and settles out, diluted with freshly boiled water, and stored in a polyethylene bottle with a guard tube containing a CO₂ absorbent. Glass is avoided because concentrated base slowly attacks it.

Hydrochloric acid is stable and is standardized against dried sodium carbonate or TRIS. With sodium carbonate the solution is boiled near the endpoint to drive off CO₂, which otherwise forms a carbonic acid buffer that blurs the endpoint.

Worked problem

Standardizing HCl with sodium carbonate

A 0.2365 g sample of dried Na₂CO₃ (105.99 g/mol) requires 44.12 mL of HCl to reach the second (methyl red) endpoint, and a blank requires 0.03 mL. Find the HCl concentration.

Show solution
  1. Reaction: CO₃²⁻ + 2H⁺ → H₂CO₃ (→ CO₂ + H₂O).
  2. mol Na₂CO₃ = 0.2365/105.99 = 2.2313 × 10⁻³ mol; mol HCl = 4.4627 × 10⁻³ mol.
  3. Volume corrected for the blank: 44.12 − 0.03 = 44.09 mL.
  4. c(HCl) = 4.4627 × 10⁻³/0.04409 = 0.10122 M.

Answer: 0.1012 M HCl.

An exact equation for titration curves

Rather than calculating each region of a titration curve with a different approximation, we can derive one equation that holds everywhere. Consider titrating a volume Va of a weak acid HA of concentration Ca with strong base NaOH of concentration Cb. After adding Vb of base, the charge balance is [H⁺] + [Na⁺] = [OH⁻] + [A⁻]. Substituting [Na⁺] = CbVb/(Va + Vb) and [A⁻] = α_A⁻ × CaVa/(Va + Vb) and rearranging gives the fraction of the way to the equivalence point, φ = CbVb/(CaVa):

\[\phi = \frac{C_bV_b}{C_aV_a} = \frac{\alpha_{\mathrm{A^-}} - \dfrac{[\mathrm{H^+}] - [\mathrm{OH^-}]}{C_a}}{1 + \dfrac{[\mathrm{H^+}] - [\mathrm{OH^-}]}{C_b}}\]

This is the inverse of what we usually want, but that is a feature: choose a pH, compute [H⁺], [OH⁻] and α_A⁻, and the equation gives φ, and therefore the volume, with no approximations at all. Plotting pH against Vb traces the whole curve, including the regions near the start and near the equivalence point where the textbook approximations fail. For a strong acid, set α_A⁻ = 1. For a polyprotic acid, replace α_A⁻ by the average number of protons removed per molecule, α_HA⁻ + 2α_A²⁻ + …, and φ runs to 2 or 3. For a base titrated with acid, the equation has the same structure with signs reversed. Robert de Levie popularized this approach in analytical chemistry teaching.

Two titration curves of pH against volume of 0.100 M NaOH added to 25.00 mL of 0.100 M acid. The HCl curve starts at pH 1, rises slowly, then jumps nearly vertically from about pH 3 to 11 at 25 mL. The acetic acid curve starts near pH 2.9, rises through a flat buffer region passing pH 4.76 at 12.5 mL, then jumps from about pH 7 to 11 at 25 mL with the equivalence point at pH 8.73. Shaded horizontal bands show the transition ranges of methyl orange (3.1 to 4.4), methyl red (4.4 to 6.2) and phenolphthalein (8.2 to 10.0).
Titration curves of a strong and a weak acid with indicator transition ranges

The curves show the features you know from CHEM-102, now with exact values. For the strong acid, the pH changes by more than 7 units within ±0.1 mL of the equivalence point, so any indicator changing between pH 4 and 10 gives a negligible titration error. For acetic acid, the buffer region holds the pH near pKa, the half-equivalence point gives pH = pKa = 4.76 exactly, and the equivalence point lies at pH 8.73, where only acetate remains. The steep rise is shorter, so the indicator must change in the basic range: phenolphthalein is right and methyl red would give a large error.

Exact titration curves from the fraction-titrated equation
import math
KW = 1.0e-14

def alpha_bar(Ka, h):
    """Average number of protons removed per molecule of a polyprotic acid."""
    terms, p = [1.0], 1.0
    for K in Ka:
        p *= K / h
        terms.append(p)
    tot = sum(terms)
    return sum(j * t for j, t in enumerate(terms)) / tot

def volume_for_pH(pH, Ka, Ca, Va, Cb):
    h = 10 ** -pH; d = h - KW / h
    phi = (alpha_bar(Ka, h) - d / Ca) / (1 + d / Cb)
    return phi * Ca * Va / Cb

def pH_at_volume(Vb, Ka, Ca, Va, Cb):
    lo, hi = 0.0, 14.0
    for _ in range(80):
        mid = (lo + hi) / 2
        if volume_for_pH(mid, Ka, Ca, Va, Cb) < Vb: lo = mid
        else: hi = mid
    return mid

acetic = [10 ** -4.76]
strong = [1e3]                     # Ka so large the acid is fully dissociated
for Vb in (0.0, 5.0, 12.5, 20.0, 24.0, 24.9, 25.0, 25.1, 26.0, 30.0):
    a = pH_at_volume(Vb, acetic, 0.100, 25.0, 0.100)
    s = pH_at_volume(Vb, strong, 0.100, 25.0, 0.100)
    print(f"{Vb:5.1f} mL NaOH   HCl pH {s:5.2f}   acetic acid pH {a:5.2f}")
print(f"methyl red endpoint (pH 5.0) for acetic acid at {volume_for_pH(5.0, acetic, 0.1, 25.0, 0.1):.2f} mL")
print(f"phenolphthalein endpoint (pH 9.0) at {volume_for_pH(9.0, acetic, 0.1, 25.0, 0.1):.3f} mL")
Output
  0.0 mL NaOH   HCl pH  1.00   acetic acid pH  2.88
  5.0 mL NaOH   HCl pH  1.18   acetic acid pH  4.16
 12.5 mL NaOH   HCl pH  1.48   acetic acid pH  4.76
 20.0 mL NaOH   HCl pH  1.95   acetic acid pH  5.36
 24.0 mL NaOH   HCl pH  2.69   acetic acid pH  6.14
 24.9 mL NaOH   HCl pH  3.70   acetic acid pH  7.16
 25.0 mL NaOH   HCl pH  7.00   acetic acid pH  8.73
 25.1 mL NaOH   HCl pH 10.30   acetic acid pH 10.30
 26.0 mL NaOH   HCl pH 11.29   acetic acid pH 11.29
 30.0 mL NaOH   HCl pH 11.96   acetic acid pH 11.96
methyl red endpoint (pH 5.0) for acetic acid at 15.86 mL
phenolphthalein endpoint (pH 9.0) at 25.004 mL

The last two lines quantify the titration error. Stopping at pH 5.0 with methyl red would end the acetic acid titration at about 15.9 mL, an error of more than a third. Stopping at pH 9.0 with phenolphthalein ends it within a few hundredths of a milliliter of 25.00 mL.

How small can Ka be?

As Ka decreases, the buffer region rises and the jump at the equivalence point shrinks. A useful rule is that a weak acid can be titrated accurately with a color indicator if C_aKa is at least about 10⁻⁸; for 0.1 M analyte that means Ka ≥ 10⁻⁷. Boric acid (Ka = 5.8 × 10⁻¹⁰) is too weak to titrate directly, but adding mannitol or glycerol forms a complex that is a much stronger acid, a classic trick. Similarly, a very weak base such as pyridine cannot be titrated in water but can be in a nonaqueous solvent such as glacial acetic acid, which is how many pharmaceutical amines are assayed.

Polyprotic acids and mixtures

A polyprotic acid gives a separate equivalence point for each proton if successive Ka values differ by a factor of about 10⁴ or more. Phosphoric acid gives two clear breaks, at pH ≈ 4.7 and 9.8 (the amphiprotic pH values from lesson 7). The third proton (pK₃ = 12.35) is too weak to give a usable break in water.

Titration curve of pH against volume of 0.100 M NaOH added to 25.00 mL of 0.100 M phosphoric acid, from 0 to 80 mL. The pH starts near 1.6, passes pKa1 (2.15) at 12.5 mL, rises steeply at the first equivalence point at 25 mL (pH about 4.7), passes pKa2 (7.20) at 37.5 mL, rises steeply at the second equivalence point at 50 mL (pH about 9.8), then levels off near pH 12 with no clear third break.
Two clear equivalence points for phosphoric acid

The same idea analyzes mixtures. A solution containing NaOH and Na₂CO₃ (or Na₂CO₃ and NaHCO₃) titrated with HCl shows a phenolphthalein endpoint near pH 8.3, when hydroxide is neutralized and carbonate converted to bicarbonate, and a methyl orange or bromocresol green endpoint near pH 4.5, when bicarbonate is converted to carbonic acid. The volumes to the two endpoints reveal the composition. This is the basis of the alkalinity determination in water.

Indicators

An acid–base indicator is itself a weak acid or base whose acid and base forms have different colors. For an indicator HIn,

\[\mathrm{pH} = \mathrm{p}K_{\text{In}} + \log\frac{[\mathrm{In^-}]}{[\mathrm{HIn}]}\]

The eye sees mainly the acid color when [HIn]/[In⁻] is above about 10 and mainly the base color when it is below about 0.1, so the visible transition spans roughly pK_In ± 1. The indicator must be used in small amounts, because it consumes titrant too; that is what the blank titration corrects for.

Common acid–base indicators
IndicatorTransition pH rangeColor change (acid to base)Typical use
Thymol blue (first)1.2–2.8red to yellowStrong acids with strong bases at low pH
Methyl orange3.1–4.4red to orangeStrong acid titrations, total alkalinity
Bromocresol green3.8–5.4yellow to blueTotal alkalinity, weak bases
Methyl red4.4–6.2red to yellowWeak bases (ammonia), HCl with Na₂CO₃
Bromothymol blue6.0–7.6yellow to blueStrong acid–strong base
Phenolphthalein8.0–9.6colorless to pinkWeak acids with NaOH, KHP standardization
Thymolphthalein9.3–10.5colorless to blueWeaker acids

Choose an indicator whose transition range falls on the steep part of the curve, as close as possible to the equivalence-point pH. Mixed indicators (for example bromocresol green with methyl red) give sharper color changes for demanding endpoints such as total alkalinity near pH 4.5.

Locating endpoints from pH data

A pH electrode can follow any titration, including colored or turbid samples where an indicator cannot be seen, and it records the whole curve. The endpoint is the point of maximum slope, which can be found by computing the first derivative ΔpH/ΔV between successive points (its maximum marks the endpoint) or the second derivative (which crosses zero there). Autotitrators do this automatically.

A Gran plot uses the data before the endpoint, where the pH changes smoothly, and so avoids the noisy region around the jump. For a weak acid titrated with NaOH, rearranging the Ka expression shows that

\[V_b\,10^{-\mathrm{pH}} = K_a\,(V_e - V_b)\]

approximately, where V_e is the equivalence volume. A plot of V_b·10^(−pH) against V_b is a straight line that reaches zero at V_b = V_e, and its slope gives −Ka (strictly −Ka γ_HA/γ_A⁻). Gran plots, introduced by Gunnar Gran in 1952, are especially valuable when the endpoint jump is small.

Finding the endpoint by first derivative and by Gran plot
import math, random
# simulated pH titration of 25.00 mL of 0.1000 M acetic acid with 0.1000 M NaOH,
# with +/- 0.005 pH meter noise, then endpoints by derivative and by Gran plot
KW, Ka = 1.0e-14, 10 ** -4.76
def vol(pH, Ca=0.1, Va=25.0, Cb=0.1):
    h = 10 ** -pH; d = h - KW / h
    return (Ka / (Ka + h) - d / Ca) / (1 + d / Cb) * Ca * Va / Cb
def pH_at(V):
    lo, hi = 0.0, 14.0
    for _ in range(80):
        mid = (lo + hi) / 2
        lo, hi = (mid, hi) if vol(mid) < V else (lo, mid)
    return mid
rnd = random.Random(8)
V = [i * 0.5 for i in range(0, 46)] + [23.2 + 0.2 * i for i in range(0, 20)]
V = sorted(set(round(v, 2) for v in V))
pH = [pH_at(v) + rnd.gauss(0, 0.005) for v in V]
# first derivative between successive points
d1 = [((pH[i + 1] - pH[i]) / (V[i + 1] - V[i]), (V[i] + V[i + 1]) / 2) for i in range(len(V) - 1)]
best = max(d1)
print(f"first-derivative maximum at {best[1]:.2f} mL (slope {best[0]:.1f} pH/mL)")
# Gran plot from points between 10 and 22 mL
pts = [(v, v * 10 ** -p) for v, p in zip(V, pH) if 10 <= v <= 22]
n = len(pts); mx = sum(p[0] for p in pts) / n; my = sum(p[1] for p in pts) / n
m = sum((x - mx) * (y - my) for x, y in pts) / sum((x - mx) ** 2 for x, y in pts)
b = my - m * mx
print(f"Gran plot: Ve = {-b / m:.2f} mL, apparent Ka = {-m:.2e} (true {Ka:.2e})")
Output
first-derivative maximum at 24.90 mL (slope 9.4 pH/mL)
Gran plot: Ve = 25.05 mL, apparent Ka = 1.72e-05 (true 1.74e-05)

The derivative method can locate the endpoint only to within the spacing of the data points, here 0.2 mL near the jump, and it is sensitive to noise in the steepest region. The Gran plot uses twenty readings taken well before the endpoint, where the pH is stable, and extrapolates to 25.05 mL; as a bonus its slope recovers Ka.

Application: alkalinity of water

Alkalinity is the capacity of a water to neutralize acid. In most natural waters it comes from bicarbonate, with carbonate and hydroxide at higher pH. It controls how strongly a water resists acidification, how corrosive it is to pipes, and how well coagulants work in water treatment. Alkalinity is determined by titrating with standard acid (often 0.02 N H₂SO₄ or 0.02 M HCl) to pH 8.3 (phenolphthalein alkalinity, P) and then to about pH 4.5 (total alkalinity, T), and is reported as mg/L of CaCO₃.

Worked problem

Total alkalinity

A 100.0 mL sample of well water from southern Minnesota has a pH of 7.9, so it shows no phenolphthalein endpoint. Titrated to pH 4.5 with 0.02000 M HCl, it requires 26.35 mL. Find the total alkalinity.

Show solution
  1. mol H⁺ = 0.02635 L × 0.02000 M = 5.270 × 10⁻⁴ mol.
  2. Each mole of CaCO₃ would neutralize 2 mol H⁺, so equivalent CaCO₃ = 2.635 × 10⁻⁴ mol = 26.37 mg.
  3. In 100.0 mL: 263.7 mg/L as CaCO₃.

Answer: 264 mg/L as CaCO₃, all bicarbonate since P = 0; a moderately high value typical of groundwater from carbonate rocks and glacial deposits.

Application: Kjeldahl nitrogen

Johan Kjeldahl, working at the Carlsberg Laboratory in Copenhagen, published his method for organic nitrogen in 1883, and it remains a reference method for protein. The sample is digested in hot concentrated sulfuric acid with a catalyst, converting organic nitrogen to ammonium sulfate. The digest is made strongly basic, the ammonia is distilled into a boric acid solution (or a measured excess of standard acid), and the ammonia is titrated with standard HCl to a methyl red or mixed-indicator endpoint. The protein content is found by multiplying the nitrogen mass fraction by a factor, 6.25 for most foods (because typical proteins contain about 16 % nitrogen), 6.38 for dairy products and 5.70 for wheat. Because the method measures nitrogen, not protein, it can be fooled by nitrogen-rich adulterants, as the melamine contamination of milk products in 2008 tragically demonstrated.

Worked problem

Protein by Kjeldahl

A 0.9814 g sample of feed is digested and distilled into boric acid; the ammonia requires 21.47 mL of 0.1012 M HCl, and a reagent blank requires 0.22 mL. Find the mass fraction of protein (factor 6.25).

Show solution
  1. Net volume = 21.25 mL; mol N = 0.02125 × 0.1012 = 2.1505 × 10⁻³ mol.
  2. Mass N = 2.1505 × 10⁻³ × 14.007 = 0.030122 g; mass fraction N = 0.030122/0.9814 = 3.069 %.
  3. Protein = 6.25 × 3.069 % = 19.2 %.

Answer: 19.2 % protein.

Common mistakes

  • MistakeThe endpoint and the equivalence point are the same thing.

    InsteadThe equivalence point is stoichiometric; the endpoint is observed. Their difference is the titration error.

  • MistakeUse methyl red for acetic acid with NaOH.

    InsteadThe equivalence point is near pH 8.7; methyl red changes near pH 5 and would end the titration far too early.

  • MistakeStore NaOH titrant in an open glass bottle.

    InsteadIt absorbs CO₂ and attacks glass; use a capped polyethylene bottle with a CO₂ guard.

  • MistakeEvery proton of a polyprotic acid gives a break.

    InsteadOnly if successive Ka values differ by about 10⁴ and the proton is not too weak.

  • MistakeForget the blank titration.

    InsteadSubtract the titrant used by the indicator and reagents.

  • MistakeReport alkalinity in mol/L of HCO₃⁻.

    InsteadBy convention alkalinity is reported as mg/L of CaCO₃, with 2 mol H⁺ per mol CaCO₃.

Summary and key terms

  • Titrants are standardized against primary standards: NaOH with KHP, HCl with Na₂CO₃ or TRIS.
  • The fraction-titrated equation gives exact titration curves for strong, weak and polyprotic acids.
  • Weak acids can be titrated with indicators if CaKa ≥ about 10⁻⁸; polyprotic acids give separate breaks if successive Ka values differ by about 10⁴.
  • Indicators change over about pK_In ± 1; choose one whose range lies on the steep part of the curve.
  • Endpoints from pH data are found by derivatives or Gran plots.
  • Alkalinity (as mg/L CaCO₃) and Kjeldahl nitrogen are major applications.
Equivalence point
The point at which titrant and analyte have been mixed in exactly stoichiometric amounts.
Endpoint
The observed point, by indicator or instrument, at which a titration is stopped.
Titration error
The difference between the endpoint and the equivalence point.
Carbonate error
Error caused by carbonate absorbed by a basic titrant.
Gran plot
A linearized plot of pre-endpoint titration data that extrapolates to the equivalence volume.
Alkalinity
The acid-neutralizing capacity of water, reported as mg/L CaCO₃.
Kjeldahl method
Determination of organic nitrogen by digestion, distillation of ammonia and titration.

Practice problems

Work each problem on paper first, then reveal the answer to check.

  1. 0.4512 g KHP requires 22.36 mL of NaOH. Find c(NaOH).

    Show answer

    0.4512/204.22 = 2.2094 × 10⁻³ mol; ÷ 0.02236 L = 0.09881 M.

  2. Find the pH at the equivalence point when 50.00 mL of 0.0500 M formic acid (pKa 3.75) is titrated with 0.1000 M NaOH.

    Show answer

    Formate 0.0500 × 50/75 = 0.0333 M; Kb = 5.6 × 10⁻¹¹; [OH⁻] = √(1.87 × 10⁻¹²) = 1.37 × 10⁻⁶; pH 8.14.

  3. Which indicator suits the titration of ammonia with HCl (equivalence pH about 5.3)?

    Show answer

    Methyl red (4.4–6.2).

  4. A 100.0 mL water sample needs 3.10 mL of 0.0200 M HCl to pH 8.3 and 18.40 mL in total to pH 4.5. Find P and T alkalinity as mg/L CaCO₃.

    Show answer

    P: 3.10 × 0.0200/2 × 100.09/0.100 = 31.0 mg/L; T: 18.40 × 0.0200/2 × 100.09/0.100 = 184 mg/L.

  5. Can 0.1 M phenol (Ka = 1.0 × 10⁻¹⁰) be titrated directly with NaOH using an indicator?

    Show answer

    CaKa = 10⁻¹¹, far below 10⁻⁸; no.

  6. Why is the solution boiled near the endpoint when HCl is standardized against Na₂CO₃?

    Show answer

    To expel CO₂, which otherwise forms a carbonic acid buffer and blurs the endpoint.

Lesson quiz · 5 questions

Score 60% or more to complete this lesson.

Take the quiz