Live database · grows hourly

Disposable email checker that updates daily, not yearly.

269,933+

disposable domains in the blocklist · updated daily

The disposable-email-domains npm package updates once a quarter. vrfymail's database adds new throwaway providers within hours of cert issuance — your moat compounds as traffic grows.

The five data sources

How the database stays current

Five independent channels feed the domains table. Each one catches what the others miss.

  1. 1.
    Bundled seed
    ~121k entries from the disposable-email-domains npm package. The floor.
  2. 2.
    Daily scrapers
    Polls 1secmail / mail.tm / mail.gw public APIs at 24h cadence and captures every inbox domain they hand out. Rows tagged source: "scraper:<provider>".
  3. 3.
    Spamhaus DBL (live)
    Every verify call that probes Spamhaus DBL and gets a hit persists the domain to the table. Promotes from "this customer hit it" to "we now know about it" automatically.
  4. 4.
    Customer-consensus promotion
    ≥3 distinct customers POST hard_bounce or spam_complaint on the same domain within 30 days → is_spam_trap=1. Free-mail providers excluded.
  5. 5.
    CT-log scanner
    Hourly polls of crt.sh for newly-issued TLS certs matching temp/throwaway/minute/burner-mail patterns. Catches the next disposable provider before they have customers.
The check

One endpoint, one verdict

POST the email to /v1/check. If the domain is in the disposable database (or any of the four other lists), the response carries disposable: true and reason: "disposable".

request.sh
bash
curl https://vrfymail.com/v1/check \
  -H "Authorization: Bearer vk_live_..." \
  -d '{ "email": "user@mailinator.com" }'
response.json
json
{
  "result": "undeliverable",
  "reason": "disposable",
  "reason_message": "This email provider doesn't deliver mail reliably. Please use a real address.",
  "disposable": true,
  "spam_trap": false,
  "mx_found": true,
  "score": 0.0,
  "trap": { "listed": false, "lists": [], "code": null }
}
Why static lists fail

The npm package was updated 8 weeks ago.

New disposable providers spin up daily. A throwaway domain registered this morning, issued a TLS cert this afternoon, advertised on a Telegram channel by evening — and your signup form accepts it tomorrow because the npm package you imported hasn't seen it.

vrfymail's CT-log scanner catches that domain within hours of cert issuance. Customer-consensus promotion catches the ones the scanner misses — three customers reporting the same hard-bounce promotes the domain globally in 24-72h.

The math: a static list at 121k entries vs a live database at 269,933+. The delta is everything ZeroBounce, the npm package, and your hand-curated blocklist file haven't caught yet.

What you're betting on
  • Static list Disposable lag of 4-12 weeks. Misses every provider that launches between releases.
  • DBL only Catches Spamhaus-listed domains. Misses temp-mail providers Spamhaus doesn't list.
  • vrfymail All five sources at once. New domain → in database within hours. Customer hits → consensus-promoted within days.
Pairs well with

Other signals on the same call

Every /v1/check request runs the disposable lookup alongside spam-trap detection, B2C strict-mode flags, role-account detection, MX checks, and your per-customer bounce overlay. One call, every signal, 50ms p50.

Building a signup form with an AI coding tool? The AI builders hub has copy-paste integrations for Cursor, Claude Code, v0, Bolt.new, and seven more — all wired against this same disposable database.

Frequently asked

Disposable email checker API, answered

How is the disposable list different from the npm package?
The disposable-email-domains npm package is a static JSON file updated by maintainers when they get around to it — typically once a quarter, sometimes longer. vrfymail's database starts with that seed and adds four live channels: daily scrapers polling 1secmail/mail.tm/mail.gw, every Spamhaus DBL hit on a verify call, customer-consensus promotion (≥3 customers report = global flag), and a CT-log scanner finding new throwaway providers within hours of TLS cert issuance.
How fresh is the data — what's the worst-case lag for a new disposable provider?
CT-log scans run hourly. A throwaway provider issuing a TLS cert today is in our database before they have customers. The disposable-domains npm package took 8+ weeks to add the same domain in our latest spot check. For customer-consensus promotions, 3 distinct customers reporting a hard-bounce on a domain within 30 days promotes it globally — typically within 24-72h of first appearance.
What's in the response — boolean, or actual signal?
Both. The top-level disposable field is a boolean for simple checks. The full response includes reason (machine code like disposable, no_mx, syntax) and reason_message (end-user copy). For deeper signals like spam-trap listing, the trap object exposes which list flagged the domain (spamhaus_dbl) and the listing code (.2 spam, .4 phish, .5 malware) — most APIs flatten this to a boolean and lose the why.
Does the API charge me when the email is disposable?
Yes — disposable verdicts are billed (one credit). Only unknown verdicts get refunded via refundUsage(). The reasoning: disposable detection is a real positive signal, the kind you'd pay for in a verification API. unknown means we couldn't decide, which isn't a service we should charge for.
What about catch-all domains and free-mail providers like Gmail?
Free-mail providers (Gmail, Outlook, Yahoo, etc.) are explicitly excluded from the disposable list — flagging Gmail as disposable would break every signup form on the internet. Catch-all detection is separate from disposable detection: a catch-all returns result: deliverable with reason: catch_all_domain (verifiable but not mailbox-confirmed). The strict mode flag set is what catches Gmail-style aliases like plus addressing and dot tricks.

269,933+ blocked. Self-growing. One call.

5,000 verifies/month free, no card. Paid plans start at $9/mo for 10,000 — see pricing.

Get my API key