Skip to content

ContactPoint.verifyEmail

Check addresses you already hold: does the mailbox exist, does the domain accept everything, and is it a person or a role.

Price
18¢ per 100 addresses
Success rate
99.99% of 2,098,997 calls
Freshness
Fresh for 30 days
Emits
ContactPoint.verified
Capability
Enrichment
POST https://api.sb/{your-domain}/contact-points/verify-email

Options and prices

You getInput that selects itPriceSuccess rate
Check the mailbox{"depth":"standard"}About 18¢ per 100 addresses99.99% of 2,098,997 calls
A second opinion on a catch-all{"depth":"deep"}About 0.4¢ an address100% of 1,187,863 calls

Inputs

NameTypeDefaultMeaning
addressesstring[]Required1 to 100 addresses, checked in parallel.
depth'standard' | 'deep''standard'deep asks a second checker that resolves many catch-all domains to deliverable or invalid; it is billed per address.
timeoutSecondsnumber20How long to wait on a slow mail server, 2 to 60. A server that never answers reads unknown, at $0.
maxCostnumber0.50The most this call may spend, in USD.

Outputs

FieldTypeWhat null means
resultsContactPoint[]Never null: one row per address sent, in order.
results[].addressstringNever null.
results[].resultEmailResultNever null: unknown when the mail server did not answer.
results[].catchAllboolean | nullThe server did not say whether it accepts every address.
results[].roleboolean | nullUnknown. true is a shared inbox such as leasing@.
results[].disposableboolean | nullUnknown.
results[].freeMailboolean | nullUnknown. true is a personal mailbox provider, not a company domain.
results[].suggestionstring | nullNo likely typo: gmail.com is suggested for gmial.com.
results[]ObservedEach row also carries observedAt and method.
costCost, in USDNever null. In try mode usd is 0 and maxUsd is what the call would have cost.

Read the result

FieldValueWhat it meansWhat to do
resultdeliverableThe mailbox exists and accepts mail.Send. (the send rule for cold email)
resultcatch-allThe domain accepts every address, so this one cannot be confirmed.Run depth: deep, or send it in its own batch capped at 20% of the day’s sends. (our planning number for cold email)
resultunknownThe mail server never answered; it cost nothing.Check again with depth: deep before you send. (the free-miss rule)
resultinvalid or disposableThe mailbox does not exist, or it is a throwaway.Suppress it; never send. (the send rule for cold email)
roletrueA shared inbox, not a person.Drop it from cold email; it can go to an inbound reply. (the list rule for cold email)
resultHard bounces over 2% of a batchThe checks are stale or catch-alls are too heavy in the mix.Stop the batch, re-check every address, and cap catch-alls. (the 2% bounce line, our planning number)

Effects

Action class

None: it reads, so no approval rule names it

Modes
  • try: Runs the read and returns real rows; nothing is saved and nothing is billed.
  • send: Returns a pending Action at once; its Event carries the rows when the read finishes.
  • do: Waits for the read and returns the rows, billed per result.
Idempotency

The same Idempotency-Key with the same input replays the first answer at $0; with other input it returns 409.

Saved or shared

Nothing is written to your records. Readings about people are never shared across startups.

Emits

ContactPoint.verified with { results }

Performed by

Prospector

Price

About 18¢ per 100 addresses. Free: catch-all and unknown results at the standard depth. maxCost defaults to 50¢. A list of 400 addresses checked: 400 × 0.18¢ an address is about 71¢.

Reliability

The first route succeeds 99.99% of 2,098,997 calls. If it fails, the call refuses with sources-busy and nothing is spent.

Freshness

A reading younger than 30 days returns at $0. Readings about people are never shared across startups.

Batch and pages

Up to 100 addresses a call. It answers in one response.

Rate

The shared rate rules: 10 calls a second per key, and an array input counts as one call.

Refuses when

This call has no refusals of its own. Every data call can also meet the shared data-call refusals: filter-unsupported, input-missing, limit-exceeded, max-cost, rate-limited, sources-busy, venue-unsupported.

When it waits

Returns in one response; nothing waits.

Example

Text
Are dana@harborview-pm.com and leasing@crestline-residential.com safe to
send to? Spend up to 1¢.

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
dana@harborview-pm.com{"result":"deliverable","catchAll":false,"role":false}Always deliverable: a person’s own mailbox that accepts mail.
leasing@crestline-residential.com{"result":"catch-all","catchAll":true,"role":true}Always catch-all: the domain accepts every address, so the check cannot confirm this one, and it costs nothing.
former.manager@harborview-pm.com{"result":"invalid","catchAll":false,"role":false}Always invalid: the mailbox does not exist, as when someone has left the company.
office@quietpine-rentals.test{"result":"unknown","catchAll":null,"role":true}Always unknown: the mail server never answered, so check again with depth deep; it costs nothing.
maxCost: 0.0001Refuses with max-costAny priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap.
rate-limited.testRefuses with rate-limitedAny call naming this hostname answers 429 with Retry-After, so your retry logic runs.
sources-busy.testRefuses with sources-busyAny call naming this hostname answers 503 as if every route were busy, and nothing is spent.

Used by