# 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.

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

![A phone with chat bubbles; one messaging-app check says registered, another is unknown.](https://mobilevalidate.com/images/messaging-app-registration-check.svg)

*Messaging-app checks answer registered, not registered or unknown, with the time we checked.*


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](/services/whatsapp-number-check) and [Telegram](/services/telegram-number-check) results, raises confidence that the number belongs to a real, active phone. See [OTP and sign-up fraud](/use-cases/otp-and-signup-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.

| Field | Type | Meaning |
|---|---|---|
| `registered` | boolean or null | `true` account found, `false` none found, `null` unknown |
| `status` | enum | `completed`, `pending`, `unknown`, `unsupported_country` or `failed` |
| `confidence` / `confidence_score` | enum / 0–1 | How sure the answer is |
| `checked_at` | timestamp | When the answer was obtained |
| `cached` / `age_seconds` / `billed` | boolean / integer / boolean | Cache and billing details |
| `reason` | string or null | Why 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](/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](/docs/webhooks), then page through results or download them. See [bulk jobs](/docs/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](/legal/acceptable-use) forbids stalking, profiling individuals and scanning number ranges. People can object to checks through the [opt-out form](/opt-out).

## Example request

Test jobs finish at once. The first three test numbers answer registered, not registered and unknown. See [test mode](/docs/test-mode).

```bash
curl https://api.mobilevalidate.com/v1/jobs \
  -H "Authorization: Bearer $MOBILEVALIDATE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: signal-demo-001" \
  -d '{"numbers": ["+447700900001", "+447700900002", "+447700900003"], "checks": ["signal"]}'
# then: GET /v1/jobs/{id}?wait=30 and GET /v1/jobs/{id}/results
```

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
}
```

## 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.

## Service code and modes

- Code: `signal.registered` (input: phone number)
- Modes: bulk only · worldwide

## Price (live)

- Realtime: not available (bulk only)
- Bulk (POST /v1/jobs): $0.0003 per check ($0.30 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._
