# US Phone Number Validator & Reverse Lookup — Carrier & Owner (`neuralverge/neuralverge-phone-enrichment-us`) Actor

Validate any US phone number and enrich it with carrier, line type (mobile / landline / VoIP), prepaid status and the people or businesses linked to it — names, age range, addresses and industry. You pay per completed lookup — $0.10 per row, an unmatched number included.

- **URL**: https://apify.com/neuralverge/neuralverge-phone-enrichment-us.md
- **Developed by:** [NeuralVerge](https://apify.com/neuralverge) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 39 total users, 12 monthly users, 91.9% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$100.00 / 1,000 results

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

### US Phone Number Validator & Reverse Lookup — Carrier & Owner ✅ No API Key

Validate any **US phone number** and enrich it with **carrier, line type, prepaid status**
and the **people or businesses linked to it** — names, age range, addresses and industry.
Powered by the Neuralverge API. **No API key or account required**. You **pay per completed
lookup — matched or not**, at **$0.100 per row**; a run that fails is never charged.

Ideal for lead validation, TCPA / line-type screening, identity resolution, fraud checks and
CRM hydration.

### ✨ Why this Actor

- ☎️ **Validate + enrich in one call** — confirm a US number is real and get its carrier,
  line type (mobile / landline / VoIP) and prepaid flag.
- 👤 **Reverse lookup** — resolve the number to the linked people and businesses, with names,
  age range, gender, addresses and industry.
- 💸 **One flat price, no run fee** — $0.100 per row written. A number that is invalid or
  unlisted comes back as one `no result` row and is billed the same $0.100; only a *failed*
  run costs nothing.
- 🔑 **No API key or account** — enrichment runs on the Neuralverge backend.
- ⚡ **Real-time & structured** — fresh data each run, ready for a spreadsheet, CRM or AI
  pipeline.

### 🔧 How it works

1. **Provide a US phone number** — any format works (the Actor strips `+`, spaces, dashes and
   parentheses and sends digits only; the leading `1` country code is optional).
2. **Run the Actor.** Validation and enrichment happen on the Neuralverge backend.
3. **Get one flat dataset row per lookup** — 15 columns, all at the top level
   (`phone`, `id`, `phoneNumber`, `isValid`, `activityScore`, `countryCallingCode`, …). Export to CSV, JSON or Excel, or pull it over the Apify API.

If the number is invalid or returns no result, the run still writes one explicit **`no result`
row** with the reason — billed at the normal $0.100. A run that *fails* writes nothing and
is free.

### Input

One number per run.

| Field | Type | Notes |
|---|---|---|
| `phone` | string | The US phone number to validate and enrich. Any format; digits are extracted automatically. Leading `1` is optional. |

```json
{
  "phone": "19165058708"
}
```

### What you'll receive

**One flat row per number.** Every field sits at the top level of the row, so the Output tab
shows a single table with all 15 columns — there are no views to switch between. Exports
(CSV, JSON, XML, Excel) contain exactly the same fields.

**Columns:** `phone`, `id`, `phoneNumber`, `isValid`, `activityScore`, `countryCallingCode`, `countryCode`, `countryName`, `lineType`, `carrier`, `isPrepaid`, `isLitigatorRisk`, `warnings`, `error`.

**Lists** — `owners` — come back as arrays. The table renders each as
an expandable "N items" cell; a CSV/JSON/Excel export carries them in full.

> **Nulls are normal.** The column set is the same on every run, so a field the source does not
> expose for this number comes back `null` rather than disappearing — a spreadsheet or CRM
> mapping built on one run keeps working on the next.

#### Example output (real run)

A real dataset row, shown in full.

```json
{
  "phone": "9165058708",
  "id": "Phone.88b010e6-d1a7-4f0b-8ffe-e41aac0eab6d",
  "phoneNumber": "+19165058708",
  "isValid": true,
  "activityScore": null,
  "countryCallingCode": "1",
  "countryCode": null,
  "countryName": null,
  "lineType": "Mobile",
  "carrier": "T-Mobile USA, Inc.",
  "isPrepaid": false,
  "isLitigatorRisk": null,
  "owners": [
    {
      "id": "Person.29d3ffb8-b9d9-3937-b1bb-137b6b95acf7",
      "name": "Stephen M Sewell",
      "firstname": "Stephen",
      "middlename": "M",
      "lastname": "Sewell",
      "alternateNames": [
        "Steve M Sewell",
        "S M Sewell"
      ],
      "ageRange": "36-40",
      "gender": "M",
      "type": "Person",
      "linkToPhoneStartDate": "2004-03-26",
      "industry": [],
      "currentAddresses": [
        {
          "id": "Location.5290fe2a-6ee5-4120-9de6-7b95244a3c4f",
          "locationType": "Address",
          "streetLine1": "585 29th St Apt C",
          "streetLine2": null,
          "city": "San Francisco",
          "postalCode": "94131",
          "zip4": "2240",
          "stateCode": "CA",
          "countryCode": "US",
          "deliveryPoint": "MultiUnit",
          "linkToPersonStartDate": "2021-03-01"
        }
      ]
    },
    {
      "id": "Business.4dc14931-dd9b-397f-b084-cb3e4e748e28",
      "name": "Builder.io, Inc",
      "firstname": null,
      "middlename": null,
      "lastname": null,
      "alternateNames": [],
      "ageRange": null,
      "gender": null,
      "type": "Business",
      "linkToPhoneStartDate": null,
      "industry": [
        "Data Processing, Hosting, & Related Services"
      ],
      "currentAddresses": [
        {
          "id": "Location.7a4b3bb1-d40e-4d1a-8c57-04752c0f9031",
          "locationType": "Address",
          "streetLine1": "95 3rd St PMB 2 San Fr",
          "streetLine2": null,
          "city": "San Francisco",
          "postalCode": "94103",
          "zip4": "3103",
          "stateCode": "CA",
          "countryCode": "US",
          "deliveryPoint": "SingleUnit",
          "linkToPersonStartDate": null
        }
      ]
    }
  ],
  "warnings": null,
  "error": null
}
```

#### When nothing is found

A lookup that runs but matches nothing still returns a row, so a batch never silently
loses an input. An **invalid** US number (bad format, non-existent line) and a **valid but
unlisted** number both land here:

| Column | Value |
|---|---|
| `phone` | echoed back exactly as submitted |
| `found` | `false` |
| `message` | the reason — e.g. the number failed validation, or it is valid but no owner record is linked to it |

Filter these out with `found != false` (or drop rows where `message` is set). **This row is
billed as one result at the full $0.100** — see Pricing.

### Pricing

Pay per event — **$0.100 per result** ($100 per 1,000) written to the dataset. There is
no run fee and no start fee.

| Event | Price | Charged |
|---|---|---|
| Actor start | **free** | never |
| Failed run — missing input, API error, timeout | **free** | never |
| Row written to the dataset | **$0.100** ($100 / 1,000) | every row, including the "no result" row |

**A completed lookup is billed as one result, matched or not.** When the source returns
nothing, the Actor writes one explicit **no-result row** — the query you submitted plus
`found: false` and a `message` explaining it — and that row is charged at the normal
per-result price. A run that *fails* (missing input, bad key, upstream error) writes no row
and costs **$0.00**.

This Actor is priced at **$0.100 per row**, so a lookup that matches nothing costs **$0.100**,
exactly the same as one that returns a full owner record. An invalid or unlisted US number is
**not** a failed run — the lookup completed and returned a verdict, so it writes a `found: false`
row and is billed the full **$0.100**.

Pricing is on top of your Apify platform usage.

#### Rate limit

There is a ceiling on how fast one Apify account can pull from the Neuralverge backend: **10
requests per second** for this Actor, counted separately from the other Neuralverge Actors. One run
is normally one request, so this is about how many runs you start at once, not about the size of a
single run — at typical run times that is dozens of runs in flight at once, which is well above
ordinary use.

**Updated August 2026:** this ceiling was doubled from 5 to 10 requests per second. Bulk jobs that
used to hit 429s now go through.

Above the ceiling the backend answers **HTTP 429**. The Actor waits out the `Retry-After` it asks
for and retries a few times before giving up; a run that does give up writes no row and is **not
charged**.

If you need a higher rate for a bulk job, get in touch.

#### Free plan limits

Users on any **paid Apify plan** are not affected by anything in this section.

On the **Apify Free plan** this Actor may be started **5 time(s) per calendar month per user**. A run that finds nothing
still counts, because the lookup is performed either way. Every Neuralverge Actor carries its
own allowance — running one never uses up another's. When a limit is reached the Actor stops gracefully
with a status message naming it; everything resets on the 1st of every month, and any paid Apify
plan removes all of it.

### Integrations & API

Results are stored in a standard Apify dataset — export as CSV, JSON, XML or Excel,
or fetch on demand through the [Apify API](https://docs.apify.com/api). The Actor
also plugs into Apify's integrations (Make, Zapier, n8n, webhooks) and can be called
from any [MCP](https://mcp.apify.com/) client.

### FAQ

**Do I need an account or API key?** No. Validation and enrichment run on the Neuralverge
backend.

**Which numbers are supported?** US phone numbers. Any format — the Actor strips `+`, spaces,
dashes and parentheses and sends digits only. The leading `1` country code is optional.

**What line types can it detect?** Mobile, landline and VoIP, along with the carrier and
prepaid status.

**Am I charged if a number is invalid or unlisted?** Yes — **$0.100**, the same as any other
row. A lookup that ran is billed as one result even when it matched nothing; you get a
`no result` row carrying `found: false` and the reason, so you can see what you paid for. Only
a run that *fails* — missing input, a bad key, an upstream error or timeout — writes no row and
costs $0.00.

### 🔗 Other Neuralverge Contact Data Actors

Other contact-data Actors from Neuralverge — the same person, from a different starting point:

- [Reverse Phone Lookup](https://apify.com/neuralverge/neuralverge-phone-enrichment) — the same reverse lookup for numbers outside the US.
- [Reverse Email Lookup](https://apify.com/neuralverge/neuralverge-email-enrichment) — an email in, the person behind it out.
- [Email Finder](https://apify.com/neuralverge/neuralverge-email-finder) — a work email from a name + company domain.
- [Email Validation](https://apify.com/neuralverge/neuralverge-email-validation) — verify an address is deliverable before you send.
- **More Neuralverge Actors** — the full catalogue (LinkedIn, contact data, company registers, reviews): [apify.com/neuralverge](https://apify.com/neuralverge).

***

**Disclaimer:** This Actor is an independent tool. Use enriched personal data in
compliance with applicable privacy laws (e.g. TCPA, CCPA, GDPR) and only where you have a
lawful basis.

# Actor input Schema

## `phone` (type: `string`):

The US phone number to validate and enrich (one per run). Any format works — the Actor strips '+', spaces, dashes and parentheses and sends digits only. The leading '1' country code is optional (e.g. 19165058708, 9165058708, (916) 505-8708). Apify Free plan: this Actor can be started 5 time(s) per calendar month per user, and every Neuralverge Actor has its own allowance; a run that finds nothing counts too. Any paid Apify plan removes the limit.

## Actor input object example

```json
{
  "phone": "19165058708"
}
```

# Actor output Schema

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

Structured validation + owner data (carrier, line type, prepaid status, linked people and businesses with names, ages and addresses), one row per validated phone.

# 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 = {
    "phone": "19165058708"
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuralverge/neuralverge-phone-enrichment-us").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 = { "phone": "19165058708" }

# Run the Actor and wait for it to finish
run = client.actor("neuralverge/neuralverge-phone-enrichment-us").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 '{
  "phone": "19165058708"
}' |
apify call neuralverge/neuralverge-phone-enrichment-us --silent --output-dataset

```

## MCP server setup

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

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/EeCkCfJiabFCBpInt/builds/ahW4ou8QnytGiqvhv/openapi.json
