# Check if an e-mail address has a Gmail account

> Check in bulk whether gmail.com and googlemail.com addresses have a Gmail account. Yes, no or unknown per address; unknowns are free.

Canonical: https://mobilevalidate.com/services/gmail-email-check · Last updated: 2026-09-25

![An e-mail envelope routed to mail servers found in DNS; two mailboxes are confirmed and one answer is unknown.](https://mobilevalidate.com/images/email-mailbox-verification.svg)

*E-mail checks look up the domain's mail servers, then whether the mailbox exists.*


The Gmail check answers whether an e-mail address has a Gmail account. It is meant for `gmail.com` and `googlemail.com` addresses and runs in bulk jobs. Each address gets `registered: true`, `false` or `null` (unknown), with the time we checked. We never send mail to the address, open the mailbox or return anything about the account holder.

## What does the Gmail check tell you?

It tells you whether Google has a Gmail account at the address, exactly as written. That is the right question for lists and sign-up data where Gmail makes up a large share of consumer addresses.

- `registered: true`: a Gmail account exists at this address.
- `registered: false`: a conclusive "no account".
- `registered: null`: no conclusive answer (`status` and `reason` say why), and you are not charged.

Two Gmail behaviours matter here. Google's help center explains that Gmail ignores dots in the part before the `@` (`j.doe` and `jdoe` reach the same inbox) and that `name+tag@gmail.com` delivers to `name@gmail.com`. We deliberately do **not** rewrite addresses. We only trim and lowercase them. So `j.doe@gmail.com` and `jdoe@gmail.com` are separate rows and are not treated as duplicates. If you want one row per inbox, collapse the spellings before you send them.

## Who uses it, and why?

Gmail is used by consumers worldwide, so fake and mistyped Gmail addresses show up in almost every sign-up funnel.

- **Cleaning sign-up and CRM data.** A batch run over last month's sign-ups shows which Gmail addresses never existed. Those are usually typos, or accounts created with invented addresses. See [OTP and sign-up fraud](/use-cases/otp-and-signup-fraud).
- **Deliverability before a transactional send.** Removing Gmail addresses without an account prevents hard bounces, which count against your sender reputation with large mailbox providers.
- **Lead scoring.** A lead with a real Gmail address is more likely to be reachable. A non-existent one is usually not worth a follow-up. See [lead verification](/use-cases/lead-verification).

`googlemail.com` still appears in older records. Google used it in some countries, notably Germany and the UK, while it could not use the Gmail name there. Both domains reach Gmail, so both belong in the same check. For a real-time answer at sign-up, use the [mailbox check](/services/email-verification).

## What do you get back?

Every address becomes a row with `kind: "email"` and one entry per check in `checks`.

| Field | Type | Meaning |
|---|---|---|
| `email` | string or null | Normalized address (trimmed, lowercased); `null` when invalid |
| `email_status` | enum | `valid`, `invalid_email`, `duplicate` or `suppressed` |
| `checks["gmail.email"].registered` | boolean or null | `true` account exists, `false` none, `null` unknown |
| `…status` | enum | `completed`, `pending`, `unknown`, `unsupported_country` or `failed` |
| `…reason` | string or null | Why an answer is not conclusive, e.g. `UPSTREAM_TIMEOUT` |
| `…confidence`, `…checked_at` | enum, timestamp | How sure the answer is, and when it was obtained |
| `…cached`, `…billed` | boolean | Cache hit, and whether it was charged |

In job results and downloads, the input is masked (`re•••@test.mobilevalidate.com`). CSV and NDJSON downloads add `gmail.email.status`, `gmail.email.registered` and `gmail.email.billed` columns.

## How is it billed?

You pay the bulk price per address, only for conclusive answers. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). `POST /v1/jobs/estimate` is free. It shows how many rows are valid, invalid, duplicate or already cached, and the most the job could cost. Pass that figure as `max_cost` to cap the job. See [pricing](/pricing).

Repeat checks of the same address inside the freshness window can come from your account's cache. Cache hits are free (`cached: true, billed: false`).

## What are the limits?

The Gmail check is **bulk only**. `POST /v1/lookup` refuses it with `403 service_disabled` ("The check 'gmail.email' is available in bulk jobs only (POST /v1/jobs)."). A job holds up to 50,000 numbers and e-mails. You can send them as JSON `emails`, or as a CSV upload with an `email` column.

- Up to 20 checks per request. The total of identifiers × applicable checks is capped at 100,000 per job.
- Requests that look like sequential number ranges or generated e-mail lists are rejected. Twenty or more addresses in one request whose local parts differ only by digits or separators are refused with `suspected_enumeration`. `googlemail.com` counts as `gmail.com` for this rule. Live keys are also limited to 50 addresses of one such pattern per account per UTC day.
- The daily cap counts e-mail addresses like phone numbers (see `GET /v1/limits`).
- Job data is kept for 30 days by default, and you can purge a job earlier with `DELETE /v1/jobs/{id}`.

## How do I use it responsibly?

Check addresses people gave you: customers, sign-ups and leads who asked to be contacted. We never read mailboxes or send e-mail to the address. The answer is yes, no or unknown, and never includes a name, avatar or profile.

Don't generate address variations to find out whether someone has a Gmail account, and don't build lists for unsolicited mail. The [acceptable use policy](/legal/acceptable-use) forbids both. Anyone can object to having their address checked through the [opt-out form](/opt-out). Suppressed addresses are skipped and never charged.

## Example request

Test keys return fixed answers for addresses on `test.mobilevalidate.com` (see [test mode](/docs/test-mode)). This job checks one registered address, one unregistered address and one address that answers unknown.

```bash
curl https://api.mobilevalidate.com/v1/jobs \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: gmail-demo-001" \
  -d '{"emails": ["registered@test.mobilevalidate.com", "not-registered@test.mobilevalidate.com", "unknown@test.mobilevalidate.com"], "checks": ["gmail"]}'
# then: GET /v1/jobs/{id}?wait=30 and GET /v1/jobs/{id}/results
```

Response of `GET /v1/jobs/{id}/results` (excerpt, test mode: the first item of `data`):

```json
{
  "kind": "email",
  "input": "re•••@test.mobilevalidate.com",
  "email": "registered@test.mobilevalidate.com",
  "email_status": "valid",
  "e164": null,
  "country": null,
  "checks": {
    "gmail.email": {
      "service": "gmail.email",
      "status": "completed",
      "registered": true,
      "attributes": null,
      "confidence": "high",
      "confidence_score": 0.99,
      "checked_at": "2026-09-25T14:25:31.513Z",
      "cached": false,
      "age_seconds": 0,
      "billed": false,
      "reason": null,
      "poll_after_ms": null
    }
  },
  "test": true
}
```

## Frequently asked questions

### Does the check send an e-mail or sign in to the account?

No. Nothing is sent to the address and no mailbox is opened. The check only answers whether a Gmail account exists for the address: yes, no or unknown.

### Gmail ignores dots in addresses. Do you merge j.doe@gmail.com and jdoe@gmail.com?

No. We only trim spaces and lowercase the address. Each address is checked as you sent it, so two spellings are two rows. If you want to merge them, normalize them yourself before sending.

### Why is the Gmail check only available in bulk jobs?

The Gmail check is offered in bulk jobs only for now. Send it with POST /v1/jobs. For a real-time answer at sign-up, use the mailbox check (email). GET /v1/services always shows the current modes.

### Does googlemail.com count as Gmail?

Yes, both domains are Gmail. For anti-enumeration, googlemail.com addresses are grouped with gmail.com addresses, so splitting a generated list across the two domains does not get around the limit.

### What happens to addresses that are not on Gmail?

The check is meant for gmail.com and googlemail.com addresses. Answers for other domains may be unknown, and unknown answers are not charged.

## Service code and modes

- Code: `gmail.email` (input: e-mail address)
- Modes: bulk only · worldwide

## Price (live)

- Realtime: not available (bulk only)
- Bulk (POST /v1/jobs): $0.0008 per check ($0.80 per 1,000)
- You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate).

## Response fields (from the public catalog)

| Field | Type | Meaning |
|---|---|---|
| registered | boolean or null | true = found, false = not found, null = unknown (not charged) |
| status | enum | completed, pending, unknown, unsupported_country, failed |
| checked_at | timestamp | When the answer was obtained |

_Platform and brand names are used only to describe which service a check refers to. MobileValidate is not affiliated with, endorsed by or sponsored by any of these companies; all trademarks belong to their owners._
