ContactLintAPIMCPPricingFree toolsGet a key

Home / MX Record Checker API: Verify Email Domains at Signup

MX Record Checker API: Verify Email Domains at Signup

Published 2026-10-13

Before you save an email address, it helps to know the domain can actually receive mail. ContactLint checks that in code. Send one address to the API and it looks up the domain's MX and A records, plus a few other checks, in the same call.

What an MX record tells you about an email address

MX records and A records

MX stands for mail exchanger. A domain's MX records list the servers that accept email for it. When someone writes to name@example.com, the sending server looks up the MX records for example.com to find out where to deliver.

A domain with no MX record can still take mail at its address record. So ContactLint looks up both.

If a domain has neither, mail to it has nowhere to go. You don't want that address in your database, on a receipt, or in your sales team's queue.

What a passing MX check does not prove

A passing MX check means the domain is set up for mail. That's all. It doesn't prove a specific mailbox exists or that anyone reads it. A valid result doesn't guarantee delivery either. Treat it as a strong signal, not a promise.

How ContactLint checks MX records

What runs on every email check

Each email you send gets checked for:

You don't wire up the MX lookup as a separate step. It comes back with everything else.

What it does not do

ContactLint never opens an SMTP connection to the mailbox. It doesn't ask the mail server whether a user exists. The list above is the whole job.

Need SMTP diagnostics or blacklist checks for your own mail server? A dedicated DNS tool is the better fit. ContactLint is for checking addresses other people hand you.

Checked addresses are not stored. For the lookup, the domain part of the address goes to Cloudflare's DNS resolver. The privacy policy has the details.

Run an MX check in one API call

curl example

Grab a free API key, then send the address to the email endpoint:

curl -X POST https://contactlint.com/v1/email/validate \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{"email":"someone@example.com"}'

Send your key as Authorization: Bearer YOUR_KEY or in an x-api-key header. The full response shape is in the OpenAPI 3.1 spec at /openapi.json.

For the MX decision, four fields matter: mx_found, a_found, deliverable_domain, and verdict. The verdict is one of valid, risky, invalid, or unknown. Each call counts as one check.

Errors and limits

Call GET /v1/usage to see your free checks used this month and your credit balance.

What your signup form should do with each MX result

The lookup is the easy part. The hard part is deciding what to do with the answer. Block too hard and you turn away real people. Block too little and dead addresses pile up.

Here's one way to handle each outcome using only the fields above.

Decision table

Response What it likely means What the form should do Message to show
mx_found is true Domain is set up for mail Accept and move on to the other checks None
mx_found is false, a_found is true Domain may still take mail at its address record Set your own policy. Look at deliverable_domain and verdict, then either accept, or warn and let the person confirm Your choice, or "Please double-check your email address."
mx_found is false, a_found is false Mail has nowhere to go. This can mean a typo in the domain Ask the person to fix it "We can't find a mail server for that domain. Please check the spelling."
verdict is unknown, or your request to the API fails No clear answer from the check, which is not the same as a bad address Don't block. Accept or save for review None, or "We'll confirm your email shortly."

To keep it fair to real users:

Server-side example

Run the check on your server. Your API key should never sit in front-end code.

// Node.js, server side
async function checkEmail(email) {
  let res;
  try {
    res = await fetch("https://contactlint.com/v1/email/validate", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${process.env.CONTACTLINT_KEY}`,
        "content-type": "application/json"
      },
      body: JSON.stringify({ email })
    });
  } catch (err) {
    // Network problem. Do not block the user.
    return { action: "accept_and_review" };
  }

  if (!res.ok) {
    // For example 429 (rate limit) or 402 (out of checks).
    // Log the status so you can fix 400, 401 and 402 on your side.
    return { action: "accept_and_review" };
  }

  const r = await res.json();
  // Field names from /openapi.json: mx_found, a_found,
  // deliverable_domain, verdict. Check the spec for where
  // they sit in the response and adjust these paths.

  if (r.verdict === "unknown") return { action: "accept_and_review" };
  if (r.mx_found) return { action: "accept" };
  if (r.a_found) return { action: "your_policy", result: r };
  return { action: "ask_to_fix" };
}

Your form calls your server, your server calls ContactLint, and the form shows the matching message from the table.

Run the MX check from an AI agent (MCP)

If an AI agent collects or uses contact data, it can run the same check. Point any MCP client that supports streamable HTTP at:

https://contactlint.com/mcp

Send the header Authorization: Bearer YOUR_KEY. You get two tools, validate_email and validate_phone. Email checks include the MX and A record lookup, and each tool call uses one check.

Cost

The Free plan gives you 100 checks per month, no card required.

Need more? Credit packs are 5,000 checks for $9, 25,000 for $35, or 100,000 for $99 (USD). Credits kick in after your monthly free checks run out, and they don't expire. Unused credits are refundable within 14 days of purchase. See the pricing section of the home page for the full table.

ContactLint checks phone numbers too. The email and phone validation API page covers both.

FAQ

What does an MX record checker do?

An MX record checker looks up the mail exchanger records in a domain's DNS. Those records say which servers accept email for that domain. If a domain has no MX record and no address record, mail sent to it has nowhere to go. That makes the address a poor choice to store or contact.

Does ContactLint connect to the mail server?

No. ContactLint never opens an SMTP connection to the mailbox. It checks syntax, looks up MX and A records through Cloudflare DNS-over-HTTPS, and compares the domain against a disposable domain list. It also flags role addresses and free mail providers. That means it checks the domain is set up for mail, not that one mailbox exists.

How much does it cost to check MX records with ContactLint?

The free plan includes 100 checks per month and needs no card. The MX lookup runs inside the email validation call. If you need more than 100, you can buy credit packs: 5,000 checks for $9, 25,000 for $35, or 100,000 for $99 (USD). Credits do not expire. Unused credits are refundable within 14 days of purchase.

Can an AI agent run the MX check?

Yes. ContactLint has an MCP server at https://contactlint.com/mcp. Point any MCP client that supports streamable HTTP at it and send your key in the Authorization header. The validate_email tool checks email addresses, and email checks include the MX and A record lookup. Each tool call uses one check.

What should my form do if the MX check fails?

Show a short, plain message and let the person fix the address. A missing MX record can mean a typo in the domain, like a misspelled provider name. Avoid hard blocking on a DNS timeout, because that is a lookup problem, not a bad address. Ask the person to try again or save it for review.

Start checking MX records

Get a free API key and you have 100 checks per month, no card needed. No email is sent at signup. Your key is shown once, so save it somewhere safe.

Get a free API key

Want the full endpoint list first? Read the endpoints on the home page.

Questions? Email support@contactlint.com.

Read our privacy policy and terms.

Get a free API key. 100 checks per month, no card required.

Signup Form Validation Checklist

Map mx_found, a_found, deliverable_domain and the rest of the response to Accept, Warn, or Block. Includes a 429 retry line, a fail-open or fail-closed choice for 402, and a credits worksheet.

Disposable addresses are not accepted. Yes, we check with our own API.

Nothing is emailed to you automatically. The checklist opens on this page as soon as you send the form. We do not sell your data. Privacy policy.