SMTP response codes: definition
Every SMTP command gets a three-digit reply. The first digit carries the meaning: 2xx success (250 = requested action OK), 3xx intermediate (354 = start sending the message), 4xx transient failure (try again later), 5xx permanent failure (don't retry as-is).
Codes you'll see most: 250 accepted; 421 service not available, closing connection; 450 mailbox unavailable (temporarily, often busy or greylisting); 451 local error, try later; 452 insufficient system storage; 550 mailbox unavailable, for example not found or rejected for policy; 552 exceeded storage allocation; 553 mailbox name not allowed; 554 transaction failed.
Most servers also send an enhanced status code (RFC 3463) in the form class.subject.detail, which is more precise: 5.1.1 bad destination mailbox (the address doesn't exist), 5.1.2 bad destination system, 4.2.2 or 5.2.2 mailbox full, 5.7.1 delivery not authorised or message refused. A 550 with 5.7.x is a policy or reputation block, not proof that the mailbox is missing.
Why it matters
Reading the code tells you what to do next. 5.1.1 means remove the address now: it's a hard bounce. A 4xx means wait and let your server retry: it's a soft bounce if it never succeeds. A 5.7.x block means look at your authentication, sender reputation or blocklist status, because your list isn't the problem.
How Skrap.ai helps
Skrap.ai reads these replies during its mailbox check and turns them into one of four statuses. A definitive rejection becomes Invalid; temporary or unclear answers become Unknown. Both are free, so you never pay for an address the server wouldn't confirm. Check a bounce-prone list with the free email verifier or the API.