# Check if a phone number is registered for iMessage

> Check in bulk whether phone numbers are registered for Apple's iMessage, which indicates use on an Apple device. Unknown answers are free.

Canonical: https://mobilevalidate.com/services/imessage-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 iMessage check tells you whether phone numbers are registered for iMessage, Apple's messaging service. Because iMessage exists only on Apple devices, a registered number almost always means an iPhone. The check runs in bulk jobs, returns `registered: true`, `false` or `null` (unknown) per number, and sends nothing to anyone.

## What does the iMessage check tell you?

It answers whether the number is registered for iMessage. Apple introduced iMessage in 2011. When someone activates an iPhone with a SIM, iMessage normally registers that phone number, and it can also register e-mail addresses from the person's Apple Account. Messages between registered users go through Apple. Messages to anyone else fall back to SMS, and since iOS 18 in 2024 also to RCS.

- `registered: true`: the number is registered for iMessage on an Apple device.
- `registered: false`: a conclusive answer that it is not registered.
- `registered: null`: no conclusive answer, not charged.

This is a device-platform signal, not only a "has an app" signal. Nobody installs iMessage separately and there is no Android version. So `true` is strong evidence of an Apple device and `false` is common for Android users. One caveat: registration can survive a move to Android until the person deregisters the number, which Apple lets people do online.

## Who uses it, and why?

- **Choosing the fallback path.** A message to an iPhone user without iMessage-level features lands as SMS or RCS. Knowing the device platform helps teams decide between [RCS](/services/rcs-capability-check), SMS and app push for messages customers opted into. See [channel selection](/use-cases/channel-selection).
- **Rich-link and media planning.** Marketing and product teams sometimes segment their opted-in audience by device platform before choosing message formats, for example whether media will render inline.
- **Fraud signals.** Numbers from SIM farms and virtual number services are rarely activated on iPhones. A number presented as a personal mobile that shows iMessage registration is consistent with that claim. It is useful next to a [carrier lookup](/services/carrier-lookup) and the [Apple ID check](/services/apple-id-number-check).

## What do you get back?

Each job row carries `checks["imessage.registered"]`; there are no extra attributes.

| Field | Type | Meaning |
|---|---|---|
| `registered` | boolean or null | `true` registered, `false` not registered, `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 |

## 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). Use the free `POST /v1/jobs/estimate` to see the maximum cost first, and set `max_cost` to cap the job. See [pricing](/pricing).

Numbers your account checked recently can be answered from its cache without charge. `max_age: 0` forces fresh, billed checks.

## What are the limits?

iMessage runs in bulk jobs only. `POST /v1/lookup` answers `403 service_disabled` with "The check 'imessage.registered' is available in bulk jobs only (POST /v1/jobs)."

- Up to 50,000 numbers and e-mails per job, up to 20 checks per request, 100,000 number × check pairs per job.
- All countries are accepted; registration is most common where iPhones have a large share of the market.
- Requests that look like sequential number ranges or generated e-mail lists are rejected.
- A daily number cap applies per account. Track progress with `GET /v1/jobs/{id}?wait=30` or a [webhook](/docs/webhooks).

## How do I use it responsibly?

Device platform is personal information. Check only numbers of people who gave them to you, and use the result to deliver messages they expect in a format that works. Don't use it to profile or target individuals, and don't treat it as a proxy for income or any other personal trait. Our [acceptable use policy](/legal/acceptable-use) forbids unsolicited messaging, profiling and range scanning. People can object to checks via the [opt-out form](/opt-out).

## Example request

In test mode the job completes at once. `+447700900001` answers registered, `…002` not registered and `…003` 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: imessage-demo-001" \
  -d '{"numbers": ["+447700900001", "+447700900002", "+447700900003"], "checks": ["imessage"]}'
# then: GET /v1/jobs/{id}?wait=30 and GET /v1/jobs/{id}/results
```

Job (excerpt, test mode):

```json
{
  "object": "job",
  "id": "job_0VWF4kDgF4FJ2IXyZNL8",
  "status": "completed",
  "livemode": false,
  "checks": [
    "imessage.registered"
  ],
  "created_at": "2026-09-25T14:25:29.753Z",
  "completed_at": "2026-09-25T14:25:29.756Z",
  "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": {
    "imessage.registered": {
      "service": "imessage.registered",
      "status": "completed",
      "registered": true,
      "attributes": null,
      "confidence": "high",
      "confidence_score": 0.99,
      "checked_at": "2026-09-25T14:25:29.756Z",
      "cached": false,
      "age_seconds": 0,
      "billed": false,
      "reason": null,
      "poll_after_ms": null
    }
  },
  "test": true
}
```

## Frequently asked questions

### Does an iMessage registration mean the person has an iPhone?

It means the number has been registered for iMessage on an Apple device, which is almost always an iPhone. It does not tell you whether that device is still in use.

### Why might a number that moved to Android still show as registered?

iMessage registration can outlast the switch until it is removed. Apple offers a way to deregister a number for exactly this reason. Until then, the number can still appear as registered.

### Can my business start iMessage conversations after the check?

No. Apple's business messaging is designed so that customers start the conversation. The check helps you understand your customers' devices; it does not open an outbound channel.

### Why is iMessage bulk only?

iMessage answers are gathered in batches, so the check runs in POST /v1/jobs. POST /v1/lookup refuses it with service_disabled.

### Is anything sent to the number?

No. No message is sent and the person is not notified by us.

## Service code and modes

- Code: `imessage.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._
