# Phone Number Validator & Formatter (`jurassic_jove/phone-number-validator`) Actor

Validate, classify and format phone numbers in bulk from Apify datasets, CSV files and inline JSON. Offline validation (E.164, line type, country) — no scraping, no carrier APIs.

- **URL**: https://apify.com/jurassic\_jove/phone-number-validator.md
- **Developed by:** [Data Runner](https://apify.com/jurassic_jove) (community)
- **Categories:** Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 phone 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Phone Number Validator & Formatter — Bulk Validation, E.164 & Line Type

**Validate, classify and format thousands of phone numbers in one run.** Turn messy, scraped phone data — `(813) 555-0142`, `813.555.0142`, `0034 612 345 678`, `Call us!` — into clean, consistent, ready-to-dial numbers with E.164 formatting, country detection, and line-type classification (mobile vs landline vs VoIP). Built for **cold calling, SMS campaigns, WhatsApp outreach, CRM imports, and dialer prep**.

This is a **pure data processor**: 100% offline validation powered by a battle-tested phone-number library. No scraping, no proxies, no carrier-lookup APIs — so it never breaks and your data never leaves the run.

---

### Why validate phone numbers before you dial

A scraped phone list is full of landlines, typos, wrong-country numbers, and junk. Loading it straight into a dialer or SMS tool quietly burns money:

- **Stop wasting dialer minutes and agent time.** Auto-dialers and power dialers churn through every number. Invalid and unreachable numbers waste connection attempts and skew your contact rates. Filter them out first.
- **Don't pay to SMS a landline.** SMS and WhatsApp only work on mobile numbers. Texting a landline is a guaranteed failure you still pay for. Line-type classification tells you which numbers can actually receive a text.
- **Fix country-mixing bugs.** A `612 345 678` is a Spanish mobile or an invalid US number depending on context. This Actor applies the right country (per-record hint or a default) so a multi-country list is interpreted correctly.
- **Keep your CRM clean.** One consistent E.164 format (`+18135550142`) means no duplicate "same number, different format" records and clean imports into any CRM, dialer, or outreach platform.

---

### What it does

- ✅ **Validates in bulk** — every number gets a clear status: `valid`, `possible_but_unverified`, `invalid_format`, or `invalid_garbage`.
- ✅ **Formats consistently** — E.164, international, and national formats for every number.
- ✅ **Detects line type** — MOBILE, FIXED_LINE, FIXED_LINE_OR_MOBILE, VOIP, TOLL_FREE, PREMIUM_RATE.
- ✅ **Flags WhatsApp-likely numbers** — a `whatsappLikely` heuristic for mobile-capable lines (great for WhatsApp outreach).
- ✅ **Infers country** per number, with a per-record country hint (ISO code, English/Spanish name, or address) and a default-country fallback.
- ✅ **Cleans the junk** — strips `tel:`, extracts extensions (`ext. 12`), converts `00` international prefixes, ignores letters/emoji.
- ✅ **Handles arrays & many fields** — a record can have several phone fields and arrays of numbers; every one is processed.
- ✅ **Optional dedupe & filtering** — collapse records that share the same E.164, or drop records with no usable number.
- ✅ **Never crashes** on bad input — malformed rows, missing fields and exotic values are skipped, counted, and the run continues.

---

### How it works (3 steps)

1. **Point it at your data.** Apify dataset IDs from previous scraper runs, public CSV URLs, and/or inline JSON.
2. **Tell it where the phones and country live.** Auto-detect common phone fields or name them; set a default country and optionally a per-record country hint field.
3. **Run it.** Every record comes back enriched with a `phoneValidation` object, plus a summary breaking down valid/invalid counts by country and line type.

#### Input example 1 — Validate a previous scraper's dataset

```json
{
  "datasetIds": ["aBcD1234efGh5678"],
  "defaultCountry": "US",
  "countryHintField": "countryCode"
}
````

#### Input example 2 — Validate CSV files

```json
{
  "csvUrls": ["https://example.com/leads.csv"],
  "defaultCountry": "MX",
  "outputFormats": ["e164", "international"]
}
```

#### Input example 3 — Paste records directly (inline JSON)

```json
{
  "inlineRecords": [
    { "businessName": "Acme Plumbing", "phone": "(813) 555-0142 ext. 9", "countryCode": "US" },
    { "businessName": "Tacos El Sol", "phone": "55 1234 5678", "address": "Guadalajara, Mexico" },
    { "businessName": "London Cafe", "phones": ["+44 7400 123456", "020 7946 0958"] }
  ],
  "countryHintField": "countryCode",
  "dedupeByPhone": false,
  "dropInvalid": false
}
```

#### Input options

| Option | Type | Default | Description |
| --- | --- | --- | --- |
| `datasetIds` | string\[] | `[]` | Apify dataset IDs from previous runs. Invalid IDs are skipped with a warning. |
| `csvUrls` | string\[] | `[]` | Public CSV URLs. Tolerates BOM, `,` `;` tab `\|` delimiters, quoted fields. |
| `inlineRecords` | object\[] | `[]` | Raw records pasted as JSON. |
| `phoneFields` | string\[] | `[]` (auto) | Field names holding phones. Empty = auto-detect (`phone`, `mobile`, `phones`, ...). |
| `defaultCountry` | string | `US` | ISO country for numbers with no international prefix. |
| `countryHintField` | string | — | Field with a per-record country (ISO code, EN/ES name, or address). |
| `outputFormats` | string\[] | all | Any of `e164`, `international`, `national`. |
| `dropInvalid` | boolean | `false` | Exclude records whose numbers are all invalid (kept in summary). |
| `dedupeByPhone` | boolean | `false` | Collapse records sharing the same E.164 (keeps most complete). |

***

### Output

Every input record is preserved untouched and enriched with a `phoneValidation` object (keyed by the source field; an array when the field held multiple numbers).

#### Example — before → after

**Before (scraped):**

```json
{ "businessName": "Acme Plumbing", "phone": "(813) 555-0142 ext. 9", "countryCode": "US" }
```

**After (validated):**

```json
{
  "businessName": "Acme Plumbing",
  "phone": "(813) 555-0142 ext. 9",
  "countryCode": "US",
  "phoneValidation": {
    "phone": {
      "original": "(813) 555-0142 ext. 9",
      "status": "valid",
      "isValid": true,
      "e164": "+18135550142",
      "international": "+1 813 555 0142",
      "national": "(813) 555-0142",
      "country": "US",
      "countryName": "United States",
      "lineType": "FIXED_LINE_OR_MOBILE",
      "whatsappLikely": true,
      "extension": "9"
    }
  }
}
```

#### Run summary (key-value store → `OUTPUT`)

```json
{
  "totalInput": 18500,
  "withPhone": 17200,
  "noPhone": 1300,
  "phonesProcessed": 19100,
  "valid": 13520,
  "possibleButUnverified": 980,
  "invalid": 4600,
  "byCountry": { "US": 11000, "MX": 4200, "GB": 1800 },
  "byLineType": { "MOBILE": 9800, "FIXED_LINE": 5200, "TOLL_FREE": 300 },
  "duplicatesCollapsed": 0,
  "malformedRowsSkipped": 12,
  "runtimeSeconds": 14
}
```

***

### Works perfectly with the rest of the suite

This Actor is the **dial-ready** step in the Data Runner lead pipeline:

**scrape → deduplicate → verify emails → validate phones → outreach**

- **Google Maps Lead Generator Pro** — local business leads with phone numbers and addresses.
- **Lead Deduplicator & Merger** — merge and de-duplicate lists from multiple scrapers first.
- **Email Verifier & Enricher Pro** — clean the email side of the same list.
- **Website Email Extractor** — pull contact data from any website list.
- **Instagram / TikTok / YouTube Email Scrapers** — creator and business contacts.

Run your scrapers, dedupe and merge, verify the emails, then validate the phones here — and load a list that's truly ready to call and text.

***

### Pricing

Simple, transparent **pay-per-event** pricing:

- **$3.00 per 1,000 phone numbers processed** ($0.003 each).

You are billed per **phone number that reaches validation**, as work happens (so partial runs only bill for what was handled). Important details:

- A record with **3 phone numbers generates 3 charges** — you pay per number, not per record.
- **Invalid results are charged**, because the validation is the work performed (an "invalid" answer is still a useful answer).
- **Pure junk is NOT charged** — values with too few digits to be a phone, records with no phone field, and malformed CSV rows are free.

There is no per-run start fee.

***

### Honest limitations (read this)

Offline validation checks a number's **format, length, numbering-plan range, and line type**. It is fast, free of carrier fees, and private. What it **does not** do:

- It does **not** confirm the line is currently **active / in service** (no carrier HLR ping).
- It does **not** confirm a number is **registered on WhatsApp** — `whatsappLikely` is a line-type heuristic (mobile-capable), not a registration check.
- It does **not** detect number portability (a number ported to a different carrier or type).

For most outreach prep — filtering junk, separating mobiles from landlines, fixing formats and countries — offline validation is exactly what you need, without paying per-lookup carrier fees. If you need live line-status, pair this with a carrier-lookup service after pre-filtering here (it'll cost far less, because you've already removed the junk).

***

### FAQ

**Which countries are supported?**
All of them. The underlying numbering-plan metadata covers every country and territory. `defaultCountry` and the country-hint field control how local (non-`+`) numbers are interpreted.

**What does the default country actually do?**
It only affects numbers written **without** an international prefix (e.g. a local `813...`). Numbers that already start with `+` or `00` keep their own country regardless of the default.

**Can a record have multiple phone numbers?**
Yes. Multiple phone fields and arrays of numbers are both supported — every number is validated and you're billed per number.

**What happens to extensions?**
Extensions (`ext. 12`, `x12`, `#12`) are detected, removed before validation, and returned separately in the `extension` field.

**How does the country hint work?**
Point `countryHintField` at a field that holds a country — an ISO code (`MX`), an English or Spanish country name (`Mexico` / `México`), or even an address that contains a country name. It's used per record, falling back to `defaultCountry`.

**Which export formats can I get?**
Results land in a standard Apify dataset — export as **CSV, JSON, Excel, or HTML**.

**Is this GDPR/privacy-friendly?**
Validation is 100% offline — numbers are processed in your own run and never sent to any third-party service. You remain the data controller for your own lists; use them in line with applicable laws and the consent you've obtained.

**Will it crash on a messy file?**
No. Malformed rows, missing fields, arrays where strings were expected, and exotic values are skipped, counted in the summary, and the run continues. It only fails if there are zero processable records at all.

# Actor input Schema

## `datasetIds` (type: `array`):

IDs of Apify datasets from previous scraper runs (e.g. Google Maps, Yelp-style listings). All items are fetched with pagination. Invalid IDs are skipped with a warning.

## `csvUrls` (type: `array`):

Public URLs to CSV files. The parser tolerates a BOM, comma/semicolon/tab/pipe delimiters and quoted fields. Malformed rows are skipped and counted, never crashing the run.

## `inlineRecords` (type: `array`):

Raw records pasted directly as a JSON array of objects. The example below shows the format and is used for the daily health-check — replace it with your own data or clear it.

## `phoneFields` (type: `array`):

Names of the record fields that contain phone numbers. Leave EMPTY to auto-detect common fields (phone, phoneNumber, phones, mobile, tel, telephone, contactPhone, whatsapp, ...). Array fields are processed element by element.

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

ISO 3166-1 alpha-2 country code used to interpret numbers written WITHOUT an international prefix (e.g. a local '813...' number). Numbers that already start with '+' or '00' keep their own country.

## `countryHintField` (type: `string`):

Name of a record field that holds a per-record country (ISO code, or an English/Spanish country name, or an address containing one). Used before falling back to the Default country. Example: countryCode, country, address.

## `outputFormats` (type: `array`):

Which formatted versions of each number to include in the output.

## `dropInvalid` (type: `boolean`):

If ON, records whose phone numbers are all invalid (no valid or plausible number) are excluded from the output dataset. They are still counted in the summary. Records with no phone field are kept.

## `dedupeByPhone` (type: `boolean`):

If ON, records that share the same E.164 number are collapsed into one (the most complete record is kept, with a \_duplicateCount). Note: enabling this holds results in memory until the run finishes.

## Actor input object example

```json
{
  "datasetIds": [],
  "csvUrls": [],
  "inlineRecords": [
    {
      "businessName": "Acme Plumbing",
      "phone": "(813) 555-0142",
      "city": "Tampa",
      "countryCode": "US"
    },
    {
      "businessName": "Tacos El Sol",
      "phone": "55 1234 5678",
      "city": "Guadalajara, Mexico"
    },
    {
      "businessName": "London Cafe",
      "phones": [
        "+44 7400 123456",
        "020 7946 0958"
      ]
    },
    {
      "businessName": "No Phone Co",
      "city": "Austin"
    }
  ],
  "phoneFields": [],
  "defaultCountry": "US",
  "outputFormats": [
    "e164",
    "international",
    "national"
  ],
  "dropInvalid": false,
  "dedupeByPhone": false
}
```

# 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 = {
    "datasetIds": [],
    "csvUrls": [],
    "inlineRecords": [
        {
            "businessName": "Acme Plumbing",
            "phone": "(813) 555-0142",
            "city": "Tampa",
            "countryCode": "US"
        },
        {
            "businessName": "Tacos El Sol",
            "phone": "55 1234 5678",
            "city": "Guadalajara, Mexico"
        },
        {
            "businessName": "London Cafe",
            "phones": [
                "+44 7400 123456",
                "020 7946 0958"
            ]
        },
        {
            "businessName": "No Phone Co",
            "city": "Austin"
        }
    ],
    "phoneFields": [],
    "defaultCountry": "US",
    "countryHintField": "",
    "outputFormats": [
        "e164",
        "international",
        "national"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jurassic_jove/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 = {
    "datasetIds": [],
    "csvUrls": [],
    "inlineRecords": [
        {
            "businessName": "Acme Plumbing",
            "phone": "(813) 555-0142",
            "city": "Tampa",
            "countryCode": "US",
        },
        {
            "businessName": "Tacos El Sol",
            "phone": "55 1234 5678",
            "city": "Guadalajara, Mexico",
        },
        {
            "businessName": "London Cafe",
            "phones": [
                "+44 7400 123456",
                "020 7946 0958",
            ],
        },
        {
            "businessName": "No Phone Co",
            "city": "Austin",
        },
    ],
    "phoneFields": [],
    "defaultCountry": "US",
    "countryHintField": "",
    "outputFormats": [
        "e164",
        "international",
        "national",
    ],
}

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

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

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

```

## CLI example

```bash
echo '{
  "datasetIds": [],
  "csvUrls": [],
  "inlineRecords": [
    {
      "businessName": "Acme Plumbing",
      "phone": "(813) 555-0142",
      "city": "Tampa",
      "countryCode": "US"
    },
    {
      "businessName": "Tacos El Sol",
      "phone": "55 1234 5678",
      "city": "Guadalajara, Mexico"
    },
    {
      "businessName": "London Cafe",
      "phones": [
        "+44 7400 123456",
        "020 7946 0958"
      ]
    },
    {
      "businessName": "No Phone Co",
      "city": "Austin"
    }
  ],
  "phoneFields": [],
  "defaultCountry": "US",
  "countryHintField": "",
  "outputFormats": [
    "e164",
    "international",
    "national"
  ]
}' |
apify call jurassic_jove/phone-number-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jurassic_jove/phone-number-validator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Phone Number Validator & Formatter",
        "description": "Validate, classify and format phone numbers in bulk from Apify datasets, CSV files and inline JSON. Offline validation (E.164, line type, country) — no scraping, no carrier APIs.",
        "version": "0.1",
        "x-build-id": "a0k1m8T5Hq1egLRgh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jurassic_jove~phone-number-validator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jurassic_jove-phone-number-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jurassic_jove~phone-number-validator/runs": {
            "post": {
                "operationId": "runs-sync-jurassic_jove-phone-number-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jurassic_jove~phone-number-validator/run-sync": {
            "post": {
                "operationId": "run-sync-jurassic_jove-phone-number-validator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "datasetIds": {
                        "title": "Apify dataset IDs",
                        "type": "array",
                        "description": "IDs of Apify datasets from previous scraper runs (e.g. Google Maps, Yelp-style listings). All items are fetched with pagination. Invalid IDs are skipped with a warning.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "csvUrls": {
                        "title": "CSV file URLs",
                        "type": "array",
                        "description": "Public URLs to CSV files. The parser tolerates a BOM, comma/semicolon/tab/pipe delimiters and quoted fields. Malformed rows are skipped and counted, never crashing the run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "inlineRecords": {
                        "title": "Inline JSON records",
                        "type": "array",
                        "description": "Raw records pasted directly as a JSON array of objects. The example below shows the format and is used for the daily health-check — replace it with your own data or clear it."
                    },
                    "phoneFields": {
                        "title": "Phone fields",
                        "type": "array",
                        "description": "Names of the record fields that contain phone numbers. Leave EMPTY to auto-detect common fields (phone, phoneNumber, phones, mobile, tel, telephone, contactPhone, whatsapp, ...). Array fields are processed element by element.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "defaultCountry": {
                        "title": "Default country",
                        "enum": [
                            "US",
                            "CA",
                            "MX",
                            "GT",
                            "CR",
                            "PA",
                            "CO",
                            "VE",
                            "EC",
                            "PE",
                            "CL",
                            "AR",
                            "UY",
                            "PY",
                            "BO",
                            "BR",
                            "DO",
                            "PR",
                            "ES",
                            "GB",
                            "IE",
                            "FR",
                            "DE",
                            "IT",
                            "PT",
                            "NL",
                            "BE",
                            "CH",
                            "AT",
                            "SE",
                            "NO",
                            "DK",
                            "FI",
                            "PL",
                            "AU",
                            "NZ",
                            "IN",
                            "JP",
                            "ZA",
                            "AE",
                            "SA",
                            "PH"
                        ],
                        "type": "string",
                        "description": "ISO 3166-1 alpha-2 country code used to interpret numbers written WITHOUT an international prefix (e.g. a local '813...' number). Numbers that already start with '+' or '00' keep their own country.",
                        "default": "US"
                    },
                    "countryHintField": {
                        "title": "Country hint field (optional)",
                        "type": "string",
                        "description": "Name of a record field that holds a per-record country (ISO code, or an English/Spanish country name, or an address containing one). Used before falling back to the Default country. Example: countryCode, country, address."
                    },
                    "outputFormats": {
                        "title": "Output formats",
                        "type": "array",
                        "description": "Which formatted versions of each number to include in the output.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "e164",
                                "international",
                                "national"
                            ],
                            "enumTitles": [
                                "E.164 (+14155552671)",
                                "International (+1 415 555 2671)",
                                "National ((415) 555-2671)"
                            ]
                        },
                        "default": [
                            "e164",
                            "international",
                            "national"
                        ]
                    },
                    "dropInvalid": {
                        "title": "Drop records with no usable phone",
                        "type": "boolean",
                        "description": "If ON, records whose phone numbers are all invalid (no valid or plausible number) are excluded from the output dataset. They are still counted in the summary. Records with no phone field are kept.",
                        "default": false
                    },
                    "dedupeByPhone": {
                        "title": "Deduplicate by phone number",
                        "type": "boolean",
                        "description": "If ON, records that share the same E.164 number are collapsed into one (the most complete record is kept, with a _duplicateCount). Note: enabling this holds results in memory until the run finishes.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
