The score, programmable

Nine tools. One key. Billing you can audit.

Every Mozart tool has a synchronous endpoint and a bulk sibling. Responses carry billable and charged, so your ledger can mirror ours to the line.

Get your free API keyRead the docs →

No credit card required · 50 free credits

mozartemail.com / api
curl -X POST https://mozartemail.com/api/verify \
  -H "Authorization: Bearer mz_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "email": "clara.weber@deutschebank.com" }'
200 OK
{
  "ok": true, "billable": true, "charged": 0.1,
  "result": "valid",
  "reason": "smtp_rcpt_exists",
  "provider": "m365",
  "confidence": 99
}
On a catch-all domain
/api/verify"result": "catch_all" · a verdict, charged 0.1
/api/find-email"status": "not-found" · no provable mailbox, charged 0

The finder never sells a guess. When the catch-all verdict is what you need, that is what the verifier is for.

♪ Built for coding agents

The most AI-friendly email API on the market.

Every modern AI coding tool speaks plain REST, and that is all Mozart asks for. One key, typed responses, and a billing field on every answer: your agent integrates the whole catalogue in a single prompt, and knows what each call cost without asking you.

Coding agents

Claude CodeCursorOpenAI CodexGemini CLIGitHub CopilotWindsurfClineZedReplit AgentAider

Protocols and pipelines

MCPLangChainn8nMakeZapier
One key, nine toolsNo per-tool credential, no separate API quota. An agent that holds the key holds the whole catalogue.
Typed, stable responsesSame field names in every tool, documented status values, and error codes that never change shape mid-flight.
Billing an agent can readbillable and charged ship on every response, so an autonomous run can account for itself without scraping an invoice.
Machine-readable by defaultA /llms.txt at the root, docs written to be parsed as much as read, and no login wall between an agent and the reference.
The catalogue

Nine endpoints, and their bulk siblings.

every row links to its section in the docs

ToolSynchronousBulk uploadCostBilled when
Email finder/api/find-email/api/bulk/upload1 cran address is verifiedEmail verifier/api/verify/api/bulk-verify/upload0.1 cra verdict is producedDomain finder/api/find-domain/api/bulk-domain/upload0.1 cra domain clears the confidence gateDomain scraper/api/scrape-domain/api/bulk-domain-scraper/upload1 crthe domain is scannedLinkedIn profile/api/linkedin-profile/api/bulk-linkedin/upload1.5 crthe profile is foundLinkedIn company/api/linkedin-company/api/bulk-linkedin-company/upload0.5 crthe page is scrapedLinkedIn URL finder/api/linkedin-finder/api/bulk-linkedin-finder/upload1.5 cra profile is deliveredGoogle Maps scraper/api/google-maps/search/api/scrape-google-maps/api/bulk-google-maps/upload1 cra listing is deliveredReverse lookup/api/reverse-lookup/api/bulk-reverse-lookup/upload2 cra profile is delivered

plus one endpoint that is always free: POST /api/google-maps/quote runs the real sweep and returns the true count before you spend anything

POST …/uploadGET /api/bulk/{id}GET …/{id}/downloadDELETE /api/bulk/{id}

One lifecycle for every batch: upload a CSV or .xlsx, poll every 5 to 10 seconds, download the enriched CSV with your columns intact. Deleting a running job cancels it and refunds everything held but not yet charged.

5 000 rows / file · 3 MB · 3 concurrent jobs · results kept until you delete them

Why it holds up

An API your accountant could read.

"billable": true, "charged": 0.1

Billing fields, everywhere

Every response and every CSV row says whether it was billed and for how much. Build your own ledger: it will match ours to the line.

key balance = dashboard balance

No separate quota

There is no API tier and no request pack. The key spends exactly the credit balance you see in your dashboard, single calls and bulk alike.

mz_live_8f3kQ9pX···· → sha256

Keys, hashed

A key is shown once and stored as a SHA-256 hash. When a call carries both a key and a session cookie, the key wins, so server calls never ride a browser login.

Integration honesty

The quirk, in writing.

Two tools put the verdict in ok and status: /api/find-email and /api/find-domain. The seven others return HTTP 200 whenever the call ran, and put the verdict in the payload. When in doubt, branch on billable: it is authoritative, because it is exactly what you paid for. Transport failures are non-2xx with { ok: false, reason }, and those are never billed.

The same paragraph, with examples → in the docs

Tempo, enforced

Rate limits with numbers on them.

Three gates guard each synchronous endpoint: a per-second burst, a per-account minute, and a global minute shared by everyone, protecting the engine. Any gate answers 429 with a Retry-After header. Back off that many seconds and retry.

EndpointBurstPer accountGlobal
/api/find-email3 / sec40 / min40 / min
/api/find-domain3 / sec60 / min60 / min
verifier · scrapers · reverse lookup3 / sec40 / min60 / min
/api/google-maps/quote1 / 2 sec8 / min24 / min
/api/google-maps/search1 / 2 sec6 / min20 / min

bulk: 3 concurrent jobs per account · status, list and download calls are unlimited

♪ SELF-DRIVING JOBSBatches run on our worker and survive a network drop on your side. Close the laptop: the job finishes, and the results wait for you.

♪ ATOMIC FINALIZATIONWe hold cost × rows at upload, charge only the rows that produced a result, and refund the difference the moment the job finishes.

♪ AUTO-REFUND PATHSA job that errors refunds itself. Cancelling refunds everything not yet charged. An engine timeout was never billed in the first place.

5 000 rows · Maps < 1 min · reverse lookup ≈ 9 min · LinkedIn profiles ≈ 20 min

Past a few hundred lookups, use bulk rather than looping the synchronous calls: a batch outruns the per-account minute gate, and it survives on its own.

One prompt, wired

Hand it to your agent. Walk away.

There is no SDK to install, no OAuth dance, no sandbox to request. The reference is public and parseable, so a coding agent reads it, writes the call and gets a typed answer on the first try.

And because unproven results cost nothing, an agent looping over five thousand rows cannot quietly spend your balance on guesses.

Read the docs →/llms.txt
paste into your coding agent
Read https://mozartemail.com/llms.txt and
https://mozartemail.com/docs, then wire the email finder
into this repo. Key is in MOZART_API_KEY.
Bill nothing that is not proven.
→ reads /llms.txt and /docs
→ writes the call, typed on the first try
billable and charged on every response
Quickstart

A key in three measures.

1Create a free account.50 credits at signup · no card
2Generate your key.Settings → API → mz_live_… · shown once, revoke anytime
3Make the first call.curl -X POST https://mozartemail.com/api/verify · a verdict in seconds

First verified call in under a minute → start now

Developer questions

The questions a first call raises.

How do I authenticate?

Every request carries Authorization: Bearer mz_live_<key>. Generate keys in Settings → API once you have an account. Each key is shown once and stored as a hash; you can disable or rotate it at any time, and a revoked key returns 401 unauthorized. There is no separate API quota: the key spends the balance you see in your dashboard.

What happens when a call fails?+

Transport failures are non-2xx with { ok: false, reason }, and they are never billed. Rate limits answer 429 with a Retry-After header. An engine timeout answers 503: nothing was charged, safe to retry. And a result we cannot prove is not a failure. It comes back clean, with charged: 0.

How do I follow a bulk job?+

Poll GET /api/bulk/{id} every 5 to 10 seconds: queued, then processing, then done. Status, list and download calls are unlimited, partial results stream from the download endpoint while the job runs, and the job keeps going if your side disconnects.

Do you have webhooks?+

No. Bulk was built to be polled: status calls are free and unlimited, partial results are downloadable mid-run, and a finished job waits for you indefinitely. A 10-second poll from your worker is one line of code, and it cannot miss an event.

Where is the data processed?+

In France, on our own infrastructure. Mozart calls no third-party enrichment API, so a request you send us is never forwarded to a subcontractor. B2B professional data only, never resold, GDPR applies.

Why does the domain scraper bill a blocked scan?+

It is the one tool billed for the work rather than the catch: ok, blocked, unreachable and timeout all mean the scan ran, and a site that publishes no address is a real answer. Only error, a scan that could not start, is free.

Ship the integration before the trial would have ended elsewhere.

One key, nine tools, and a ledger you can check.

Get your free API key

No credit card required · 50 free credits