# Check if a phone number has an X (Twitter) account

> Check in real time whether an X (formerly Twitter) account is associated with a phone number. Yes, no or unknown; unknown results are free.

Canonical: https://mobilevalidate.com/services/x-twitter-number-check · Last updated: 2026-09-25

![A phone number checked against a grid of generic account tiles, each marked registered, not registered or unknown.](https://mobilevalidate.com/images/account-presence-check.svg)

*Account checks say whether an account exists. They never say whose it is.*


The X check indicates whether an account on X, the platform formerly called Twitter, is associated with a phone number. It answers `registered: true`, `false` or `null` (unknown) with the time of the check. It runs in real time and in bulk jobs, for numbers from any country, and returns no handle, name, photo or post.

## What does the X check tell you?

It tells you whether the phone number is linked to an X account. On X the phone number is optional. People can register with an e-mail address and add a number later to sign in, recover the account or pass a security check. A `true` answer means an account is associated with the number now.

- `registered: true`: an X account is associated with the number.
- `registered: false`: a conclusive "no".
- `registered: null`: no conclusive answer (`status`, `reason`). You are not charged.

Two platform changes affect how you should read the answer. Twitter was renamed X in July 2023. Aliases `x` and `twitter` therefore both work, and older integrations that send `twitter` keep running. And since 20 March 2023, text-message two-factor authentication has been available only to paying subscribers (X/Twitter announcement, February 2023). Fewer people have a reason to attach a number than before, so a `false` answer is common and fairly neutral.

## Who uses it, and why?

Teams use the X check as a supporting signal for account security and sign-up quality, usually in a multi-check with other platforms.

- **Account-security reviews.** When a user changes the phone number on their account with you, a number with some history on large platforms is a mildly reassuring sign. A number with no footprint anywhere may deserve a second look. See [account security](/use-cases/account-security).
- **Sign-up protection.** Together with [Instagram](/services/instagram-number-check), [Facebook](/services/facebook-number-check) and a [carrier lookup](/services/carrier-lookup), it helps separate numbers people actually use from numbers set up for a single sign-up.
- **Data hygiene.** Along with other checks, it helps you judge whether old contact numbers you are allowed to process are still in use.

If you collect e-mail addresses rather than numbers, the [X e-mail check](/services/x-twitter-email-check) answers the same question for an address. It runs in bulk jobs only.

## What do you get back?

Each number gets one result under `checks["x.registered"]`, with no extra attributes.

| Field | Type | Meaning |
|---|---|---|
| `registered` | boolean or null | `true` account associated, `false` none, `null` unknown |
| `status` | enum | `completed`, `pending`, `unknown`, `unsupported_country` or `failed` |
| `confidence` / `confidence_score` | enum / 0–1 | How sure the answer is; `null` when not conclusive |
| `checked_at` | timestamp | When the answer was obtained |
| `cached` / `age_seconds` | boolean / integer | Served from your account's cache, and its age |
| `billed` | boolean | Whether this check was charged |
| `reason` | string or null | Why an answer is not conclusive |

## How is it billed?

You pay per number checked, and only for conclusive answers. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). Real-time and bulk checks are priced separately. See [pricing](/pricing). Cache hits inside the freshness window are free, and `max_age: 0` forces a fresh, billed check.

## What are the limits?

The X check runs in real time (`POST /v1/lookup`, up to 100 identifiers) and in bulk jobs (`POST /v1/jobs`, up to 50,000 per job), for numbers from every country.

- A request can hold up to 20 checks. Numbers × checks is capped at 2,000 per lookup and 100,000 per job.
- Requests that look like sequential number ranges or generated e-mail lists are rejected (`suspected_enumeration`).
- A daily cap per account applies (`GET /v1/limits`).
- Invalid, duplicate and suppressed numbers are reported per row and never checked.

## How do I use it responsibly?

X is widely used under pseudonyms, and people have good reasons for that. Never use this check to link a number to a pseudonymous account or to find out who is behind one. We don't support that: there are no reverse lookups, and the answer is only yes, no or unknown. Check only numbers you have a lawful reason to process. The [acceptable use policy](/legal/acceptable-use) forbids stalking, harassment, profiling and unsolicited messaging. Anyone can object at [/opt-out](/opt-out).

## Example request

With a test key, `+447700900001` answers "registered". See [test mode](/docs/test-mode).

```bash
curl https://api.mobilevalidate.com/v1/lookup \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+447700900001"], "checks": ["x"]}'
```

Response (excerpt, test mode: the first item of `results`):

```json
{
  "kind": "phone",
  "input": "+447700900001",
  "e164": "+447700900001",
  "country": "GB",
  "number_status": "valid",
  "checks": {
    "x.registered": {
      "service": "x.registered",
      "status": "completed",
      "registered": true,
      "attributes": null,
      "confidence": "high",
      "confidence_score": 0.99,
      "checked_at": "2026-09-25T14:25:30.665Z",
      "cached": false,
      "age_seconds": 0,
      "billed": false,
      "reason": null,
      "poll_after_ms": null
    }
  },
  "test": true
}
```

## Frequently asked questions

### Should I use the code x or twitter?

Either one. Both aliases map to the service code x.registered. Results always use the full code, so they appear under checks["x.registered"].

### Why do many X accounts have no phone number?

X accepts sign-up with an e-mail address, and adding a phone number is optional. Since March 2023, text-message two-factor authentication has been limited to paying subscribers, so fewer accounts need a number for 2FA.

### Does the check reveal the X handle?

No. It only indicates whether an X account is associated with the number. Handles, names, photos and posts are never returned.

### Can I check e-mail addresses for X accounts?

Yes, with the separate x.email service. It runs in bulk jobs only (POST /v1/jobs), while this phone check also works in real time.

### Can I use this to find out who is behind an anonymous account?

No. There are no reverse lookups: we never map a number to an account or an account to a person. The acceptable use policy forbids de-anonymisation, stalking and harassment.

## Service code and modes

- Code: `x.registered` (input: phone number)
- Modes: realtime and bulk · worldwide

## Price (live)

- Realtime (POST /v1/lookup): $0.0003 per check ($0.30 per 1,000)
- Bulk (POST /v1/jobs): $0.00015 per check ($0.15 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._
