Email Finder API — Getting Started — FetchLayer Docs
Documentation menu
FetchLayer FetchLayer API

Getting Started

One target in, one graded answer out. No account anywhere else — just your FetchLayer key.

1. Get your API key

Create an account and generate a FetchLayer API key from your dashboard. The same key works on every platform.

Create free account →

2. Find an address

A bare domain is fine. So is a social profile URL or a YouTube channel.

bash
curl -X POST https://api.fetchlayer.dev/email-finder/find-email \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"target":"python.org"}'

That returned psf@python.org at confidence: "high" in 9.5 seconds on 17 September 2026, with sourceUrl: "https://www.python.org/about" — the page it was read off.

3. Read the grade, not just the address

high means the target published it themselves

Confidence is graded on who published an address, not on what it ends in. An address found anywhere other than the target’s own pages cannot grade high, however right the domain looks. stripe.com returned an address that genuinely is @stripe.com, found elsewhere on the web, and graded medium. That is the rule working.

Why the rule exists

A lookup once returned jane.diaz@stripe.com at high confidence — Stripe’s own fictional demo persona from their checkout examples. A plausible address on a perfect domain, belonging to nobody. Read emailSource, sourceUrl and onTargetDomain alongside the grade, and you can check any answer by opening one page.

onTargetDomain is measured against the target you sent

For a YouTube channel that host is youtube.com, so an address published on the creator’s own website reads false and grades low. @veritasium returned veritasium@gmail.com found on veritasium.com exactly that way. Correct behaviour — and sourceUrl is what tells you it is still a good address.

4. Handle a “no” properly

Some targets publish nothing, and that is a finished answer rather than a miss.

bash
curl -X POST https://api.fetchlayer.dev/email-finder/find-email \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"target":"github.com"}'

NO_EMAIL_LISTED is a 200, and you are charged for it

The search ran; the target publishes nothing readable. github.com, g2.com and ticketmaster.com all answer this way, each with a note naming what was examined. You are billed one credit, the same as a hit, because the work is the same — what you bought is a definitive answer about that target. Do not retry it.

A 503 is the one to retry

A target that could not be read at all answers 503 with {"error":"the target could not be read right now, please retry"}. indeed.com returned one in 6.2s, and a domain that does not resolve in 2.8s. Two different statuses on purpose: that is what makes the 200 worth trusting.

5. Check whether the answer is whole

searched[] lists what was examined, incomplete[] lists anything that could not be finished, and complete summarises the two.

Which inputs are strong

Websites and YouTube channels — every one measured returned a complete answer. Social profiles are supported, can take longer, and may return a partial result, which the response marks as incomplete: https://x.com/paulg came back a 200 with complete: false and incomplete: ["web-search"]. Read complete rather than inferring wholeness from how long the call took.

6. Triage a list before spending on it

Free, fetches nothing, and tells you what kind of target you have and what a lookup would examine.

bash
curl -X POST https://api.fetchlayer.dev/email-finder/resolve-target \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"target":"https://x.com/naval"}'

Answers in about a tenth of a second with targetKind, resolvedUrl, wouldSearch[] and pagesFetched: 0.

Speed and billing

A lookup took between 9.5 and 101.6 seconds across the targets measured, driven by how much there is to look through rather than by the kind of target. Budget against the top of that range and run lookups in the background.

One credit per completed lookup, hit or not, reported as pagesFetched: 1. /resolve-target is free. pagesCrawled (1 to 65 across the same set) shows how big a search was and prices nothing.

Errors and retries

A 400 names the field — a missing target, or an unrecognised key. A 401 means the key is missing or invalid. A 503 means the target could not be read; that is the one worth retrying. A NO_EMAIL_LISTED is not an error and should not be retried.

Next steps