# Domain Search (`tomba-io/domain-search`) Actor

Find every email for any domain  the fastest, largest domain-wide discovery engine, crawling 2 billion pages every month, with advanced email extractors that return rich contact data and company profiles.

- **URL**: https://apify.com/tomba-io/domain-search.md
- **Developed by:** [Tomba io](https://apify.com/tomba-io) (community)
- **Categories:** Lead generation, SEO tools, Open source
- **Stats:** 36 total users, 0 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.12 / 1,000 api requests

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Tomba Domain Search

[![Price](https://img.shields.io/badge/Price-%240.00312%20per%2010%20results-brightgreen)](#pricing)
[![No signup](https://img.shields.io/badge/Tomba%20account-not%20needed-blue)](#quick-start)
[![No rate limit](https://img.shields.io/badge/Rate%20limit-none-brightgreen)](#built-for-big-lists)

**Find the verified email addresses of the people behind any company website.** Paste a list of domains or company names and get the professional emails Tomba knows for each company, with names, job titles, departments, LinkedIn profiles, verification status, mobile phone numbers on demand and a full company profile, ready to export.

No Tomba account. No API key. No subscription. **You pay $0.00312 for every 10 results you request, plus $0.0156 for each address that comes with phone data when you ask for mobile numbers, and only when we find the company.**

### Why teams choose this Actor

- **Start in 30 seconds**: Open the Actor, paste your domains or company names, click Start. Nothing to sign up for
- **No domain? No problem**: Search by company name (`Stripe`) and Tomba finds the website for you
- **Mobile numbers on demand**: Turn on `enrichMobile` to get each person's phone numbers next to their email
- **Pay only for results**: Unknown domains, errors and invalid inputs are free
- **$0.312 per 1,000 emails**: One credit ($0.00312) covers 10 requested results. No monthly plan, no credits that expire
- **Verified contacts, not guesses**: Every email comes with its verification status, a confidence score and the public sources where it was found
- **Target the right people**: Filter by department (sales, engineering, marketing, executive and 18 more) and by country
- **Built for big lists**: No rate limit. Thousands of domains run in parallel
- **Never pay twice**: Pages you fetched in the last 24 hours come back from cache for free
- **Export anywhere**: Download as CSV, Excel or JSON, or send results straight to your CRM with Apify integrations

### Promises we actually keep

- **Less than 5% bounce rate** — Every email is verified in real time before you're charged.
- **Highest coverage on the market** — 81% email coverage. That's 2x more valid emails than the next best competitor. We find contacts others simply can't.

### What you can do with it

| Goal                        | How Domain Search helps                                                         |
| --------------------------- | ------------------------------------------------------------------------------- |
| **Build prospect lists**    | Turn a list of target accounts into named contacts with verified emails         |
| **Reach decision-makers**   | Filter by department to get only executives, sales or engineering leaders       |
| **Account-based marketing** | Map the team at each target account before your campaign starts                 |
| **Recruit talent**          | Find engineers, designers or sales people at the companies you hire from        |
| **Enrich your CRM**         | Add contacts, titles, LinkedIn profiles and company details to existing records |
| **Call, not just email**    | Add mobile numbers to your prospect list with one checkbox                      |

### Quick start

1. Click **Try for free**
2. Paste your domains into **Domains** (for example `stripe.com`, `tomba.io`), or company names into **Company names** (for example `Stripe`)
3. Click **Start**, then download your results as CSV, Excel or JSON

That's it. No Tomba account or API key is needed.

### Input

| Field                | Required | Default | Description                                                                         |
| -------------------- | -------- | ------- | ----------------------------------------------------------------------------------- |
| `domains`            | Yes\*    |         | Company domains to search. URLs like `https://www.stripe.com/jobs` are cleaned up   |
| `companies`          | Yes\*    |         | Company names to search instead of a domain, e.g. `Stripe`                          |
| `maxEmailsPerDomain` | No       | `10`    | Maximum number of emails to return per domain (1–100)                               |
| `limit`              | No       | `"10"`  | Emails per page request: `"10"`, `"20"` or `"50"`. Costs 1, 2 or 5 credits per page |
| `department`         | No       |         | Only return people from one department, e.g. `sales`, `engineering`, `executive`    |
| `country`            | No       |         | Only return people from one country, as a two-letter code, e.g. `US`                |
| `page`               | No       | `1`     | First page to fetch. Use it to continue a list you already started                  |
| `enrichMobile`       | No       | `false` | Also return each person's phone numbers. +5 credits per address with phone data     |
| `webhookUrl`         | No       |         | A URL (`http://` or `https://`) Tomba also sends every search result to             |
| `includeCompanyInfo` | No       | `true`  | Include the company profile (`organization`) in each result                         |
| `maxConcurrency`     | No       | `10`    | How many domains to process at the same time (1–50)                                 |
| `maxRetries`         | No       | `3`     | How many times to retry a temporary failure (0–10)                                  |
| `useCache`           | No       | `true`  | Reuse results from your previous runs for free                                      |
| `cacheTtlHours`      | No       | `24`    | How long cached results stay valid (`0` turns the cache off)                        |

\* Provide `domains`, `companies` or both. Each domain and each company name is one search.

Available departments: `accounting`, `administrative`, `communication`, `diversity`, `education`, `engineering`, `executive`, `facilities`, `finance`, `healthcare`, `hr`, `it`, `legal`, `management`, `marketing`, `operations`, `pr`, `sales`, `security`, `software`, `support`, `warehouse`.

```json
{
    "domains": ["stripe.com", "shopify.com"],
    "companies": ["Tomba"],
    "maxEmailsPerDomain": 50,
    "limit": "50",
    "department": "sales",
    "country": "US",
    "enrichMobile": true
}
```

### Output

You get one row per domain or company name, with the company profile and the list of emails found:

```json
{
    "domain": "stripe.com",
    "organization": {
        "website_url": "stripe.com",
        "organization": "Stripe",
        "location": {
            "country": "US",
            "city": "San Francisco",
            "state": "California",
            "street_address": "354 Oyster Point Blvd",
            "postal_code": "94080"
        },
        "social_links": {
            "twitter_url": "https://twitter.com/stripe",
            "linkedin_url": "https://www.linkedin.com/company/stripe"
        },
        "phone_number": "+1 415 298 5539",
        "industries": "Information Technology and Services",
        "founded": "2010",
        "company_size": "5K-10K",
        "company_type": "privately held",
        "revenue": "$100M-$250M",
        "description": "Stripe is a payment processing platform enabling businesses to accept payments online."
    },
    "emails": [
        {
            "email": "jane@stripe.com",
            "first_name": "Jane",
            "last_name": "Natoli",
            "full_name": "Jane Natoli",
            "position": "Financial Crimes Analyst",
            "department": "finance",
            "seniority": "senior",
            "type": "personal",
            "country": "US",
            "linkedin": "https://www.linkedin.com/in/janenatoli",
            "phone_number": true,
            "phone_data": [{ "number": "+14155550123", "type": "mobile" }],
            "score": 99,
            "verification": { "date": "2025-09-13T00:00:00+02:00", "status": "valid" },
            "sources": [
                {
                    "uri": "https://stripe.com/about",
                    "extracted_on": "2024-01-01T00:00:00+02:00",
                    "last_seen_on": "2025-09-01T00:00:00+02:00",
                    "still_on_page": true
                }
            ]
        }
    ],
    "phoneNumbers": 1,
    "meta": { "total": 1250, "pageSize": 10, "current": 1, "total_pages": 125 },
    "pages": 1,
    "chargedRequests": 1,
    "chargedCredits": 6,
    "charged": true,
    "cached": false
}
```

| Field                 | Description                                                                                                                  |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `company`             | The company name you submitted (company searches only)                                                                       |
| `domain`              | The domain you submitted (cleaned up). For a company name: the company's domain, when Tomba reports it                       |
| `organization`        | Company profile: name, description, industry, size, revenue, founding year, address, phone and social links                  |
| `emails`              | The emails found. Each one has the name, position, department, seniority, country, LinkedIn, score, verification and sources |
| `emails[].phone_data` | The person's phone numbers (only with `enrichMobile`)                                                                        |
| `phoneNumbers`        | How many phone numbers were returned across all emails (only with `enrichMobile`)                                            |
| `meta`                | Paging information, including `total`: how many emails Tomba knows for this domain with your filters                         |
| `pages`               | How many pages of results were fetched for this domain                                                                       |
| `chargedRequests`     | How many of those pages were billed                                                                                          |
| `chargedCredits`      | Credits billed for this search ($0.00312 each)                                                                               |
| `charged`             | `true` if at least one page was billed for this domain                                                                       |
| `cached`              | `true` if every page came from the cache (free)                                                                              |
| `error`               | Why no results were returned, if applicable                                                                                  |

The dataset has three ready-made views: **Domain Search Results**, **Individual Emails** and **Company Information**.

### Pricing

**One credit costs $0.00312.** No subscription and no Tomba account needed.

Each page of results costs:

- **1 credit per 10 results requested** with `limit`, rounded up. The default `limit` of 10 costs 1 credit, 20 costs 2 and 50 costs 5
- **plus 5 credits ($0.0156) for each returned address that has phone data**, only when you turn on `enrichMobile`. Without it, you never pay for phone data

| Page                                                         | Credits        | Cost     |
| ------------------------------------------------------------ | -------------- | -------- |
| `limit: "10"` (default)                                      | 1              | $0.00312 |
| `limit: "20"`                                                | 2              | $0.00624 |
| `limit: "50"`                                                | 5              | $0.0156  |
| `limit: "10"` + `enrichMobile`, 3 addresses with phone data  | 1 + 3 × 5 = 16 | $0.04992 |
| `limit: "10"` + `enrichMobile`, no addresses with phone data | 1              | $0.00312 |

The Actor fetches pages one after another until it reaches `maxEmailsPerDomain` or runs out of emails. A domain with fewer emails than `maxEmailsPerDomain` needs fewer pages and costs less. A search by company name costs exactly the same as a search by domain.

You are only charged when Tomba returns a usable answer:

| What happens                                                 | Charged                                                        |
| ------------------------------------------------------------ | -------------------------------------------------------------- |
| A page of emails is returned                                 | Yes: the page credits (plus phone credits with `enrichMobile`) |
| The company is found but has no emails matching your filters | Yes: the page credits only                                     |
| The domain is unknown to Tomba                               | No                                                             |
| Invalid domain or any other error                            | No                                                             |
| Temporary failure (it is retried automatically)              | No                                                             |
| Result served from the cache                                 | No                                                             |

Every row shows `pages`, `chargedRequests`, `chargedCredits`, `charged` and `cached`, so you always know what you paid for. To cap your spend, set **Maximum cost per run** in the run options: the Actor stops cleanly when the limit is reached.

### Built for big lists

- **No rate limit**: up to 50 domains are processed at the same time
- **Automatic paging**: the Actor fetches as many pages as needed to reach your `maxEmailsPerDomain`
- **Automatic retries**: temporary failures are retried for you, and never billed
- **Resumable**: if a run is interrupted, it continues where it stopped without charging you again
- **Cache**: repeat lookups within 24 hours are free

### Real-time API

Need results instantly inside your own app? This Actor also runs as a **real-time API** (Apify Standby mode): no run to start, no dataset to fetch, just an HTTP request that returns JSON in seconds. Pricing is the same.

```bash
curl "https://<your-standby-url>/?domain=stripe.com&company=Shopify&maxEmailsPerDomain=20&department=engineering" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>"
```

You can also `POST` the same JSON input as a normal run:

```bash
curl -X POST "https://<your-standby-url>/" \
  -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["stripe.com"], "companies": ["Shopify"], "maxEmailsPerDomain": 20, "enrichMobile": true}'
```

The response is `{ "items": [...] }`, with the same rows as the dataset. Find your Standby URL and the full OpenAPI description in the **API** tab of this Actor.

### Integrations

Run it on a schedule, call it from the Apify API, or connect it to Zapier, Make, Google Sheets, HubSpot, Slack and hundreds of other apps with [Apify integrations](https://docs.apify.com/platform/integrations). Webhooks let you trigger your own workflow as soon as a run finishes.

### FAQ

**Do I need a Tomba account or API key?**
No. Everything is built in. You only pay for the credits you use on Apify.

**How much does it cost?**
1 credit ($0.00312) per 10 results requested with `limit`, rounded up, so the default `limit` of 10 costs 1 credit. If you turn on `enrichMobile`, add 5 credits ($0.0156) for each returned address with phone data. Unknown domains, errors and cached lookups are free.

**Can I get phone numbers too?**
Yes. Turn on `enrichMobile` and every email that has a known phone number comes with a `phone_data` list, and each row shows the total in `phoneNumbers`. You pay 5 extra credits ($0.0156) only for addresses that actually come back with phone data.

**I only have company names, not domains. Does it work?**
Yes. Put them in `companies` (for example `Stripe`) and Tomba finds the company's domain for you. You can mix `domains` and `companies` in the same run.

**Can results be pushed to my own system?**
Yes. Set `webhookUrl` and Tomba also sends each search result to that URL. You can also use Apify integrations and webhooks to react when the run finishes.

**How many emails can I get per company?**
Up to 100 per domain with `maxEmailsPerDomain`. The `meta.total` field tells you how many emails Tomba knows for that company.

**Why was I charged for a company with no emails?**
Tomba found the company and returned its profile, but no emails matched your filters. That is still a real answer, so it counts as one page. Domains Tomba doesn't know at all are free.

**Can I target a specific team?**
Yes. Use `department` (for example `sales`, `marketing` or `executive`) and `country` (for example `US`) to get only the people you want to reach.

**What domain format should I use?**
Anything works: `stripe.com`, `www.stripe.com` or `https://stripe.com/jobs`. We clean it up and remove duplicates. Company names are trimmed and deduplicated too.

**How many domains can I search in one run?**
As many as you like. Domains are processed in parallel and there is no rate limit.

**What if my run is interrupted?**
It picks up where it stopped. Domains already processed are not charged again.

**How do I limit what I spend?**
Set **Maximum cost per run** before you start. The Actor stops as soon as the limit is reached.

**Is the data GDPR compliant?**
Tomba only collects publicly available professional information and follows GDPR guidelines.

### Support

Questions or feedback? We're happy to help:

- **Email**: support@tomba.io
- **Live chat**: on [tomba.io](https://tomba.io) during business hours
- **Issues**: use the **Issues** tab on this Actor's page

### About Tomba

Founded in 2020, [Tomba](https://tomba.io) is a B2B data platform for finding, verifying and enriching business contacts. Our Email Finder, Domain Search and Email Verifier help sales and marketing teams reach the right people.

![Tomba Logo](https://tomba.io/logo.png)

# Changelog

This Actor's version history is a separate document: https://apify.com/tomba-io/domain-search/changelog.md

# Actor input Schema

## `domains` (type: `array`):

Company domains to search for email addresses, e.g. stripe.com. URLs are cleaned up and duplicates removed. Provide domains, company names, or both.

## `companies` (type: `array`):

Company names to search instead of a domain, e.g. Stripe. Tomba resolves the company to its domain. Provide domains, company names, or both.

## `maxEmailsPerDomain` (type: `integer`):

Maximum number of emails to find per domain (applies to domain search)

## `includeCompanyInfo` (type: `boolean`):

Include additional company information when available

## `outputFormat` (type: `string`):

Format of the output data

## `page` (type: `integer`):

Page number for pagination

## `limit` (type: `string`):

Specifies the max number of email addresses to return

## `department` (type: `string`):

Get only email addresses for people working in the selected department

## `country` (type: `string`):

Two-letter country code to filter email addresses (e.g. 'US', 'GB', 'CA'). Lowercase is accepted.

## `enrichMobile` (type: `boolean`):

Also return each person's phone numbers (in emails\[].phone_data). Costs extra: 5 additional credits ($0.0156) for every returned address that comes with phone data. Addresses without phone data cost nothing extra.

## `webhookUrl` (type: `string`):

Optional URL that Tomba also POSTs each search result to. Results served from the cache are not sent again.

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

How many Tomba requests run in parallel. There is no rate limit, so raise it for large lists.

## `maxRetries` (type: `integer`):

How many times to retry a request after a network error, 429 or 5xx response (exponential backoff). Failed requests are never charged.

## `useCache` (type: `boolean`):

Reuse results from previous runs for identical requests. Cached results are free.

## `cacheTtlHours` (type: `integer`):

How long cached results stay valid. 0 disables the cross-run cache.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "tomba.io"
  ],
  "maxEmailsPerDomain": 10,
  "includeCompanyInfo": true,
  "outputFormat": "detailed",
  "page": 1,
  "limit": "10",
  "enrichMobile": false,
  "maxConcurrency": 10,
  "maxRetries": 3,
  "useCache": true,
  "cacheTtlHours": 24
}
```

# Actor output Schema

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

Email addresses found within the domain with contact information

# 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 = {
    "domains": [
        "stripe.com",
        "tomba.io"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tomba-io/domain-search").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 = { "domains": [
        "stripe.com",
        "tomba.io",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tomba-io/domain-search").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 '{
  "domains": [
    "stripe.com",
    "tomba.io"
  ]
}' |
apify call tomba-io/domain-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tomba-io/domain-search"
        }
    }
}
```

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/UBsCvDOlOQq1CrZQl/builds/Dx5lPkExb4yG0O6ta/openapi.json
