Documentation

Email Finder API

One action: find a business email from a name and a company domain. Four ways to call it, all returning the same shape and all applying the same rules about what may be called verified.

Verification statuses

Read this field before you use an address. It is the whole point of the product, and the three values are not interchangeable.

verified

The mail server accepted this specific mailbox. This is the only status that means the address was confirmed.

accept_all

The domain accepts every address sent to it, so acceptance proves nothing about this one. Treat it as a strong guess, not a confirmation.

unverified

The pattern matches how this company forms addresses, but nothing confirmed the mailbox exists. Do not send cold volume to it.

accept_all is not a confirmation. A catch-all domain returns a positive response for every address, including ones that cannot exist. When you see it, the address is a well-formed guess and nothing more. We report it as its own status rather than folding it into a hit, which is the single most common way email tools overstate what they know.

Two further rules the mapper enforces, so you can rely on them: a domain flagged catch-all can never come back verified, and neither can a role account like info@ — a shared mailbox may well be live, but it is not the person you asked about. Anything we do not conclusively recognise falls through to unverified.

confidence is a 0–1 figure that is clamped by the status: an accept_all or unverified result can never present with the confidence of a confirmed one, regardless of any score the underlying check produced.

Authentication

Mint a key at /dashboard/api-keys. Pass it as a bearer token, or as ?api_key= when your client cannot set headers (the Ounie AI Team's manual MCP entries, for instance).

Authorization: Bearer eml_live_...
# or
https://emailfinder.ounie.com/api/lookup?api_key=eml_live_...

Your ounie.com master key (ounie_live_…) also works here once you enable “Use across Ounie apps” in your ounie.com settings — one key for the whole fleet. Every call draws its owner's shared Ounie wallet and is refused rather than allowed to overdraw.

REST

POST /api/lookup

Costs 10 credits when an address comes back, zero otherwise.

curl -X POST https://emailfinder.ounie.com/api/lookup \
  -H "Authorization: Bearer eml_live_..." \
  -H "content-type: application/json" \
  -d '{
    "firstName": "Dana",
    "lastName": "Whitfield",
    "domain": "northbeam.io",
    "companyName": "Northbeam"
  }'

companyName is optional and is stored as a label on the lookup for your own records; it does not influence the search. The search itself is driven entirely by domain.

Response

{
  "id": "0f3c…",
  "found": true,
  "email": "dana.whitfield@northbeam.io",
  "confidence": 0.92,
  "verification": "verified",
  "pattern": "first.last",
  "alternatives": [],
  "tested_count": 4,
  "flags": {
    "catch_all": false,
    "disposable": false,
    "role_account": false
  },
  "query": { "first_name": "Dana", "last_name": "Whitfield",
             "domain": "northbeam.io", "company_name": "Northbeam" },
  "credits_charged": 10
}

When nothing is found you get "found": false, "credits_charged": 0, and a note saying so.

alternatives carries other plausible addresses when the underlying check supplies them. It is frequently an empty array, and that is a real answer — we do not manufacture entries to make a response look fuller.

GET /api/lookups

Your history, newest first. Free. Optional ?domain=, ?limit=, ?offset=.

GET /api/lookups/{id}

One past lookup. Free.

GET /api/credits

Your spendable Ounie credits. Free.

GET /api/pricing

Public. Price, status meanings, and the x402 endpoint.

MCP

A Model Context Protocol server at https://emailfinder.ounie.com/api/mcp (Streamable HTTP) and https://emailfinder.ounie.com/api/sse. Works with Claude, Cursor, ChatGPT and the Ounie AI Team.

{
  "mcpServers": {
    "email-finder": {
      "url": "https://emailfinder.ounie.com/api/mcp",
      "headers": { "Authorization": "Bearer eml_live_..." }
    }
  }
}

For hosts that cannot set static headers — the Ounie AI Team's manual HTTP MCP entry among them — put the key in the URL instead: https://emailfinder.ounie.com/api/mcp?api_key=eml_live_…

Tools

  • find_email10 cr on an answerfirst_name, last_name, domain, company_name?
  • get_lookupfreelookup_id
  • list_lookupsfreedomain?, limit?
  • get_credit_balancefree
  • get_pricingfree · public
  • whoamifree

If the wallet cannot cover a lookup the tool returns an insufficient_credits error with a link to top up. An agent is refused, never allowed to overdraw.

x402 — pay per call, no account

Keyless agents pay $0.12 in USDC on Base. POST without a payment header to receive the terms, sign, and retry with X-Payment.

POST https://emailfinder.ounie.com/api/x402/find
{ "first_name": "Dana", "last_name": "Whitfield",
  "domain": "northbeam.io" }

→ 402 Payment Required   (terms, payTo, USDC contract, EIP-712 domain)
→ retry with X-Payment: <signed authorization>
→ 200 { "found": true, "email": "...", "verification": "verified",
        "settled": true, "payment": { "tx_hash": "0x…" } }
Nothing settles unless an address is found. Your payment is verified, the lookup runs, and settlement happens only if there is a result. If nothing is found you get a normal 200 with "found": false, "settled": false and your money never moved. An on-chain settlement has no refund path, so the check has to come first.

Requests that cannot possibly succeed — a missing name, a malformed domain, a consumer mailbox provider, a disposable domain — are refused with a 4xx before any price is quoted. You will never be asked to sign a payment for work that was always going to fail.

The same applies when we are down. If the lookup engine is unavailable, this endpoint answers 503 with {"error":"temporarily_unavailable"} and no accepts array — so there is nothing to sign and no round-trip wasted building an authorization. This holds for every call while the engine is down, not just the first. Honour the Retry-After header and come back.

Errors

CodeHTTPMeaning
first_name_required400Missing or invalid given name.
last_name_required400Missing or invalid family name.
domain_required400No domain supplied.
domain_malformed400Not a company web domain (IP literals and single labels included).
domain_free_provider400A consumer mailbox provider. Refused free — patterns do not apply there.
domain_disposable400A throwaway-mail domain. Refused free.
insufficient_credits402Wallet cannot cover the lookup. Includes buy_credits_url.
too_many_running429More than 5 lookups in flight.
temporarily_unavailable503We could not run the check, or we already know the upstream is down. Nothing charged, and no price is quoted.
lookup_failed502The lookup could not be completed. Nothing charged.

Every 4xx in this table is decided from the request alone, so it costs nothing and behaves identically on the credit and x402 rails.

Availability

A lookup depends on a third-party discovery engine and on the behaviour of mail servers we do not control. We do not promise uptime, and we do not promise that any given person's address is findable.

What we do promise is how a bad day behaves. When the engine is unavailable, every rail returns 503 temporarily_unavailable — and it does so before reserving credits or quoting a price, so there is no reserve-then-refund cycle to reconcile and nothing for an agent to sign. Once the engine recovers, the next request goes through on its own; there is nothing to reset.

You are never charged for a lookup we could not run. If one does slip through and fail, the reservation refunds in full, automatically.

A scheduled probe checks the engine every few minutes. While it reports the engine as down, every rail refuses up front and charges nothing — there is no window in which a caller is let through to discover the outage the expensive way. When the probe succeeds again, service resumes on its own.

Limits and scope

  • · 5 concurrent lookups per account.
  • · Up to 5 active API keys per account.
  • · Roughly four address shapes tested per lookup: first.last, first, flast, f.last.
  • · One named person at one named company per call.
There is no bulk endpoint. Email Finder will not enumerate a domain to discover who exists there. That is a different product and a worse one, and we have deliberately not built it.

A verified status tells you a mailbox exists. It does not tell you that contacting it is appropriate or lawful in your jurisdiction — that judgement, and compliance with the rules that apply to you, stays with you.