# PhoneInfoga — Phone Number OSINT Scanner (`datacach/phoneinfoga-phone-number-osint-scanner`) Actor

Reverse phone lookup powered by PhoneInfoga. Detects carrier, country, line type and OSINT footprints for any international number. Integrates Numverify, Google Search and OVH. Free to start.

- **URL**: https://apify.com/datacach/phoneinfoga-phone-number-osint-scanner.md
- **Developed by:** [DataCach](https://apify.com/datacach) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Stats:** 10 total users, 5 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 1,000 phone scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## PhoneInfoga — Phone Number OSINT Scanner

Scan international phone numbers to gather carrier information, country of origin, line type, and OSINT footprints from multiple public sources. Built on top of [PhoneInfoga](https://github.com/sundowndev/phoneinfoga) — one of the most advanced open-source frameworks for phone number intelligence and reconnaissance.

No API key is required to run. The free scanners (`local`, `googlesearch`, `ovh`) work out of the box and return country detection, carrier registry lookups, and curated Google Dork search URLs. Adding a [Numverify API key](#how-to-get-a-numverify-api-key) unlocks carrier validation, line type detection, and active status checks.

---

### Features

- **Batch scanning** — scan up to 500 phone numbers in a single run (paid accounts)
- **Multiple scanners** — local parser, Numverify carrier API, Google Dork URL generator, OVH Telecom ownership check
- **No required API keys** — three scanners work without any configuration
- **Parallel execution** — numbers are scanned concurrently (configurable concurrency)
- **Automatic scanner filtering** — scanners with missing credentials are silently skipped; the run never fails because of a missing API key
- **Structured output** — one JSON record per number pushed to the Apify dataset

### Free vs paid accounts

The Actor automatically detects your Apify account plan and applies the following limits:

| | Free plan | Paid plan |
|---|---|---|
| **Max phone numbers per run** | 10 | 500 |
| **Max concurrency** | 1 (sequential) | 16 |
| **All scanners** | ✅ | ✅ |
| **Numverify API key support** | ✅ | ✅ |

If your input contains more than 10 numbers on a free account, the list is silently **truncated to the first 10** and a warning is logged. No error is thrown — the run completes normally with the allowed subset.

Upgrade your Apify plan at [apify.com/pricing](https://apify.com/pricing) to remove these limits.

---

### Use cases

- **OSINT investigations** — gather public information about an unknown phone number across social media, fraud databases, and telecom registries
- **Lead verification** — confirm a phone number is real and active before outreach
- **Fraud detection** — check carrier, line type, and reputation before processing a number
- **Batch carrier lookup** — scan hundreds of numbers and export results to CSV or JSON via the Apify API
- **Security research** — identify VoIP, disposable, or premium-rate numbers

---

### Scanners

| Scanner | Requires | Free | What it returns |
|---|---|---|---|
| `local` | Nothing | Unlimited | Number formats (E164, local, international), country code, carrier |
| `googlesearch` | Nothing | Unlimited | Google Dork URLs grouped by category (social media, fraud sites, directories, documents) |
| `ovh` | Nothing | Unlimited | Whether the number belongs to OVH Telecom's VoIP infrastructure (Europe only) |
| `numverify` | API key | 100 req/month | Line type (`mobile`, `landline`, etc.), carrier name, active status |

#### local

Parses the phone number and returns all available number formats plus the country and carrier when available.

**Output fields:**

| Field | Description |
|---|---|
| `rawLocal` | Local format without formatting (e.g. `0679368229`) |
| `local` | Local format with formatting (e.g. `06 79 36 82 29`) |
| `e164` | E164 international format (e.g. `+33679368229`) |
| `international` | International format without `+` (e.g. `33679368229`) |
| `countryCode` | Numeric country calling code (e.g. `33`) |
| `country` | ISO 3166-1 alpha-2 country code (e.g. `FR`) |
| `carrier` | Carrier name if available |

#### googlesearch

Generates pre-built [Google Dork](https://en.wikipedia.org/wiki/Google_hacking) search URLs targeting specific sites for the phone number. The URLs are returned for **manual investigation** — open them in a browser to see actual search results. No page content is fetched automatically.

**URL categories:**

| Category | Sites targeted |
|---|---|
| `socialMedia` | Facebook, Twitter/X, LinkedIn, Instagram, VK |
| `disposableProviders` | SMS receive services (hs3x.com, receive-sms-now.com, …) |
| `reputation` | Scam/fraud report sites (whosenumber.info, findwhocallsme.com, …) |
| `individuals` | People directories (numinfo.net, sync.me, pastebin.com, …) |
| `general` | Open web search + document search (PDF, DOCX, XLS, …) |

#### numverify

Queries the [Number Verification API](https://apilayer.com/marketplace/number_verification-api) (apilayer.com) to confirm whether the number is active and to retrieve its line type and carrier.

Requires a `numverifyApiKey`. Free tier: **100 requests/month** — no credit card required. See [how to get the key](#how-to-get-a-numverify-api-key).

**Output fields:**

| Field | Description |
|---|---|
| `valid` | Whether the number is considered valid and active |
| `number` | Number digits without `+` prefix |
| `localFormat` | Number in local format |
| `internationalFormat` | Number with `+` and country code |
| `countryPrefix` | Country calling code (e.g. `+33`) |
| `countryCode` | ISO 3166-1 alpha-2 country code |
| `countryName` | Full country name |
| `carrier` | Carrier name |
| `lineType` | `mobile`, `landline`, `special`, `toll_free`, `premium_rate`, or `unknown` |

#### ovh

Queries the OVH Telecom API (no key needed) to check whether the number is registered under OVH's VoIP infrastructure. Supported countries: France (FR), Belgium (BE), Great Britain (GB), Spain (ES), Switzerland (CH). Numbers from other countries are skipped with `skipped: true`.

**Output fields:**

| Field | Description |
|---|---|
| `found` | `true` if the number is registered under OVH Telecom |
| `numberRange` | OVH number range block (e.g. `036517xxxx`) |
| `city` | City associated with the range (e.g. `Abbeville`) |

---

### Input

#### Minimal input — no API keys required

```json
{
  "phoneNumbers": ["+33679368229", "+15551234567"]
}
````

#### Full input example

```json
{
  "phoneNumbers": ["+33679368229", "+15551234567", "+41764181234"],
  "numverifyApiKey": "YOUR_NUMVERIFY_KEY",
  "disabledScanners": ["ovh"],
  "maxConcurrency": 5
}
```

#### Input fields

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `phoneNumbers` | `string[]` | **Yes** | — | Phone numbers to scan. Use E164 (`+33679368229`) or international format. Max 500 per run (10 on free accounts). **Country code is mandatory.** |
| `numverifyApiKey` | `string` | No | — | API key from apilayer.com. Enables the `numverify` scanner. |
| `disabledScanners` | `string[]` | No | `[]` | Scanners to skip. Valid values: `local`, `numverify`, `googlesearch`, `ovh`. |
| `maxConcurrency` | `integer` | No | `5` | Numbers scanned simultaneously. Min 1, max 16. **Capped at 1 on free accounts regardless of this value.** Values above 10 may trigger rate limits on the Numverify free tier. |

#### Accepted phone number formats

All of the following are treated as the same number:

```
+33679368229
+33 679368229
+33 6 79 36 82 29
33679368229
```

The Actor strips spaces, dashes, and special characters automatically. The **country calling code** (e.g. `+33` for France, `+1` for the US) is always required. Find your country code at [countrycode.org](https://www.countrycode.org/).

***

### Output

One JSON record is written to the Apify dataset for each phone number.

#### Successful scan

```json
{
  "phoneNumber": "+33679368229",
  "numberInfo": {
    "valid": true,
    "rawLocal": "0679368229",
    "local": "06 79 36 82 29",
    "e164": "+33679368229",
    "international": "33679368229",
    "countryCode": 33,
    "country": "FR",
    "carrier": ""
  },
  "local": {
    "rawLocal": "0679368229",
    "local": "06 79 36 82 29",
    "e164": "+33679368229",
    "international": "33679368229",
    "country": "FR",
    "carrier": ""
  },
  "numverify": {
    "valid": true,
    "number": "33679368229",
    "localFormat": "0679368229",
    "internationalFormat": "+33679368229",
    "countryPrefix": "+33",
    "countryCode": "FR",
    "countryName": "France",
    "carrier": "Orange",
    "lineType": "mobile"
  },
  "googlesearch": {
    "socialMedia": [
      { "url": "https://www.google.com/search?q=site%3Afacebook.com+intext%3A%2233679368229%22" },
      { "url": "https://www.google.com/search?q=site%3Atwitter.com+intext%3A%2233679368229%22" }
    ],
    "disposableProviders": [ { "url": "..." } ],
    "reputation": [ { "url": "..." } ],
    "individuals": [ { "url": "..." } ],
    "general": [ { "url": "..." } ]
  },
  "ovh": {
    "found": false,
    "skipped": true,
    "reason": "Country not supported by OVH scanner (only FR, BE, GB, ES, CH)"
  },
  "scannedAt": "2026-05-02T10:00:00.000Z"
}
```

#### Failed validation

If a number cannot be parsed (missing country code, unsupported format), the record contains an `error` field:

```json
{
  "phoneNumber": "not-a-number",
  "error": "422 Unprocessable Entity",
  "scannedAt": "2026-05-02T10:00:00.000Z"
}
```

#### Output fields reference

| Field | Type | Description |
|---|---|---|
| `phoneNumber` | string | The input number exactly as provided |
| `numberInfo` | object | Parsed number: formats, country code, E164, carrier |
| `local` | object | null | Local scanner result. `null` if the scanner was skipped |
| `numverify` | object | null | Numverify scanner result. `null` if skipped or no API key provided |
| `googlesearch` | object | null | Google Dork URLs by category. `null` if skipped |
| `ovh` | object | OVH Telecom result. If `skipped: true`, the number's country is not supported |
| `scannedAt` | string | ISO 8601 UTC timestamp of when the scan completed |

***

### How to get a Numverify API key

The `numverify` scanner uses the **Number Verification API** from [apilayer.com](https://apilayer.com/marketplace/number_verification-api). The free plan includes **100 requests per month** with no credit card required.

> **Note:** apilayer.com has two number verification products. This Actor uses the legacy API — the key comes from the same apilayer.com dashboard and the Actor handles routing automatically. You only need to copy the key as shown below.

#### Step-by-step

**Step 1 — Create a free account**

Go to [apilayer.com](https://apilayer.com/) and click **Sign Up**. You can register with Google, GitHub, or email. No credit card is required.

**Step 2 — Open the Number Verification API page**

After logging in, go to [apilayer.com/marketplace/number\_verification-api](https://apilayer.com/marketplace/number_verification-api).

**Step 3 — Subscribe to the free plan**

Click **Subscribe for free** and select the **Free** plan (100 requests/month). Confirm the subscription.

**Step 4 — Copy your API key**

After subscribing, scroll down to the **API Key** section on the product page. Your key is a long alphanumeric string:

```
aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890abcd
```

Click the copy icon next to it.

**Step 5 — Add the key to the Actor**

In the Apify Console input form, paste the key into the **Numverify API key** field. If running locally, add it to `storage/key_value_stores/default/INPUT.json`:

```json
{
  "phoneNumbers": ["+33679368229"],
  "numverifyApiKey": "YOUR_KEY_HERE"
}
```

**Step 6 — Verify it works**

Run the Actor. In the dataset output, each record will have a populated `numverify` object with `valid`, `lineType`, and `carrier` fields.

> **Free tier limit:** The free plan allows 100 requests per month total. Scanning more numbers than your remaining quota will cause those scans to fail silently (the `numverify` field in those records will be `null`). Upgrade to a paid plan at apilayer.com or limit the batch size to stay within the free allowance.

***

### Costs and limits

| Scanner | Free limit | Notes |
|---|---|---|
| `local` | Unlimited | No external API required |
| `googlesearch` | Unlimited | Generates URLs only, no fetching |
| `ovh` | Unlimited | European numbers only |
| `numverify` | 100 req/month | Free at apilayer.com; paid plans available |

Apify platform usage is billed separately based on compute time and memory. A typical scan of 10 numbers completes in under 30 seconds.

***

### Troubleshooting

**The Actor fails immediately at startup**

Re-deploy with `apify push` to ensure the latest build is used and try again.

**`numverify` scanner is always skipped**

Verify that `numverifyApiKey` is filled in the Actor input and that it is the key from the **Number Verification API** product page on apilayer.com — not from a different product.

**`numverify` returns errors after some scans**

You have likely exceeded the free tier quota (100 requests/month). Log in to apilayer.com and check **My Account → Subscriptions** to see your remaining requests. Either wait for the monthly quota reset or upgrade to a paid plan.

**Number validation fails**

The number is missing the country calling code or is in an unsupported format. Every number must start with the country calling code — for example `+1` for the US, `+44` for the UK, `+55` for Brazil. See [countrycode.org](https://www.countrycode.org/) to find the right code.

**`ovh` always shows `skipped: true`**

Expected for non-European numbers. The OVH scanner only covers France (FR), Belgium (BE), Great Britain (GB), Spain (ES), and Switzerland (CH).

**`googlesearch` URLs return no results in the browser**

This is normal for unlisted or private numbers. The `googlesearch` scanner generates best-effort Dork URLs — if a number has no public presence on a given site, the search simply returns no results.

***

### Disclaimer and legal notice

> **Read this before using the Actor.**

#### Intended use

This Actor is provided strictly for **legitimate, lawful purposes** — including OSINT research, fraud prevention, security auditing, and investigative journalism where permitted by applicable law.

**You are solely responsible** for ensuring that your use of this tool complies with all applicable laws, regulations, and third-party terms of service in your jurisdiction.

#### Prohibited uses

The following uses are explicitly prohibited:

- **Stalking, harassment, or surveillance** of individuals without their knowledge and legal authority to do so
- **Building profiles or databases** of individuals' personal information without a lawful basis
- **Spam, cold calling, or unsolicited marketing** using data collected with this tool
- **Bypassing privacy protections** or accessing information in violation of a person's reasonable expectation of privacy
- **Any use that violates applicable laws**, including anti-stalking laws, wiretapping laws, or consumer protection regulations

#### GDPR and data protection

A phone number is **personal data** under the [General Data Protection Regulation (GDPR)](https://gdpr.eu/) (EU Regulation 2016/679) and equivalent laws in other jurisdictions (e.g. UK GDPR, CCPA, LGPD). If you are scanning phone numbers belonging to individuals in the European Economic Area (EEA) or the UK, the following obligations apply to you as the **data controller**:

| Obligation | What it means in practice |
|---|---|
| **Lawful basis (Art. 6 GDPR)** | You must have a valid legal ground before processing the number — e.g. legitimate interest, legal obligation, or explicit consent. Curiosity is not a lawful basis. |
| **Purpose limitation (Art. 5(1)(b))** | Data collected must only be used for the specific purpose it was gathered for. You cannot repurpose results for unrelated activities. |
| **Data minimisation (Art. 5(1)(c))** | Only scan the numbers you genuinely need. Do not scan numbers in bulk speculatively. |
| **Storage limitation (Art. 5(1)(e))** | Do not retain the output dataset longer than necessary for your stated purpose. Delete results when they are no longer needed. |
| **Data subject rights (Art. 15–22)** | Individuals have the right to access, correct, and erase their personal data. If a data subject submits a request, you must be able to act on it. |
| **Third-country transfers (Art. 44–49)** | Running this Actor on the Apify platform stores results on Apify infrastructure. Review [Apify's data processing terms](https://apify.com/privacy-policy) before processing EEA personal data. |

> This Actor does **not** collect, store, or transmit any personal data on its own beyond what you explicitly provide as input. The Apify dataset produced by a run is stored in your Apify account and subject to your own data retention policies.

#### Accuracy disclaimer

- Results are aggregated from **public, third-party sources** and may be outdated, incomplete, or incorrect
- The Actor does **not** guarantee that a number is currently active, assigned, or owned by any particular individual
- Do **not** use results as the sole basis for decisions that affect individuals (credit decisions, employment screening, law enforcement actions, etc.)

#### License

The underlying tool, [PhoneInfoga](https://github.com/sundowndev/phoneinfoga), is licensed under the [GNU General Public License v3.0](https://github.com/sundowndev/phoneinfoga/blob/master/LICENSE).

# Actor input Schema

## `phoneNumbers` (type: `array`):

List of phone numbers to scan (max 500). Use E164 or international format (e.g. +33679368229). The country code is required. Note: if numverify is enabled, the free tier allows only 100 requests/month — scanning more numbers than your quota will cause those scans to fail.

## `maxConcurrency` (type: `integer`):

Maximum number of phone numbers scanned simultaneously. Increase for larger batches. Default is 5, max is 16. Note: values above 10 may trigger rate limits on the numverify free tier.

## `disabledScanners` (type: `array`):

Scanners to skip. Available: local, numverify, googlesearch, ovh.

## `numverifyApiKey` (type: `string`):

API key for the Number Verification API (apilayer.com). Enables the numverify scanner (carrier, line type, country).

## Actor input object example

```json
{
  "phoneNumbers": [
    "+33679368229"
  ],
  "maxConcurrency": 5,
  "disabledScanners": []
}
```

# Actor output Schema

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

Dataset items — one entry per phone number with carrier, country, line type, and OSINT footprints.

# 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 = {
    "phoneNumbers": [
        "+33679368229"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/phoneinfoga-phone-number-osint-scanner").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 = { "phoneNumbers": ["+33679368229"] }

# Run the Actor and wait for it to finish
run = client.actor("datacach/phoneinfoga-phone-number-osint-scanner").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 '{
  "phoneNumbers": [
    "+33679368229"
  ]
}' |
apify call datacach/phoneinfoga-phone-number-osint-scanner --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PhoneInfoga — Phone Number OSINT Scanner",
        "description": "Reverse phone lookup powered by PhoneInfoga. Detects carrier, country, line type and OSINT footprints for any international number. Integrates Numverify, Google Search and OVH. Free to start.",
        "version": "0.1",
        "x-build-id": "4oDhx3oIgaXtR18PD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/datacach~phoneinfoga-phone-number-osint-scanner/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-datacach-phoneinfoga-phone-number-osint-scanner",
                "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/datacach~phoneinfoga-phone-number-osint-scanner/runs": {
            "post": {
                "operationId": "runs-sync-datacach-phoneinfoga-phone-number-osint-scanner",
                "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/datacach~phoneinfoga-phone-number-osint-scanner/run-sync": {
            "post": {
                "operationId": "run-sync-datacach-phoneinfoga-phone-number-osint-scanner",
                "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",
                "required": [
                    "phoneNumbers"
                ],
                "properties": {
                    "phoneNumbers": {
                        "title": "Phone numbers",
                        "maxItems": 500,
                        "type": "array",
                        "description": "List of phone numbers to scan (max 500). Use E164 or international format (e.g. +33679368229). The country code is required. Note: if numverify is enabled, the free tier allows only 100 requests/month — scanning more numbers than your quota will cause those scans to fail.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Maximum number of phone numbers scanned simultaneously. Increase for larger batches. Default is 5, max is 16. Note: values above 10 may trigger rate limits on the numverify free tier.",
                        "default": 5
                    },
                    "disabledScanners": {
                        "title": "Disabled scanners",
                        "type": "array",
                        "description": "Scanners to skip. Available: local, numverify, googlesearch, ovh.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "numverifyApiKey": {
                        "title": "Numverify API key",
                        "type": "string",
                        "description": "API key for the Number Verification API (apilayer.com). Enables the numverify scanner (carrier, line type, country)."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
