RealtimeBulkPhone input

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.

Last updated

checks: ["x.registered"]
A phone number checked against a grid of generic account tiles, each marked registered, not registered or unknown.A phone number checked against a grid of generic account tiles, each marked registered, not registered or unknown.

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.
  • Sign-up protection. Together with Instagram, Facebook and a 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 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.

FieldTypeMeaning
registeredboolean or nulltrue account associated, false none, null unknown
statusenumcompleted, pending, unknown, unsupported_country or failed
confidence / confidence_scoreenum / 0–1How sure the answer is; null when not conclusive
checked_attimestampWhen the answer was obtained
cached / age_secondsboolean / integerServed from your account's cache, and its age
billedbooleanWhether this check was charged
reasonstring or nullWhy 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. 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 forbids stalking, harassment, profiling and unsolicited messaging. Anyone can object at /opt-out.

Example request

With a test key, +447700900001 answers "registered". See test mode.

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

Runs as pasted with the public sandbox key, which answers the test values only. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

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
}

Try it now

Realtime lookup via POST /v1/lookup. Every example runs as pasted: it uses the public sandbox key, which answers the test values for free. In the SDKs, omit the key to use MOBILEVALIDATE_API_KEY.

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

Real test-mode result for this check

checks["x.registered"]
{
  "service": "x.registered",
  "status": "completed",
  "registered": true,
  "attributes": null,
  "confidence": "high",
  "confidence_score": 0.99,
  "checked_at": "2026-09-25T14:25:28.979Z",
  "cached": false,
  "age_seconds": 0,
  "billed": false,
  "reason": null,
  "poll_after_ms": null
}

What you get

Fields of checks["x.registered"], generated from the public service catalog.

FieldTypeMeaning
registeredboolean | nulltrue = found, false = not found, null = unknown (not charged).
statusenumcompleted, pending, unknown, unsupported_country or failed.
checked_attimestampWhen the answer was obtained.

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.

Add X (Twitter) number check to your stack

Request access to MobileValidate. Start in test mode, go live when you are ready.