Reference

Status & error codes

Every verdict BounceShift can return, what it means, and whether it's safe to send — plus HTTP codes and the exceptions each SDK raises.

Validation statuses

Every result carries a status and a 0–100 confidence score. An address is safe to send when its status is valid or catch_all. We report an honest unknown rather than a false valid when a probe is inconclusive — see how we measure accuracy.

StatusMeaningSafe to send?
valid The mailbox exists and is safe to send to. Yes
invalid Confirmed undeliverable — bad syntax, no MX records, or no mailbox. Remove it. No
risky Deliverable but elevated risk — for example a catch-all with no positive signals. No
catch_all An accept-all domain: the individual mailbox cannot be confirmed. Confidence reflects deliverability likelihood — send with caution. Yes
unknown The probe was inconclusive (greylisting, throttling, a blocked port). Retry later — this is not the same as invalid. No
disposable A throwaway address from a temporary-mail service. No
spamtrap A spam trap used to catch poor list hygiene. Never send. No
abuse A known complainer / abuse address. Never send. No
do_not_mail A forwarding service or an address you should not mail. No

Recommendation & quality score

Because status is a strict machine value (and risky covers both "unverifiable junk" and "seen delivering reliably, just not SMTP-verified"), every response also includes a plain-English recommendation, a 0–100 quality_score, and an explanation sentence. Use recommendation to decide what to do:

RecommendationWhat it means
deliverable This mailbox is real and can receive mail — safe to send.
send_with_caution Positive signals but not fully verified — reasonable to send, watch for bounces.
risky Little or negative evidence — sending is likely to bounce or hurt your reputation.
undeliverable Confirmed not safe to send — do not mail.
unknown We could not determine deliverability — you are not charged for this.

An address seen delivering reliably in our network with no bounces returns status: risky but recommendation: send_with_caution with a high quality_score — it is a real, active mailbox, not a warning to avoid it.

Sub-statuses

Alongside the headline status, each result includes a granular sub_status explaining why. Common values include:

Typo suggestions: did_you_mean

Every response carries a did_you_mean field. It is a corrected address when the domain is within one or two character edits of a major provider, and null otherwise:

{
  "email": "[email protected]",
  "status": "disposable",
  "did_you_mean": "[email protected]"
}

Two things worth knowing about it.

First, it is advisory and never changes the verdict. We validate the address you sent, not the one we suggest — the mailbox at the misspelled domain may genuinely exist. Do not substitute the suggestion silently; show it to the person who typed it and let them confirm. At a signup form, that is a "did you mean [email protected]?" prompt before submit.

Second, it is populated whatever the status, including on addresses we return as valid or disposable. That matters because the misspellings that hurt most are the ones that resolve: gmil.com and hotmial.com are registered and accept mail, so they never bounce and never appear in a bounce report. The suggestion is the only signal you will get about them.

Batch results carry the same value in a did_you_mean column in the results CSV, and the batch view in the dashboard summarises how many addresses had one.

HTTP response codes

CodeMeaning
200Success — the address was validated.
400Bad request — invalid parameters, or no organization selected.
401Unauthorized — invalid or missing API token.
402Payment required — insufficient credits.
403Forbidden — the token lacks the required permission, or the organization is invalid.
404Not found — the resource does not exist.
422Unprocessable entity — request validation failed.
429Too many requests — rate limit exceeded (60 requests/minute).

SDK exceptions

The official SDKs map error responses to typed exceptions so you can catch each case:

HTTPPHP / LaravelNode
401AuthenticationExceptionAuthenticationError
402InsufficientCreditsExceptionInsufficientCreditsError
403ForbiddenExceptionForbiddenError
429RateLimitExceptionRateLimitError
otherApiException / BounceShiftExceptionApiError / BounceShiftError

Rate-limit errors expose the retryAfter value; both SDKs also retry 429 and 5xx automatically with a clamped backoff.

See also

Learn

Why we abstain instead of guessing

Ready to try BounceShift?

Get 100 free validations to test our service. No credit card required.

Start free trial