Skip to content
ProofTell
Sign inSign up
Email verification

Is there a mailbox behind the address?

ProofTell asks the mail server responsible for an address whether the mailbox exists, and stops before any message is sent. You get a verdict, the reason for it and four flags. $3.00 per 1,000 addresses.

Unknown results and syntax errors are free.

Email check
jane@northwind.example
Mail handled by google.com
Deliverable
Reason
mailbox_exists
Suggested action
accept
Not disposableNot a role accountNot catch-allCompany domain
What comes back

A verdict, and the evidence for it.

The check is Verimail’s. It reports what the mail server said, and says so when the server said nothing.

A verdict

Deliverable, undeliverable, risky or unknown. Four words, each one a fact the mail server gave us or declined to give.

verdict

The reason

Why: the mailbox exists, it was rejected, the domain has no mail server, the domain accepts anything. A documented list, not a guess.

reason · code

A suggested action

Accept, accept and confirm, or reject. A safe default your first integration can act on directly.

suggested_action

Four flags

Disposable provider, role account (info@, sales@), free mail provider, catch-all domain. Each one true or false.

flags

The provider

Who runs the mail for that domain, read from its mail servers.

provider

Your time limit

You choose how long a check may wait for a slow mail server. Past your limit, the answer is unknown, and free.

timeout
We don’t guess

Four verdicts. You pay for three.

A verdict is charged because it is a fact about the address. When a mail server will not give us one, the answer is unknown and costs nothing, on the API and in files.

VerdictWhat it meansCost
deliverableThe mail server accepted the mailbox.$0.0030
undeliverableThe mailbox was rejected, or the domain has no mail server at all. An address that fails the syntax check is undeliverable too, and free.$0.0030
riskyThe domain accepts every address, the mailbox is full, or the provider is disposable.$0.0030
unknownThe server would not say: greylisting, a block, a stall, or your timeout ran out.Free
For developers

One POST. One address.

The address travels in the request body, never in a URL. A pt_test_ key returns simulated results for documented addresses, free.

The values on the right are an illustration; the fields are the live ones.

Read the API reference
curl https://api.prooftell.com/v1/email \
  -H "Authorization: Bearer $PROOFTELL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "jane@northwind.example"
  }'
const res = await fetch("https://api.prooftell.com/v1/email", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.PROOFTELL_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    email: "jane@northwind.example",
  }),
})
const address = await res.json()
import os, requests

res = requests.post(
    "https://api.prooftell.com/v1/email",
    headers={"Authorization": f"Bearer {os.environ['PROOFTELL_KEY']}"},
    json={
        "email": "jane@northwind.example",
    },
)
result = res.json()
print(result["verdict"], result["reason"])
Response
{
  "status": "success",
  "email": "jane@northwind.example",
  "result": "deliverable",
  "deliverable": true,
  "did_you_mean": "",
  "user": "jane",
  "domain": "northwind.example",
  "code": 200,
  "verdict": "deliverable",
  "reason": "mailbox_exists",
  "billed": true,
  "suggested_action": "accept",
  "flags": {
    "disposable": false,
    "role_account": false,
    "free_provider": false,
    "catch_all": false
  },
  "provider": "google.com",
  "latency_ms": 574,
  "cost": "0.0030",
  "currency": "USD",
  "signals": {
    "email": { "status": "ok", "cost": "0.0030" }
  }
}
What it costs

$3.00 per 1,000 addresses.

  • $0.0030 per address that gets a verdict, taken from your dollar balance.
  • Unknown results, temporary refusals and syntax errors are free.
  • The response says whether the run was charged (billed) and what it cost.
See the rate card
In the risk score

The tells an address gives away.

Sent to /v1/assess with a phone or an IP, the same check feeds the score. These are the reasons it can add:

  • email_invalid
    The email address is not a valid address.
  • email_undeliverable
    The mailbox does not exist or rejects mail.
  • email_disposable
    The email address uses a disposable provider.
  • email_catch_all
    The domain accepts any address, so the mailbox could not be confirmed.
  • email_risky
    The mailbox is risky, for instance over quota.
  • email_unverifiable
    The mail server would not say whether the mailbox exists.
FAQ

About the email check.

Do you send an email to the address?
No. The check opens a conversation with the mail server responsible for the address, asks whether it would accept mail for that mailbox, and ends the conversation before any message is transmitted. Nothing lands in the inbox.
What is a catch-all domain, and why is it “risky”?
A catch-all domain accepts mail for any address, real or not, so its server cannot confirm that a particular mailbox exists. We tell you that plainly rather than call the address deliverable. Many legitimate companies run catch-all domains, which is why the suggested action is to accept and confirm, not to reject.
Why would a result be “unknown”?
Because the mail server would not answer the question: it asked us to come back later (greylisting), refused the connection on policy, stalled, or your time limit ran out. We do not turn a non-answer into a verdict, and we do not charge for one.
How long does a check take?
It depends on the mail server at the other end. You set the limit with timeout, in milliseconds; when it runs out, the answer is unknown and free. In a file, addresses whose server asked us to come back are retried before the file is finished.
Where does the address go?
To the mail server that handles it. The request carries the address and nothing more, and travels through verification servers in several countries inside and outside the EU and the UK, because mail providers answer differently depending on where a request comes from. The security page describes this in full.
Can I verify a whole list?
Yes. Upload a CSV or an Excel file from the dashboard or through the API, and download it back with a verdict and a reason on every row. See bulk verification.

Verify your first address in a minute.

Create an account, take a sandbox key, make your first call in minutes.