BulkPhone input

Check if a phone number is registered on Signal

Check in bulk whether phone numbers have a Signal account. Yes, no or unknown per number; you are only charged for conclusive answers.

Last updated

checks: ["signal.registered"]
A phone with chat bubbles; one messaging-app check says registered, another is unknown.A phone with chat bubbles; one messaging-app check says registered, another is unknown.

The Signal check tells you whether phone numbers in a list have a Signal account. It runs in bulk jobs only and answers registered: true, false or null (unknown) per number, with the time of the check. It covers numbers from every country, sends nothing to anyone and returns no username or profile data.

What does the Signal check tell you?

It answers whether a Signal account can be associated with the number. Signal still requires a phone number to create an account, confirmed by a code. Since early 2024, Signal has also offered usernames, hidden phone numbers by default, and added a setting that lets people choose whether anyone can find them by their number.

  • registered: true: an account is associated with the number and discoverable through it.
  • registered: false: a conclusive answer that no discoverable account exists for the number.
  • registered: null: no conclusive answer; not charged.

Because people can switch off discovery by number, a false means "not findable through this number" rather than "this person has never used Signal". Signal is run by a non-profit foundation and collects very little data about its users, so there is less to observe than on other platforms. Expect a higher share of false and unknown answers than for WhatsApp.

Who uses it, and why?

Signal is not a marketing or customer-service channel. It has no business messaging API. Its value in our catalog is as evidence that a number is in real use.

  • Sign-up and OTP fraud screening. Numbers bought in bulk to open fake accounts are rarely set up on several privacy-focused messengers. A Signal account, along with WhatsApp and Telegram results, raises confidence that the number belongs to a real, active phone. See OTP and sign-up fraud.
  • List hygiene. Batch-checking an older contact list for messenger presence helps flag numbers that seem to have gone dead since collection.
  • Research on your own customers. Product teams sometimes want to know which messengers their opted-in users have, in aggregate, before adding a channel.

What do you get back?

Each row of the job carries checks["signal.registered"]. There are no extra attributes.

FieldTypeMeaning
registeredboolean or nulltrue account found, false none found, null unknown
statusenumcompleted, pending, unknown, unsupported_country or failed
confidence / confidence_scoreenum / 0–1How sure the answer is
checked_attimestampWhen the answer was obtained
cached / age_seconds / billedboolean / integer / booleanCache and billing details
reasonstring or nullWhy the answer is not conclusive

Downloads (CSV or NDJSON) add signal.registered.status, signal.registered.registered and signal.registered.billed columns.

How is it billed?

Per number, for conclusive answers only, at the bulk price. You're not charged for inconclusive results (unknown, unsupported country, timeout, invalid, duplicate). The job reserves the maximum possible cost when it starts and releases what is not used when it finishes. Call POST /v1/jobs/estimate first to see the maximum cost for free. See pricing.

Numbers checked recently by your account can be answered from its cache at no cost. max_age: 0 forces fresh, billed checks.

What are the limits?

Signal runs in bulk jobs only. POST /v1/lookup refuses it with 403 service_disabled ("The check 'signal.registered' is available in bulk jobs only (POST /v1/jobs).").

  • Up to 50,000 numbers and e-mails per job, 20 checks per request, and 100,000 number × check pairs per job.
  • Results arrive as the job progresses. Follow GET /v1/jobs/{id}?wait=30 or a job.completed webhook, then page through results or download them. See bulk jobs.
  • Requests that look like sequential number ranges or generated e-mail lists are rejected.
  • A daily number cap applies per account.

How do I use it responsibly?

People choose Signal for privacy, and many turn off discovery by number on purpose. Check only numbers you hold for a legitimate reason, such as your own users or applicants, and never to find out whether a specific person uses Signal. Our acceptable use policy forbids stalking, profiling individuals and scanning number ranges. People can object to checks through the opt-out form.

Example request

Test jobs finish at once. The first three test numbers answer registered, not registered and unknown. See test mode.

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

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.

Job (excerpt, test mode):

JSON
{
  "object": "job",
  "id": "job_0VWF4kBdVZK0W6fJs7sS",
  "status": "completed",
  "livemode": false,
  "checks": [
    "signal.registered"
  ],
  "created_at": "2026-09-25T14:25:29.625Z",
  "completed_at": "2026-09-25T14:25:29.628Z",
  "progress": {
    "total": 3,
    "checks_total": 3,
    "done": 3,
    "conclusive": 2,
    "non_billable": 3
  },
  "retention_days": 30
}

First row from GET /v1/jobs/{id}/results (test mode):

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

Try it now

Bulk-only service: create a job via POST /v1/jobs, then read GET /v1/jobs/{id}/results. 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/jobs \
  -H "Authorization: Bearer mv_test_publicSandboxn9ZgneuhR1B9CRfKG3fulym" \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+447700900001"],"checks":["signal.registered"]}'

Real test-mode result for this check

checks["signal.registered"]
{
  "service": "signal.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["signal.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

Why is the Signal check only available in bulk jobs?

Signal answers are gathered in batches, so the service runs in POST /v1/jobs rather than POST /v1/lookup. A real-time request for signal is refused with service_disabled and a message pointing to bulk jobs.

Signal users can turn off discovery by phone number. What happens then?

Signal lets people choose that nobody can find them by their number. Such accounts cannot be confirmed through the number, so the check may answer not registered or unknown for them.

Can I message Signal users from my business after the check?

Signal does not offer a business messaging API, so the check is not a way to open a business channel. It is more useful as a sign that a number is in active use on a smartphone.

Does the check reveal the Signal username?

No. Only whether an account can be associated with the number. Usernames, names and profile photos are never returned.

Add Signal number check to your stack

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