# Phone Number OSINT Lookup — Carrier, Country & Footprint (`ntriqpro/phoneinfoga-osint`) Actor

Reverse phone number lookup for any international number: validate the format, identify country, region and carrier, and get ready-made footprint search links across social, reputation and disposable-number sites. Open-source PhoneInfoga engine. No API keys, bulk input, JSON/CSV.

- **URL**: https://apify.com/ntriqpro/phoneinfoga-osint.md
- **Developed by:** [daehwan kim](https://apify.com/ntriqpro) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Stats:** 312 total users, 58 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $26.00 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Phone Number OSINT — Carrier, Country & Footprint (PhoneInfoga)

Investigate **a whole list of phone numbers** and discover each one's **carrier, country, line type, time zone, risk profile, and online footprint** across social media, reputation sites, and disposable-number providers — powered by [phoneinfoga](https://github.com/sundowndev/phoneinfoga) (GPL-3.0) plus offline [libphonenumber](https://github.com/google/libphonenumber) analysis (Apache-2.0).

> **Legal Disclaimer: This Actor is an unofficial integration of phoneinfoga and is not affiliated with, endorsed by, or sponsored by the original phoneinfoga project or its maintainers. It returns publicly available information only and stores no personal data. Use responsibly and only on numbers you have authorization to investigate.**

***

### What does this Actor do?

This Actor wraps the open-source OSINT tool **phoneinfoga** to investigate phone numbers **in bulk** — up to 200 per run — and returns structured intelligence for each one:

- **Validate & normalize** the number (E.164, international, national and RFC3966 formats)
- **Identify the line type** — mobile, fixed line, VoIP, toll-free, premium rate, shared cost, pager, UAN, voicemail
- **Identify country, carrier, region and time zone** via offline libphonenumber data
- **Judge it in one line** — every row carries a `headline` verdict, `riskFlags`, a `riskLevel`, and an `smsCapable` call
- **Detect OVH-owned ranges** (European VoIP) — useful for fraud / scam-call investigation
- **Generate 30+ Google footprint search links** across social media (Facebook, Twitter/X, LinkedIn, Instagram, VK), disposable-number sites, reputation databases, and individual lookup services
- **Summarise the batch** — one free summary row with country and line-type distribution

Built for **fraud investigators, security researchers, journalists, KYC teams, and developers** who need automated phone-number reconnaissance backed by a proven open-source OSINT framework.

***

### Why use this Actor?

- **★ Backed by phoneinfoga** — the de-facto open-source phone OSINT tool (16,500+ GitHub stars)
- **Zero API keys required** — works out of the box for free, no-auth scanners (local, googlesearch, OVH)
- **Structured JSON output** — ready for Apify datasets, webhooks, or downstream pipelines
- **Privacy-first design** — public information only, no personal data stored beyond the run dataset
- **Schedulable** — set up recurring monitoring via Apify Scheduler
- **API & MCP access** — call via REST API, MCP, or Apify Console

***

### How to use this Actor

1. **Open the Actor** in Apify Console and click **Try for free**
2. **Paste your phone numbers** in international format (e.g., `+14155551234`, `+821012345678`) — one or many
3. **Check the legal disclaimer** box (`disclaimerAck: true`)
4. **Start the Actor** — a 3-number batch finishes in a few seconds; the engine starts once and is reused for the whole list
5. **Download results** from the Output tab as JSON, CSV, or Excel

***

### Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `phoneNumbers` | array | Numbers to investigate, in international format. Up to 200 per run | `[]` |
| `number` | string | Single-number alternative, kept for existing API integrations | — |
| `defaultRegion` | string | ISO 3166-1 alpha-2 code used to read numbers with no country code (e.g. `US`, `KR`) | `""` |
| `dedupe` | boolean | Collapse numbers that normalise to the same E.164 value | `true` |
| `disclaimerAck` | boolean | Confirm authorized & lawful use | `true` |
| `scanners` | string | Comma-separated scanners to run. Empty = all free/no-key (`local,googlesearch,ovh`) | `""` |

**Example input:**

```json
{
    "phoneNumbers": [
        "+14155551234",
        "+33679368229",
        "+821012345678"
    ],
    "defaultRegion": "",
    "dedupe": true,
    "disclaimerAck": true,
    "scanners": ""
}
```

The legacy single-number form still works exactly as before:

```json
{ "number": "+14155551234", "disclaimerAck": true }
```

***

Invalid input ends the run as SUCCEEDED with a notice row.

### Output

One structured dataset item **per phone number**. Rows carrying a `noticeCode`
are **status rows, not results** (`summary`, `no-input`,
`disclaimer-not-acknowledged`, `targets-truncated`, `charge-limit-reached`,
`billing-unavailable`) — skip them when parsing programmatically.

```json
{
    "input": "+14155551234",
    "valid": true,
    "possible": true,
    "e164": "+14155551234",
    "international": "+1 415 555 1234",
    "localFormat": "(415) 555-1234",
    "national": "(415) 555-1234",
    "rfc3966": "tel:+14155551234",
    "country": "US",
    "countryName": "United States",
    "countryCode": 1,
    "region": "San Francisco, CA",
    "carrier": null,
    "lineType": "FIXED_LINE_OR_MOBILE",
    "numberType": "FIXED_LINE_OR_MOBILE",
    "numberTypeLabel": "fixed line or mobile",
    "timezones": ["America/Los_Angeles"],
    "smsCapable": true,
    "riskFlags": [],
    "riskLevel": "none",
    "invalidReason": null,
    "headline": "+1 415 555 1234 — valid United States fixed line or mobile (San Francisco, CA), America/Los_Angeles, safe to SMS, 45 footprint links",
    "ovhFound": false,
    "ovhCity": null,
    "ovhNumberRange": null,
    "ovhZipCode": null,
    "searchLinkCount": 45,
    "searchLinks": [
        { "category": "social_media", "dork": "site:facebook.com intext:\"4155551234\"...", "url": "https://www.google.com/search?q=..." },
        { "category": "reputation", "dork": "site:whocalled.us ...", "url": "https://www.google.com/search?q=..." }
    ],
    "scannersRun": ["local", "googlesearch", "ovh"],
    "scannerErrors": {},
    "scannedAt": "2026-06-05T12:34:56.789Z",
    "disclaimer": "Public information only..."
}
```

You can download the dataset in JSON, HTML, CSV, or Excel.

***

### Data fields

| Field | Format | Description |
|-------|--------|-------------|
| `input` | text | Raw input as provided |
| `headline` | text | One-line verdict for this number |
| `valid` | boolean | Whether number passes E.164 validation |
| `possible` | boolean | Whether the length is plausible for that numbering plan |
| `e164` | text | Canonical E.164 representation |
| `international` | text | Pretty international format |
| `localFormat` / `national` | text | Country-local format |
| `rfc3966` | text | `tel:` URI form |
| `country` | text | ISO country code (e.g., `US`, `KR`, `FR`) |
| `countryName` | text | Full country name (e.g., `United States`) |
| `countryCode` | number | Numeric country code (e.g., `1`, `82`, `33`) |
| `region` | text | Geographic area of the number range (e.g., `San Francisco, CA`) |
| `carrier` | text | Carrier name when available from offline data |
| `lineType` / `numberType` | text | `MOBILE`, `FIXED_LINE`, `VOIP`, `TOLL_FREE`, `PREMIUM_RATE`, … |
| `numberTypeLabel` | text | Same, in plain English |
| `timezones` | array | IANA time zones for the number range |
| `smsCapable` | boolean | `true` / `false`, or `null` when the plan cannot tell |
| `riskFlags` | array | `premium-rate`, `voip`, `shared-cost`, `toll-free`, `ovh-voip-range`, `not-possible`, `invalid-for-region`, `country-mismatch`, `unparseable` |
| `riskLevel` | text | `none`, `low`, `medium`, `high` |
| `invalidReason` | text | Why a number failed, in plain English |
| `ovhFound` | boolean | Whether number belongs to an OVH Telecom range |
| `ovhCity` / `ovhNumberRange` / `ovhZipCode` | text | OVH range metadata |
| `searchLinkCount` | number | Count of footprint search links generated |
| `searchLinks` | array | Google search links across 5 categories (social_media, disposable_providers, reputation, individuals, general) |
| `scannersRun` | array | Scanners that were executed |
| `scannerErrors` | object | Per-scanner errors (empty when all succeeded) |
| `scannedAt` | date | ISO timestamp |

#### Scanner-layer rows (additional, once priced)

For each **valid** number, this Actor also writes one extra row per scanner it ran
(`rowType: "scanner-result"`), e.g. one row for `local`, one for `googlesearch`, one
for `ovh`. This is on top of — not instead of — the full verdict row above, and only
charges once the `scanner-result` event below is on the live price list.

```json
{ "rowType": "scanner-result", "input": "+14155551234", "e164": "+14155551234",
  "scanner": "googlesearch", "status": "ok", "result": { "...": "..." }, "error": null }
```

***

### Pricing

**Run start fee — from 10 September 2026:** $0.010 is charged once per run, when the run starts and performs the investigation. Existing per-result prices are unchanged.

This Actor is priced **per number scanned**:

- **$0.05 per phone number written to the dataset** (Pay-per-Event) — a batch of
  10 numbers costs $0.50
- Every number that comes back with a verdict is charged, **valid or invalid**.
  An "invalid" verdict is the answer you asked for, and it is the one that stops
  a wasted call or SMS.
- **Batch summary and status rows are not charged**, and neither is a run that
  produced no verdict at all (empty input, disclaimer not acknowledged)
- Duplicate numbers that normalise to the same E.164 value are collapsed before
  charging, so you never pay twice for the same line
- Standard Apify platform compute is also consumed (~$0.001–0.005 per run)
- **`scanner-result` — $0.01 per scanner row (once priced, see above)** — an
  additional layer, on top of the $0.05 verdict row, for each scanner actually
  run on a valid number (typically 2–3 scanners: `local`, `googlesearch`, `ovh`
  for French numbers). Not charged for invalid numbers, since no scanner runs
  against them.

**Free plan:** each run returns up to 25 results (the first 3 inputs). Paid Apify plans
receive the full result set. A free-plan run that reaches the sample limit finishes
successfully with a `free-plan-cap` notice row — it is a plan limit, not an error. When numbers were left unscanned, that notice counts them and gives an estimated
list-price total for the whole input (an estimate, not a quote).

New Apify users receive free monthly credits to get started.

***

### Tips & Advanced Options

- **Multiple numbers**: just paste them all into `phoneNumbers` — up to 200 per run, and the phoneinfoga engine starts once for the whole batch
- **Filter before you act**: `smsCapable == true` before an SMS campaign, `riskLevel in ("medium","high")` before a dialler campaign
- **Mixed-country lists**: set `defaultRegion` to the country the list is supposed to be from; anything else is flagged `country-mismatch`
- **Specific scanners only**: pass `scanners: "local,ovh"` to skip googlesearch link generation
- **CSV export**: the `searchLinks` array unwinds nicely when you select CSV export — one row per link
- **Integration**: connect to Slack/Discord/webhooks via Apify Integrations to alert on suspicious carrier matches

***

### FAQ, Disclaimers & Support

#### Is this legal?

This Actor returns **publicly available information** only — number-format parsing (offline libphonenumber), OVH's public REST API (no auth), and Google search links you could type yourself. It does **not**:

- Bypass any authentication
- Scrape private profiles or paywalled databases
- Store personal data beyond the dataset for the run
- Reverse-lookup any database that requires opt-in consent

However, you remain solely responsible for ensuring your use complies with:

- Local privacy laws (GDPR, CCPA, PIPA, etc.)
- The Terms of Service of any site you subsequently visit via the generated search links
- Anti-stalking / anti-harassment statutes in your jurisdiction

**Only investigate numbers you are authorized to investigate** (your own, those of consenting parties, or those covered by a legitimate fraud-prevention / KYC / journalism mandate).

#### Legal Disclaimer

**This Actor is an UNOFFICIAL integration of [phoneinfoga](https://github.com/sundowndev/phoneinfoga), released under the GNU General Public License v3.0. It is NOT affiliated with, endorsed by, or sponsored by the original phoneinfoga project or its authors. The phoneinfoga binary is executed as a separate process; this Actor's wrapper code is not a derivative work in the GPL sense. See LICENSE-NOTICE.md in the source for details. The Actor author provides this tool for legitimate security research, fraud prevention, journalism, and authorized investigations only. Users are solely responsible for ensuring their use complies with applicable laws. The author accepts no liability for misuse.**

#### What about numverify / Google Custom Search scanners?

phoneinfoga supports additional scanners (`numverify`, `googlecse`) that require **your own API keys**. To protect users from accidental third-party charges and to keep data flow under your direct control, this Actor enables only the **free no-auth scanners** by default. Power users who need numverify or googlecse can install phoneinfoga locally and run it with their own credentials.

#### Known Limitations

- `carrier` is often empty for non-mobile numbers (libphonenumber limitation)
- OVH lookup is meaningful for European VoIP numbers; returns `found: false` for most others
- Google search link **generation** does not execute the queries — you visit the links to view results
- Very common number patterns may return many false-positive matches when you follow the links

#### Support

- Found a bug? Open an issue in the **Issues** tab
- Need a custom OSINT solution? Contact via the Apify platform

***

### 🔗 Related Actors by ntriqpro

Build your full OSINT stack:

- [**maigret-actor**](https://apify.com/ntriqpro/maigret-actor) — Username OSINT — Check 3000+ sites where a username is registered (maigret wrap)
- [**email-osint-search**](https://apify.com/ntriqpro/email-osint-search) — Email OSINT — Check 120+ sites where an email is registered (holehe wrap)
- [**metascraper-actor**](https://apify.com/ntriqpro/metascraper-actor) — Web Metadata Extractor — Open Graph, Title, Author API
- [**phish-radar**](https://apify.com/ntriqpro/phish-radar) — Phishing & Malicious Domain Detector

### ⭐ Love it? Leave a Review

Your honest rating helps fraud investigators and security researchers discover this Actor.

### Works well with

- **[phone-number-validator-bulk](https://apify.com/ntriqpro/phone-number-validator-bulk)** — Validate a whole list of numbers at once before paying for deep lookups.
- **[socialscan-osint](https://apify.com/ntriqpro/socialscan-osint)** — Pivot from the number to the person: check emails and usernames for account existence.

Every run of this Actor also returns these suggestions in the `nextSteps` field of its summary row.

# Changelog

This Actor's version history is a separate document: https://apify.com/ntriqpro/phoneinfoga-osint/changelog.md

# Actor input Schema

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

One or more phone numbers to investigate, in international format including country code. Examples: +14155551234, +33679368229, +821012345678. Spaces, dashes, parentheses and + are all fine. Up to 200 numbers per run. Free plan: each run returns up to 25 results (the first 3 inputs). Paid Apify plans receive the full result set.

## `number` (type: `string`):

Alternative to the list above — a single number to investigate. Kept for backwards compatibility with existing API integrations.

## `defaultRegion` (type: `string`):

Optional. Two-letter country code used to read numbers that have no country code, e.g. US, GB, KR, FR. Numbers from a different country are flagged with country-mismatch.

## `dedupe` (type: `boolean`):

Collapse numbers that normalise to the same E.164 value so you are not charged twice for the same line. On by default.

## `disclaimerAck` (type: `boolean`):

Required. By checking this you confirm that (1) you will use this Actor only for lawful purposes such as fraud prevention, authorized security research, journalism, or investigation of numbers you are authorized to investigate; (2) you will not use results to harass, stalk, dox, or harm any person; (3) you are responsible for compliance with applicable privacy laws (GDPR/CCPA/PIPA/etc.). This Actor returns public information only and stores no personal data.

## `scanners` (type: `string`):

Optional. Comma-separated scanner names. Leave empty to run all FREE no-auth scanners: local, googlesearch, ovh. External paid scanners requiring your own API key (numverify, googlecse) are not enabled in this Actor — bring your own key by running phoneinfoga directly if needed.

## Actor input object example

```json
{
  "phoneNumbers": [
    "+14155551234",
    "+33679368229",
    "+821012345678"
  ],
  "dedupe": true,
  "disclaimerAck": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "phoneNumbers": [
        "+14155551234",
        "+33679368229",
        "+821012345678"
    ],
    "defaultRegion": "",
    "dedupe": true,
    "disclaimerAck": true,
    "scanners": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("ntriqpro/phoneinfoga-osint").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": [
        "+14155551234",
        "+33679368229",
        "+821012345678",
    ],
    "defaultRegion": "",
    "dedupe": True,
    "disclaimerAck": True,
    "scanners": "",
}

# Run the Actor and wait for it to finish
run = client.actor("ntriqpro/phoneinfoga-osint").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 '{
  "phoneNumbers": [
    "+14155551234",
    "+33679368229",
    "+821012345678"
  ],
  "defaultRegion": "",
  "dedupe": true,
  "disclaimerAck": true,
  "scanners": ""
}' |
apify call ntriqpro/phoneinfoga-osint --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ntriqpro/phoneinfoga-osint"
        }
    }
}
```

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/nyap0BQq27BA8wfnQ/builds/E7PQ1TF5vLXQ4su8Y/openapi.json
