Real-time email verification API

Stop bounces before they happen. Verify emails before you send.

Catch typos, dead domains, disposable inboxes and role accounts in about 200ms per address — real-time at signup or in bulk batches of 100. One endpoint, JSON in, JSON out, 100 free checks every month.

No credit card. No sales call. Live key in under a minute.

POST /api/public/v1/verify
curl -X POST https://fishymails.com/api/public/v1/verify \
  -H "Authorization: Bearer fm_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"kind":"email","value":"jane@acme.io"}'

{
  "kind": "email",
  "value": "jane@acme.io",
  "status": "valid",
  "score": 95,
  "checks": {
    "has_mx": true,
    "disposable": false,
    "role_account": false,
    "free_provider": false
  },
  "latency_ms": 184
}

Verifying signups and campaign lists for teams like:

Second LegacyHELLO LabsLeadFind

The three things bad data is costing you right now

Hard bounces wreck your sender reputation

A 5% bounce rate is enough for mailbox providers to start throttling. Once the inbox placement drops, even your good emails stop landing.

Live MX resolution rejects dead domains and typo'd addresses before they ever enter your ESP.

Spam traps and role inboxes get you blocklisted

One recycled trap or a batch of info@ addresses can put your sending domain on a blocklist for weeks.

Role-account and disposable detection flags the addresses that never should have been mailed.

You pay your ESP to email people who don't exist

Most lists carry 15-30% junk. You pay per contact, run campaigns against ghosts, and report inflated funnel numbers.

One bulk call cleans the list up front, so you only pay for contacts that are actually reachable.

Live in three steps

  1. 1

    Get your API key

    Create a free account, copy your key from the dashboard. No credit card, no sales call.

  2. 2

    Send a request

    POST the address to /api/public/v1/verify, or send up to 100 at once to /verify/bulk.

  3. 3

    Get results instantly

    Status, 0-100 score and per-check detail come back in a single JSON body — block, flag, or allow on your side.

request / response
// Bulk: up to 100 addresses in one call
await fetch("https://fishymails.com/api/public/v1/verify/bulk", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.FISHYMAILS_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    emails: ["jane@acme.io", "info@acme.io", "bob@mailinator.com"],
  }),
});

{
  "count": 3,
  "credits_remaining": 97,
  "results": [
    { "value": "jane@acme.io",       "status": "valid",   "score": 95 },
    { "value": "info@acme.io",       "status": "risky",   "score": 75 },
    { "value": "bob@mailinator.com", "status": "invalid", "score": 30 }
  ]
}

Built for production, priced for prototypes

Real-time and bulk

Sub-second single checks for signup forms, plus batches of 100 processed in parallel for list cleaning.

Disposable and role detection

Continuously updated throwaway-domain lists and role-inbox patterns, returned as explicit booleans.

Built for uptime

Stateless edge deployment with no cold starts. Median response around 200ms, worldwide.

One endpoint to integrate

Plain HTTP with a bearer token. No SDK lock-in, works from any language or no-code tool.

Scores, not verdicts

Every result carries a 0-100 score and the raw checks, so you set the threshold your funnel can live with.

Transparent pricing

One credit per check. 100 free every month, then $29 for 1,000. No seat fees or hidden overage.

100 free checks every month. No credit card required.

Paid plans start at $29/month for 1,000 checks and scale to 250,000. Annual billing gives you two months free. No seat fees, no minimum contract, cancel whenever.

Questions developers actually ask

Clean your next campaign before you press send.

Set up in 5 minutes. Your first 100 checks are free.