# Job Change Detection + Email Verifier (`aidenix/email-intel`) Actor

Detect job changes from a list of work emails: is the contact still at the company, or did they leave and where do they work now. Plus email verification (catch-all aware), address age, disposable/role checks and data breach exposure. CRM data decay in one call. No names returned.

- **URL**: https://apify.com/aidenix/email-intel.md
- **Developed by:** [Aidenix Data](https://apify.com/aidenix) (community)
- **Categories:** Lead generation, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Job Change Detection + Email Verifier

**Most email verifiers tell you the mailbox accepts mail. This one also tells you whether the right person is still reading it.**

Job change detection for B2B contact lists: get job change alerts on your CRM, find every contact who left the company, and stop CRM data decay before the next campaign.

A work address can be perfectly deliverable and still dead for you: the person left, the mailbox was kept or forwarded, and your email lands with someone who never asked for it. Catch-all domains (Google Workspace, Microsoft 365) make it worse — every verifier answers "unknown".

For every address you get, in one row:

| Layer | What you learn |
|---|---|
| **Mailbox** | valid / invalid / catch-all, MX provider, typo suggestion |
| **Person** | is the person still at the company behind the domain? If not — where they work now and their current title, seniority, department, decision-maker flag, last 5 career steps |
| **Authenticity** | how old the address is, disposable, role account (info@, sales@), risk the address was made up |
| **Breaches** | how many known data breaches the address appears in, which ones, latest year, leaked data types, infostealer malware hits |
| **Verdict** | send / caution / don't send, with a score and a one-line reason |

### Example

| Email | Mailbox | Person | Works now at | Verdict |
|---|---|---|---|---|
| …@ives.mn | valid | **left** | GitLab, Engineering Manager | caution — the mailbox works, but the person has moved |
| …@grafana.com | catch-all | still there | Grafana Labs, Senior Software Engineer | send |

### Who it is for

- **Outbound and RevOps** — clean a list before a campaign, and turn "left the company" into a warm lead at their new employer.
- **CRM hygiene** — find contacts who changed jobs without anyone noticing.
- **Sign-up and fraud checks** — flag brand-new, disposable or never-seen-before addresses.
- **AI agents** — one call returns everything about a contact; works through Apify MCP.

### Pricing

Two simple charges, and you only pay for answers:

| Event | Price | When |
|---|---|---|
| Email checked | **$3 / 1,000** | every address we return a result for — mailbox, authenticity, breaches |
| Person identified | **+$20 / 1,000** | only when we know the person behind the address — still there or moved, where and as whom |

A typical list of work emails comes to about **$12 per 1,000** (we identify roughly half). A list of personal mailboxes (gmail.com etc.) is about **$3 per 1,000**. Errors are free. Set a maximum cost per run in Apify and the run stops there.

### Data notes

- Person and career data come from a pre-built index of hundreds of millions of professional profiles, refreshed monthly; the most recent 1–3 months of job changes can be missing.
- We recognise the person behind roughly a third to a half of work emails. Personal mailboxes (gmail.com etc.) get mailbox, authenticity and breach layers.
- Breach data shows *that* an address was exposed and what kind of data leaked — never the leaked data itself. `breach_sources` lists which breach databases answered for that address; if none did, the row says "not checked" instead of a false "0 breaches".
- Breach lookups powered by [XposedOrNot](https://xposedornot.com) and [LeakCheck](https://leakcheck.io).
- No names, social profile links or phone numbers are returned. People can opt out at any time.

# Actor input Schema

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

Email addresses to check, one per line (or a JSON array via API). Duplicates and lines without '@' are skipped. Work emails (name@company.com) return the most: mailbox status plus job change detection — still there, or moved and to which company and title. Personal mailboxes (gmail.com etc.) get mailbox, authenticity and breach checks only. Example: \["torkel@grafana.com"]

## Actor input object example

```json
{
  "emails": [
    "torkel@grafana.com",
    "hello@stripe.com"
  ]
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (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 = {
    "emails": [
        "torkel@grafana.com",
        "hello@stripe.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aidenix/email-intel").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 = { "emails": [
        "torkel@grafana.com",
        "hello@stripe.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("aidenix/email-intel").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 '{
  "emails": [
    "torkel@grafana.com",
    "hello@stripe.com"
  ]
}' |
apify call aidenix/email-intel --silent --output-dataset

```

## MCP server setup

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

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/e4gQpDwnzoeT6j4r4/builds/az1ODzI07RtHiMXXo/openapi.json
