# Phone Number Validator (`sfoln/phone-validator`)

Validate and format phone numbers in bulk with Google's libphonenumber: valid or possible, E.164, international and national formats, country, calling code and number type (mobile, landline, VoIP). $0.80 per 1,000 numbers; non-numbers are free. Optional live carrier lookup.

- Family: Company & lead intelligence
- Categories: Lead generation, Developer tools, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Phone Number Validator (sfoln/phone-validator)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/phone-validator.json
- MCP: https://mcp.apify.com?tools=sfoln/phone-validator
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~phone-validator/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~phone-validator/runs

Phone Number Validator validates, normalizes and classifies phone numbers in bulk. For each number you get valid / possible, the E.164, international and national formats, the country, the calling code and the number type (mobile, fixed line, toll-free, VoIP…). Validation runs offline on Google's libphonenumber metadata, so it is fast and cheap: ideal for cleaning CRM exports, sign-up forms and lead lists, and for AI agents that need a normalized number before calling or texting. An optional carrier lookup adds the carrier name and line type from a live carrier database.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Validated phone number (`phone-validated`) | $0.0008 | $0.80 / 1,000 | Charged once per phone number that could be parsed and validated (valid or invalid verdict, formats, country, type). |
| Carrier lookup (`phone-carrier-lookup`) | $0.005 | $5 / 1,000 | Charged once per valid number for which the optional live carrier lookup succeeded (carrier name, line type, region). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~phone-validator/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phones":["+1 650-253-0000","+44 20 7946 0958","030 901820"],"defaultCountry":"DE"}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/phone-validator"
    }
  }
}
```

Example prompt: Validate these phone numbers and give me each one in E.164 format with its country and number type: +1 650-253-0000, +44 20 7946 0958 and the German number 030 901820.

## Input

Paste phone numbers (one per line) in any common format. Each number produces one dataset record with validity, formats, country and number type.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `phones` (required) | array | — | Phone numbers: Phone numbers in international (+44 20 7946 0958) or national format (national numbers need a default country), one per line; commas and semicolons stay part of the number (e.g. ;ext=123). The same number written in different formats is processed once. Objects with a `phone` field are accepted too. Accounts on the Apify free plan can process up to 10 phone numbers per run. |
| `defaultCountry` | string | — | Default country: ISO 3166-1 alpha-2 code (e.g. US, GB, DE) used for numbers written without a +country prefix. |
| `carrierLookup` | boolean | `false` | Carrier lookup (extra charge): Also look up the carrier name, line type and region for each valid number via a live carrier database. Charged as a separate event per successful lookup. Paid add-on: turned off on the Apify free plan (records carry a warning). |
| `maxNumbers` | integer | `10000` | Max numbers: Safety cap on the number of phone numbers processed in this run. |
| `concurrency` | integer | `10` | Concurrency: Parallel workers (matters only with carrier lookup). |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the raw carrier-lookup payload (only with carrier lookup). |

Example input:

```json
{
  "phones": [
    "+1 650-253-0000",
    "+44 20 7946 0958",
    "030 901820"
  ],
  "defaultCountry": "DE"
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | Input: The phone number as submitted. |
| `isValid` | boolean | Valid: Number matches an assigned numbering range for its country. |
| `isPossible` | boolean | Possible: Length is plausible for the country (weaker than valid). |
| `e164` | string | E.164 |
| `international` | string | International format |
| `national` | string | National format |
| `rfc3966` | string | tel: URI |
| `countryCode` | string | Calling code |
| `country` | string | null | Country (ISO2) |
| `nationalNumber` | string | National number |
| `extension` | string | null | Extension |
| `numberType` | string | null | Number type: MOBILE, FIXED_LINE, FIXED_LINE_OR_MOBILE, TOLL_FREE, PREMIUM_RATE, SHARED_COST, VOIP, PERSONAL_NUMBER, PAGER, UAN, VOICEMAIL or null. |
| `carrierHint` | null | Carrier hint: Always null: offline validation does not include the carrier. Use carrierLookup. |
| `carrier` | string | null | Carrier: Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged. |
| `carrierLineType` | string | null | Carrier line type: Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged. |
| `carrierRegion` | string | null | Carrier region: Only with carrierLookup (paid plans); null when the lookup was skipped, failed or could not be charged. |
| `carrierLookupCharged` | boolean | Carrier lookup charged: True when the phone-carrier-lookup event was charged for this number. |
| `status` | string | Status: ok \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged |
| `source` | string | Source |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "input": "+44 20 7946 0958",
  "isValid": true,
  "isPossible": true,
  "e164": "+442079460958",
  "international": "+44 20 7946 0958",
  "national": "020 7946 0958",
  "rfc3966": "tel:+442079460958",
  "countryCode": "44",
  "country": "GB",
  "nationalNumber": "2079460958",
  "extension": null,
  "numberType": "FIXED_LINE",
  "carrierHint": null,
  "status": "ok",
  "charged": true,
  "chargedEvent": "phone-validated",
  "source": "libphonenumber",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## Related

- [Email Validator – MX & Disposable Check](https://www.sfoln.com/actors/email-validator.md) (`sfoln/email-validator`)
- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [Google Maps Leads Scraper + Emails](https://www.sfoln.com/actors/google-maps-business-leads.md) (`sfoln/google-maps-business-leads`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
