Normal text needs 4.5:1, large text 3:1. Aim for AAA (7:1) on body when feasible.
Use a contrast checker on every text/background combo before shipping.
Success Criterion 1.4.3 sets the AA contrast floor: 4.5:1 for normal text, and a looser 3:1 for large text, defined as at least 18.66px bold or 24px regular. That large-text carve-out is the part people miss: a big heading can pass at a ratio that would fail on body copy. A contrast checker gives the exact number for a given text-and-background pair, so this stops being a judgment call and becomes a measurement you either meet or fix.
1.4.3 exempts genuinely incidental content: disabled controls, purely decorative text, and text that is part of a logo or brand name. It also doesn't govern non-text elements like icons and borders, which fall under 1.4.11. Anything that conveys meaning as readable text is in scope, so “it's only a caption” almost never qualifies.
A product card's caption is a tasteful light grey on white — crisp in Figma, gone the instant it's read outdoors or by low-vision eyes. It just failed an accessibility audit.