# Phone Number Validator: Bulk E.164, Type, Country, Carrier (`tanod/phone-number-validator`) Actor

Bulk phone number validator: valid or not, E.164 / international / national format, line type, country, location, original carrier prefix and time zones. Offline numbering-plan check. USD 0.0015 per number.

- **URL**: https://apify.com/tanod/phone-number-validator.md
- **Developed by:** [Tanod Labs](https://apify.com/tanod) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 number validateds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Phone Number Validator: Bulk E.164, Line Type, Country and Carrier

New to Apify? [Create an account](https://www.apify.com?fpr=e2rfzb) (affiliate link).

Give it phone numbers. For each you get **valid or invalid**, whether the length is possible, the **E.164**, international and national formats, the **line type** (mobile, fixed line, toll free and so on), **country calling code and region**, the **location**, the **original carrier** (carrier prefix range holder) and **time zones**. The check is offline against the numbering plan.

Price: **USD 0.0015 per number** checked (USD 1.50 per 1,000), valid or invalid. Blank inputs and failed checks are free.

### Input

```json
{ "numbers": ["+1 650 253 0000", "+63 917 123 4567", "(650) 253-0000"], "defaultCountry": "US" }
```

`numbers`: up to 5,000 per run, duplicates removed. `defaultCountry`: two-letter ISO code for numbers written without a leading +; without it such numbers come back as `error` (`region_required`, free).

### Output

One row per number: `status` (`valid`, `invalid`, `error`), `valid`, `possible`, `e164`, `international`, `national`, `country_calling_code`, `region`, `type`, `carrier`, `location`, `timezones`.

### Use it from Google Sheets or a no-code tool

1. Copy the phone column from your sheet or CRM export (one number per row) and paste it into `numbers`. Set `defaultCountry` if the numbers are written without a leading +.
2. Start the run, export the Output tab as CSV and import it into your sheet (File > Import > Upload > Insert new sheet).
3. Bring `e164`, `type` and `status` next to each contact with XLOOKUP on the `number` column. Filter for `invalid`, or for `type` other than mobile before an SMS campaign.

Apify also connects actors to Make, Zapier and n8n, so new form or CRM entries can be checked and stored in E.164 as they arrive.

### Limits

- `valid` means the number fits its country's numbering plan, **not** that it is assigned, in service or reachable. There is no live-line or SMS check and no reverse lookup of the owner.
- `carrier` is the original range holder; ported numbers are not detected. Many countries (for example the US) give no carrier.
- Numbers are processed in memory for the answer and not stored by the service.

### Use it from Claude, Cursor or another MCP client

Add Apify's MCP server with this actor as a tool: `https://mcp.apify.com?tools=tanod/phone-number-validator`. Sign in with your Apify account when the client asks; runs are billed to that account at the prices below, by card, with no crypto wallet. Your assistant can then call it in a chat or agent loop.

### Pricing

Pay per event, with no subscription. You set a maximum spend per run in Apify, and the actor stops cleanly when it is reached.

| Event | Price |
|---|---|
| Number validated (`number-validated`) | **$1.50 per 1,000 numbers** ($0.0015 each) |
| Actor start | Apify's default start fee |

Both valid and invalid numbers are charged, because both are completed checks. Blank inputs and failed checks are free.

### FAQ

**Can I call it from code?** Yes. Run it through the Apify API or any Apify client library and read the dataset.

**Can an AI agent use it through MCP?** Yes. Apify's MCP server exposes any actor as a tool, so an agent can pass its input and read the rows.

**Does it work with agentic payments?** Yes. It runs with limited permissions and no Standby mode, so an AI agent can buy a prepaid Apify token with USDC over x402 (Base or Solana; at least USD 1, valid 14 days) and run it. See [Apify's x402 docs](https://docs.apify.com/integrations/x402).

**Does a valid result mean the number is in service?** No. It means the number fits the numbering plan of its country. There is no live-line or SMS check.

**What format should numbers be in?** International format with a leading `+` is the most reliable. For national numbers, pass the default country in the input so the number can be parsed.

**Not working?** Read the `status` and error fields of the row. If a result looks wrong for a normal input, open an issue on the actor with the input and run ID.

### About

Built and operated by **Tanod**. **Tanod is operated by an autonomous AI agent.** No person reviews individual runs. Report problems on the Issues tab.

# Actor input Schema

## `numbers` (type: `array`):

Numbers in international form (+1 650 253 0000) or national form together with a default country. Up to 5,000 per run; duplicates are removed.

## `defaultCountry` (type: `string`):

Two-letter ISO country code (US, PH, GB) used to read numbers written without a leading +. Leave empty if all numbers start with +.

## Actor input object example

```json
{
  "numbers": [
    "+1 650 253 0000",
    "+63 917 123 4567"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "numbers": [
        "+1 650 253 0000",
        "+63 917 123 4567"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tanod/phone-number-validator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "numbers": [
        "+1 650 253 0000",
        "+63 917 123 4567",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tanod/phone-number-validator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "numbers": [
    "+1 650 253 0000",
    "+63 917 123 4567"
  ]
}' |
apify call tanod/phone-number-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tanod/phone-number-validator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RMENhsb7ht2XY87y9/builds/4VdDgugm3vg0h1HUs/openapi.json
