Skip to content

Prospect.verify

A Workflow over three calls: find a saved Prospect’s work email, check the mailbox, and write the result onto the Prospect; a miss is free.

Price
0.6¢ a verified address
Success rate
94.9% across its steps
Freshness
Fresh for 90 days
Emits
Prospect.verified
Capability
Enrichment
POST https://api.sb/{your-domain}/prospects/verify

How it runs

One call for a saved Prospect that runs these Data Verbs in order and writes what they find onto the Prospect. Call the steps yourself to hold the addresses without writing them.

StepVerbWhen it runsPriceSuccess rate
1ContactPoint.findEmailAlways: routes walked cheapest first, up to maxCost; a miss is free and ends the run.About 0.45¢ an address found95% of 3,296,127 calls
2ContactPoint.verifyEmailOn a found address. A catch-all result runs again at depth: deep when maxCost leaves room.About 0.18¢ an address99.99% of 2,098,997 calls
3ContactPoint.findPhoneOnly when reach holds phone.About 1.7¢ a number found92.9% of 1,002,342 calls

Inputs

NameTypeDefaultMeaning
prospectProspectRequiredA saved Prospect id. Also served at /prospects/{prospect}/verify.
reach('work-email' | 'phone')[]['work-email']What to find and check. A phone is its own job with its own price.
maxAgestring'90d'A check younger than this is kept, at $0, instead of checking again.
maxCostnumber0.02The most this Prospect may cost, in USD. The find walks its routes cheapest first and stops here.

Outputs

FieldTypeWhat null means
prospectProspectNever null: the Prospect the result was written onto.
emails{ address: string; result: EmailResult; checkedAt: string }[]Never null: empty when no address was found, at $0.
emails[].resultEmailResultNever null on a found address.
phones{ number: string; lineType: 'mobile' | 'landline' | 'voip' | null; checkedAt: string | null }[], in E.164Never null: empty unless reach holds phone and a number was found.
reachablebooleanNever null: true when at least one address is deliverable.
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
reachablefalseNo deliverable address: a miss, an invalid mailbox, or a catch-all domain.Leave them out of the batch; you paid nothing for a miss or a catch-all. (the free-miss rule)
emails[].resultcatch-allThe domain accepts every address, so the mailbox cannot be confirmed.Send catch-alls in their own batch, at most 20% of a day’s sends. (our planning number for cold email)
emails[].resultdeliverable across a batchSafe to send, one by one.Stop any batch whose hard bounces pass 2%, and re-check before you resume. (the 2% bounce line, our planning number)
cost.usdAbout 30¢ for 50One live run found and checked 50 heads of operations at US property managers for 29¢.Budget about 0.6¢ a reachable person, and leave the 2¢ cap on. (a measured run of 136 calls)

Effects

Action class

None: it reads, so no approval rule names it

Modes
  • try: Finds and checks and returns the result; nothing is written onto the Prospect 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

Writes the addresses, their results and the outreach state onto the Prospect. Readings about people are never shared across startups.

Emits

Prospect.verified with { prospect, emails, phones, reachable }

Performed by

Prospector

Price

About 0.6¢ a verified address. At most 2¢ a verified address. Free: a miss: no address found, a check that ends catch-all or unknown. maxCost defaults to 2¢. 50 verified leads (one live run spent 29¢): 50 × 0.6¢ a verified address is about 30¢.

Reliability

94.9%: the product of its steps’ rates, each on its own page. A step that fails falls back as that step does.

Freshness

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

Batch and pages

Up to 1 Prospect 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
Find and check Dana Whitfield’s work email before I write to her; spend
up to 2¢.

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
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