Email Finder APIVerified with the mail server, no email sent
Email Finder API: find work emails
by name and company domain
Give us a first name, last name and company domain. We test the most common email formats with that company's mail server and return the one it accepts. Nothing is sent to the person, and you only get an address when the server confirmed it.
How it works
How the Email Finder API finds an address
One request does three things. Each step is checked with the company's real mail server, which is why you get a confirmed address instead of a best guess.
Build the likely formats
From the name you send, we build the email formats companies use most, such as jane@, jane.doe@ and jdoe@. A full name gives more formats to test than a first name alone.
Ask the company's mail server
We look up the domain's mail server and check each format with it, one at a time, in a fixed order. No message is ever sent. A search checks up to 16 addresses.
Return the first accepted address
The search stops at the first address the server accepts and returns it with the server's verdict. If the server accepts everything or rejects everything, you get that as a status instead of a guess.
What comes back
Every search ends with one of four results
The status field tells you exactly what happened. You get an email address only when the mail server accepted it. In every other case you get the reason, so your code can decide the next step.
foundEmail found
The mail server accepted one of the formats. You get the address plus the server's verification result.
- jane.doe@…
- credits
- 10
catch_allCatch-all domain
This mail server accepts every address, so no single email can be confirmed. We return no address instead of guessing.
- null
- isCatchAll
- true
not_foundNo match
The server rejected every format we tried. The search completed, so it is still charged.
- null
- credits
- 10
no_mxNo mail server
The domain has no MX record, so there is no server to check. This usually means a typo or a domain that is not used for email.
- null
- credits
- 10
Credits refunded on503 capacity_exceeded retry after the Retry-After delay422 email_unverifiable Yahoo, ymail.com and rocketmail.com cannot be checked
The request
One GET request. Three parameters.
firstName and domain are required. lastName is optional, but without it only first-name formats like jane@ are tried, so send the full name when you have it. Results are never cached. Every call is a live check with the mail server.
Request parameters
Sent as query parameters with a Bearer API keyfirstNamerequired · 1 to 64 characters, at least one letter- The person's first name. Accents and capitals are fine.
lastNameoptional · 1 to 64 characters, at least one letter- The person's last name. Leave it out and only first-name formats are tried, so send it when you have it.
domainrequired · 3 to 253 characters, like example.com- The company's email domain. Send the bare domain, not a URL or an address.
curl -G "https://api.envoapi.com/v1/emails/find" \ -H "Authorization: Bearer $ENVO_API_KEY" \ --data-urlencode "firstName=Jane" \ --data-urlencode "lastName=Doe" \ --data-urlencode "domain=example.com"import osimport requestsresponse = requests.get( "https://api.envoapi.com/v1/emails/find", headers={"Authorization": f"Bearer {os.environ['ENVO_API_KEY']}"}, params={"firstName": "Jane", "lastName": "Doe", "domain": "example.com"},)result = response.json()["data"]const url = new URL("https://api.envoapi.com/v1/emails/find");url.searchParams.set("firstName", "Jane");url.searchParams.set("lastName", "Doe");url.searchParams.set("domain", "example.com");const response = await fetch(url, { headers: { Authorization: `Bearer ${process.env.ENVO_API_KEY}` },});const { data } = await response.json();req, _ := http.NewRequest(http.MethodGet, "https://api.envoapi.com/v1/emails/find", nil)req.Header.Set("Authorization", "Bearer "+os.Getenv("ENVO_API_KEY"))query := req.URL.Query()query.Set("firstName", "Jane")query.Set("lastName", "Doe")query.Set("domain", "example.com")req.URL.RawQuery = query.Encode()res, err := http.DefaultClient.Do(req){ "data": { "email": "[email protected]", "status": "found", "isCatchAll": false, "isDisposable": false, "candidatesChecked": 2, "verification": { "mx": "mx.example.com", "status": "valid", "reason": "accepted" } }, "meta": { "creditCost": 10 }}Response fields
Full schema in the API referencedata.emailstring | null- The accepted address. Present only when status is found.
data.statusenum- found, catch_all, not_found or no_mx.
data.candidatesCheckedinteger- How many addresses were checked, from 0 to 16.
data.isCatchAllboolean- True when the domain accepts every address.
data.isDisposableboolean- True when the domain is a known throwaway email provider.
data.verificationobject | null- The mail server we asked (mx), its verdict (status) and a stable reason code.
meta.creditCostinteger- Credits charged for this search: 10.
Error handling
What each error means and what to do next
Every error carries a stable error.code. Two of them refund the search. Only one of them should be retried as-is.
422 email_unverifiablerefunded · Do not retry- The domain is a Yahoo mailbox (yahoo.*, ymail.com or rocketmail.com). These cannot be checked. Credits are refunded.
503 capacity_exceededrefunded · Retry after the Retry-After delay- The verification provider is full right now. Credits are refunded. Wait for the number of seconds in the Retry-After header, then send the same request again.
429 rate_limit_exceedednot charged · Wait, then retry- Your API key sent more requests per minute than your plan allows. Nothing is charged. Slow down and retry after the Retry-After delay.
402 insufficient_creditsnot charged · Top up, then retry- Your account has fewer than 10 credits left. Nothing is charged. Watch the X-Credits-Remaining header on every response to see it coming.
400 invalid_requestnot charged · Fix the request- A parameter is missing or breaks a rule above. Nothing is charged. The error details name the field.
Pricing
10 credits per search, on every plan
A search is charged once it reaches a result. Credits are shared across every EnvoAPI endpoint, so the table shows what a plan buys if you spend it all on email searches. See full pricing.
| Plan | Per month | Credits | Email searches | Per search | Rate limit |
|---|---|---|---|---|---|
| Free | Free | 100 | 10 | Free | 10 RPM |
| Launch | $49 | 10,000 | 1,000 | $0.049 | 60 RPM |
| Growth | $149 | 50,000 | 5,000 | $0.03 | 120 RPM |
| Scale | $499 | 250,000 | 25,000 | $0.02 | 300 RPM |
| Volume | $1,799 | 1,000,000 | 100,000 | $0.018 | 600 RPM |
Need more than the largest plan? Enterprise plans add custom volume, rate limits and an SLA. Talk to us.
Use cases
Where teams use the Email Finder API
Fill missing emails in your CRM
Most CRMs have contacts with a name and a company but no email. Run them through the finder and write back only confirmed addresses.
CRM contact→Find Email→email field
Reach inbound leads faster
When a form gives you a name and company, find the work email before the lead reaches sales. Use the Company Data API to get the domain first if you only have a company name.
Company Data API→Find Email→lead owner
Build outbound lists
Combine People Search with the Email Finder to turn a list of target companies into contacts you can actually email.
People search→Find Email→Verify Email
Already have an email address? Check it with the Email Verification API for 2 credits instead.
Which endpoint
Find, verify or check: pick the right email endpoint
EnvoAPI has three email endpoints. They answer different questions and cost different amounts, and they work well in sequence.
Email Finder
- You send
- Name + company domain
- You get
- A confirmed work email, or the reason there is none
- Cost
- 10 credits
You know who you want to reach but not their address.
Email Verification
- You send
- One email address
- You get
- valid, invalid or unverifiable, with catch-all and disposable flags
- Cost
- 2 credits
You already have an address and want to know if it is safe to send to.
Disposable Email Check
- You send
- One email address
- You get
- Whether the domain is a throwaway inbox
- Cost
- Free
You want to block temporary inboxes at signup without spending credits.
Integration tips
Get more out of every search
Send the full name
Without a last name only first-name formats are tried, which rarely match at larger companies.
Store the result on your side
Results are never cached by EnvoAPI. If you search the same person twice, you pay twice, so save what you get.
Treat catch_all as unconfirmed
A catch-all server accepts anything, so the address could still bounce. Route these contacts to another channel or a lower-priority sequence.
Check isDisposable before saving
A found address on a throwaway domain is not a real work contact. Skip it rather than add it to your list.
Retry only when the API says so
A 503 capacity_exceeded is refunded and safe to retry after the Retry-After delay. A 422 email_unverifiable is refunded and will fail again, so do not retry it.
FAQ
Frequently asked questions
What does an email finder API do?
It turns a person's name and their company's domain into a work email address. EnvoAPI builds the email formats companies use most, checks them with the company's mail server in order, and returns the first one the server accepts.
How accurate is the Email Finder API?
We only return an address the company's mail server has accepted. If the server accepts everything (a catch-all) or rejects every format, we tell you that instead of guessing. You never get an address that was not confirmed.
Do you send an email to check the address?
No. Each address is checked with the company's mail server directly. The person never receives a message.
Which email formats are tried?
Common work-email formats built from the first and last name, such as jane, jane.doe and jdoe, in a fixed order, up to 16 per search. The search stops at the first address the server accepts, and candidatesChecked tells you how many were tried.
Is the last name required?
No. firstName and domain are required and lastName is optional. Without a last name only first-name formats are tried, so send the full name when you have it.
What does it cost?
10 credits per completed search, whether the result is found, catch_all, not_found or no_mx. The free plan includes 100 credits, which is 10 searches. Paid plans start at 10,000 credits a month, which is 1,000 searches.
Why is a search charged when no address is found?
A search that reaches a result is charged, because the mail server was checked. Only two errors are refunded: 503 capacity_exceeded and 422 email_unverifiable.
What should I do with a catch-all domain?
Treat it as unconfirmed. The domain accepts every address, so EnvoAPI returns no email rather than guess one. If you need to contact the person anyway, use a different channel or expect a possible bounce.
Does it work for Gmail or other personal addresses?
The finder searches one company domain, so it is built for work emails. Yahoo, ymail.com and rocketmail.com mailboxes cannot be checked at all. Those searches return 422 email_unverifiable and the credits are refunded.
Are results cached?
No. Every call is a fresh check with the mail server, so the response has no cache status. Save results on your side if you may need them again.
Start free
Try 10 searches for free.
Every new account gets 100 credits. No credit card needed.