# OmniCheck - B2B Lead Validator & Website Contact Enrichment (`rollan_dev/omnicheck-validator`) Actor

4-in-1 B2B Lead Validator, WhatsApp Phone Number Validator (ITU-T Mobile vs Landline & 555 Filter), Email MX SPF DMARC Verifier, Telegram Username Validator & Website Contact Enrichment Scraper.

- **URL**: https://apify.com/rollan_dev/omnicheck-validator.md
- **Developed by:** [Rollan Sadykov](https://apify.com/rollan_dev) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 verified & enriched leads

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

## ⚡ OmniCheck v2.0 — B2B Lead Validator & Website Contact Enrichment API

**OmniCheck v2.0** is an all-in-one B2B Lead Verification & Contact Enrichment Engine built for marketing agencies, sales teams, CRM pipelines (`HubSpot`, `Salesforce`, `Pipedrive`, `Clay`), and automation workflows (`n8n`, `Make`, `Zapier`).

Unlike basic formatters, OmniCheck performs **live cryptographic DNS checks, ITU-T numbering-plan line-type analysis, live Telegram profile extraction, and multi-page website contact scraping (including Cloudflare `data-cfemail` decryption)** in a single high-speed run — at just **$0.50 per 1,000 verified leads** (`$0.00` start fee).

***

### 🚀 4 Genuine Verification & Enrichment Engines in 1 Actor

| Module | What It Verifies (100% Live Network & ITU-T Checks) | Why B2B Teams Use It |
| :--- | :--- | :--- |
| **1. Phone ITU-T & Line-Type Analyzer** | Full `libphonenumber-js/max` numbering plan validation, **Mobile (`MOBILE`) vs. Landline (`FIXED_LINE`) vs. VoIP/Toll-Free** classification, `00` international prefix & extension normalization, and **North American `555` fictitious number filtering**. | Landlines (e.g. UK `+44 20...` or German `+49 30...` desk phones) and fake `555` leads waste SMS & WhatsApp campaign budgets. Know instantly which numbers are mobile-capable (`isMobileCapable: true`) and get ready-to-use `wa.me` & `t.me` deep links. |
| **2. Live Email DNS MX / SPF / DMARC Validator** | Real-time DNS `MX` record resolution (`resolveMx`), `TXT` SPF (`v=spf1`) & `_dmarc` verification, mail provider fingerprinting (`Google Workspace / Gmail`, `Microsoft 365 / Exchange Online`, `Yandex 360`, `Proton Mail`, `Cloudflare`, `Custom / Dedicated SMTP`), role account detection (`isRoleAccount`), and disposable domain blocking (`isDisposable`). | Eliminates hard bounces and disposable signups before cold email campaigns without paying expensive per-email SaaS fees. |
| **3. Live Telegram `@username` & Channel Verifier** | Connects to `t.me/<handle>` (supports `@handle`, `t.me/handle`, and `t.me/s/handle`) and parses public profile metadata: verifies whether the user, channel, group, or bot actually exists (`isValid: true/false`), and extracts **Title, Bio, Subscriber/Member count, and Entity Type (`user`, `channel`, `group`, `bot`)**. | Cleans Telegram outreach lists and enriches influencer/community databases with exact subscriber counts. |
| **4. Business Website Contact & Social Crawler** | Crawls business websites (homepage + auto-discovered `/contact`, `/contacts`, `/about`, `/impressum` pages, with permissive SSL & Cloudflare `data-cfemail` decryption) to extract **Emails, Phone Numbers (`tel:` + JSON-LD + visible text), embedded WhatsApp Business links (`wa.me`), Telegram links (`t.me`), and Social Profiles** (`LinkedIn`, `Instagram`, `Facebook`, `X/Twitter`, `YouTube`, `TikTok`), then validates every discovered email, phone, and Telegram handle automatically! | Turn a raw list of company domains from Google Maps or 2GIS into verified decision-maker contacts. |

***

### 💰 Transparent Pricing Comparison

| Feature | Typical Apify Validators | OmniCheck v2.0 |
| :--- | :--- | :--- |
| **Channels Included** | 1 channel only (Phone OR Email) | **4-in-1 (Phone + Email DNS + Telegram + Website Crawler)** |
| **Actor Start Fee** | `$0.01 – $0.05` per run | **`$0.00` (Zero Start Fee)** |
| **Price per 1,000 Leads** | `$1.50 – $50.00 / 1k` | **`$0.50 / 1k` (`$0.0005` per verified lead)** |
| **Invalid / Fake Lead Charging** | Often billed regardless | **Free ($0.00) for invalid phone syntax, fake 555 numbers & 404 URLs** |
| **Excel / CSV Export** | Messy nested JSON columns | **100% Flat 29-Column Schema (ready for Excel, Clay & CRM import)** |

***

### 📥 Input Parameters

You can pass any combination of the 4 input arrays (or even mix emails, `@handles`, URLs, and phones into `phoneNumbers` — OmniCheck auto-detects the input type and deduplicates canonical leads automatically):

```json
{
  "phoneNumbers": [
    "+77015554433",
    "+493022730",
    "+14155552671"
  ],
  "emails": [
    "support@apify.com",
    "info@kaspi.kz",
    "fake@mailinator.com"
  ],
  "telegramHandles": [
    "@telegram",
    "@durov"
  ],
  "websites": [
    "https://apify.com"
  ],
  "defaultCountry": "US",
  "concurrency": 10
}
```

***

### 📤 Clean Flat Output Structure (CSV / Excel / JSON Ready)

Every item in the dataset shares a uniform **29-column flat schema** so your `CSV`, `Excel (XLSX)`, `Google Sheets`, and `JSON` exports never break or create nested column explosions:

#### 1. Phone Verification (`recordType: "phone"`)

```json
{
  "recordType": "phone",
  "input": "+77015554433",
  "isValid": true,
  "summary": "Valid MOBILE number eligible for mobile messaging",
  "e164": "+77015554433",
  "formattedInternational": "+7 701 555 44 33",
  "countryCode": "KZ",
  "lineType": "MOBILE",
  "isMobileCapable": true,
  "whatsappDirectLink": "https://wa.me/77015554433",
  "telegramDirectLink": "https://t.me/+77015554433",
  "email": null,
  "domain": null,
  "mailProvider": null,
  "mxServer": null,
  "hasSpf": null,
  "hasDmarc": null,
  "isDisposable": null,
  "isRoleAccount": null,
  "telegramHandle": null,
  "telegramEntityType": null,
  "telegramTitle": null,
  "telegramExtra": null,
  "telegramBio": null,
  "websiteEmails": null,
  "websitePhones": null,
  "websiteSocials": null,
  "latencyMs": 3,
  "checkedAt": "2026-11-05T10:30:00.000Z"
}
```

#### 2. Email DNS MX / SPF / DMARC Verification (`recordType: "email"`)

```json
{
  "recordType": "email",
  "input": "info@kaspi.kz",
  "isValid": true,
  "summary": "Verified active MX server (bmss-01d.kaspi.kz) via Custom / Dedicated SMTP",
  "e164": null,
  "formattedInternational": null,
  "countryCode": null,
  "lineType": null,
  "isMobileCapable": null,
  "whatsappDirectLink": null,
  "telegramDirectLink": null,
  "email": "info@kaspi.kz",
  "domain": "kaspi.kz",
  "mailProvider": "Custom / Dedicated SMTP",
  "mxServer": "bmss-01d.kaspi.kz",
  "hasSpf": true,
  "hasDmarc": true,
  "isDisposable": false,
  "isRoleAccount": true,
  "telegramHandle": null,
  "telegramEntityType": null,
  "telegramTitle": null,
  "telegramExtra": null,
  "telegramBio": null,
  "websiteEmails": null,
  "websitePhones": null,
  "websiteSocials": null,
  "latencyMs": 272,
  "checkedAt": "2026-11-05T10:30:00.000Z"
}
```

#### 3. Telegram `@username` Verification (`recordType: "telegram"`)

```json
{
  "recordType": "telegram",
  "input": "@durov",
  "isValid": true,
  "summary": "Verified Telegram channel: Pavel Durov ✔ (10 124 257 subscribers)",
  "e164": null,
  "formattedInternational": null,
  "countryCode": null,
  "lineType": null,
  "isMobileCapable": null,
  "whatsappDirectLink": null,
  "telegramDirectLink": "https://t.me/durov",
  "email": null,
  "domain": null,
  "mailProvider": null,
  "mxServer": null,
  "hasSpf": null,
  "hasDmarc": null,
  "isDisposable": null,
  "isRoleAccount": null,
  "telegramHandle": "durov",
  "telegramEntityType": "channel",
  "telegramTitle": "Pavel Durov ✔",
  "telegramExtra": "10 124 257 subscribers",
  "telegramBio": "Views are my own.",
  "websiteEmails": null,
  "websitePhones": null,
  "websiteSocials": null,
  "latencyMs": 298,
  "checkedAt": "2026-11-05T10:30:00.000Z"
}
```

#### 4. Business Website Contact & Social Enrichment (`recordType: "website"`)

```json
{
  "recordType": "website",
  "input": "https://crawlee.dev",
  "isValid": true,
  "summary": "Scanned 1 pages on crawlee.dev: found 0 emails, 0 phones, 2 socials",
  "e164": null,
  "formattedInternational": null,
  "countryCode": null,
  "lineType": null,
  "isMobileCapable": null,
  "whatsappDirectLink": null,
  "telegramDirectLink": null,
  "email": null,
  "domain": "crawlee.dev",
  "mailProvider": "Google Workspace / Gmail",
  "mxServer": "aspmx.l.google.com",
  "hasSpf": true,
  "hasDmarc": true,
  "isDisposable": null,
  "isRoleAccount": null,
  "telegramHandle": null,
  "telegramEntityType": null,
  "telegramTitle": "Crawlee · Build reliable crawlers. Fast.",
  "telegramExtra": null,
  "telegramBio": null,
  "websiteEmails": null,
  "websitePhones": null,
  "websiteSocials": "https://www.twitter.com/apify, https://www.youtube.com/apify",
  "latencyMs": 84,
  "checkedAt": "2026-11-05T10:30:00.000Z"
}
```

# Actor input Schema

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

List of phone numbers to validate with ITU-T line-type intelligence (distinguishes MOBILE vs FIXED_LINE landline, filters fake 555 ranges, standardizes E.164). Also auto-detects emails, @telegram handles, or website URLs if mixed in.

## `emails` (type: `array`):

Email addresses or company domains to verify via live DNS MX mail server records, SPF/DMARC security policies, mail provider identification (Google Workspace, Microsoft 365, Yandex 360), and disposable email blocking.

## `telegramHandles` (type: `array`):

Telegram @usernames or t.me/ links to verify existence and extract public title, bio, subscriber/member count, entity type (user/channel/group/bot), and avatar.

## `websites` (type: `array`):

Company website URLs or domains (e.g. from Google Maps or 2GIS). Crawls homepage & /contact pages to extract verified emails, phone numbers, embedded wa.me WhatsApp Business links, Telegram channels, LinkedIn, and Instagram.

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

2-letter ISO country code used when parsing national phone numbers without a '+' prefix (e.g. US, KZ, GB, DE).

## `concurrency` (type: `integer`):

Number of simultaneous verification threads (1 to 50).

## Actor input object example

```json
{
  "phoneNumbers": [
    "+77015554433",
    "+14158575310",
    "+14155552671"
  ],
  "emails": [
    "support@apify.com",
    "fake@mailinator.com"
  ],
  "telegramHandles": [
    "@telegram",
    "@durov"
  ],
  "websites": [
    "https://apify.com"
  ],
  "defaultCountry": "US",
  "concurrency": 10
}
```

# Actor output Schema

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

Default dataset containing normalized and validated leads

# 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": [
        "+77015554433",
        "+14158575310",
        "+14155552671"
    ],
    "emails": [
        "support@apify.com",
        "fake@mailinator.com"
    ],
    "telegramHandles": [
        "@telegram",
        "@durov"
    ],
    "websites": [
        "https://apify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rollan_dev/omnicheck-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 = {
    "phoneNumbers": [
        "+77015554433",
        "+14158575310",
        "+14155552671",
    ],
    "emails": [
        "support@apify.com",
        "fake@mailinator.com",
    ],
    "telegramHandles": [
        "@telegram",
        "@durov",
    ],
    "websites": ["https://apify.com"],
}

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

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

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

```

## CLI example

```bash
echo '{
  "phoneNumbers": [
    "+77015554433",
    "+14158575310",
    "+14155552671"
  ],
  "emails": [
    "support@apify.com",
    "fake@mailinator.com"
  ],
  "telegramHandles": [
    "@telegram",
    "@durov"
  ],
  "websites": [
    "https://apify.com"
  ]
}' |
apify call rollan_dev/omnicheck-validator --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OQxOYNb6BMKV3riYc/builds/RCOUBYHh3jBfwc3mq/openapi.json
