# X (Twitter) Email Scraper | $0.00015/User | Pay-Per-Result (`xquik/x-email-scraper`) Actor

Twitter email finder. Get the emails X accounts publish on their profiles, from $0.00015 per delivered profile. Check handles, scan followers or search users. Phones & links come too. No X login. World's fastest & cheapest X (Twitter) scraper service. Not affiliated with X Corp.

- **URL**: https://apify.com/xquik/x-email-scraper.md
- **Developed by:** [Xquik](https://apify.com/xquik) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00015 / profiles

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

**English** ·
[Español](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.es.md)
·
[Türkçe](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.tr.md)
·
[简体中文](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.zh-CN.md)
·
[日本語](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.ja.md)
·
[한국어](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.ko.md)
·
[Deutsch](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.de.md)
·
[Français](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.fr.md)
·
[Italiano](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-email-scraper/README.it.md)

[![Framer connects Xquik MCP to coding agents](https://img.youtube.com/vi/4UOSpoOoC3Y/maxresdefault.jpg)](https://youtu.be/4UOSpoOoC3Y?t=367)\
[Watch how Framer uses Xquik scrapers](https://youtu.be/4UOSpoOoC3Y?t=367)
with Claude Code, Codex, Cursor & more, from 6:07.

Xquik is the world's fastest & cheapest X (Twitter) scraper service with the
most complete X data. Xquik's X Email Scraper gets the emails accounts publish
on their own X profiles, with no X cookies or login. Most other Apify Actors
charge before filtering or deduplicating. Xquik charges only for delivered,
unique, filter-matching results.

Paste usernames, scan an account's followers or search X users, & get every
profile that publishes an email, with the email first. A profile without an
email is not delivered & costs nothing. You pay **$0.00015 per delivered row**,
& Apify bills platform usage separately.

> Xquik is an independent third-party service. Not affiliated with X Corp.
> "Twitter" and "X" are trademarks of X Corp.

### Contact details in every row

- The first email the profile publishes, lowercased.
- That email's domain & the profile field that holds it, which is the bio, name
  or location.
- Every email of the profile, also when it is spelled "name \[at] site \[dot]
  com".
- Phone numbers the profile publishes, such as a WhatsApp link.
- The profile's website & bio links, each with its network, such as LinkedIn,
  GitHub or Telegram.
- The full public profile, with name, bio, counts, verification, dates & images.
- 3 sources in 1 run, which are accounts, their followers or following, & user
  searches.
- Filters by email domain, business email, followers, account age, bio &
  location.
- Usernames with or without @, `x.com` & `twitter.com` URLs & numeric user IDs.
- Duplicate removal before billing.
- JSON, CSV, Excel, XML & RSS exports through Apify datasets.
- Runs resume from saved state after an Apify migration.

### How to get emails from X profiles

New to Apify?
[Create a free account](https://console.apify.com/sign-up?fpr=xquik) first. The
free plan needs no credit card & gives $5 to spend each month. At $0.00015 per
profile, $5 pays for up to 33,000 profiles before platform usage. Then come back
here & press Try for free.

1. Open Xquik's X Email Scraper in Apify Console.
2. Paste usernames, profile URLs or user IDs into `twitterHandles`, or add
   `searchTerms`.
3. Turn on `expandFollowers` to scan each account's followers instead.
4. Set `maxItems` to cap delivered rows, then click Start.
5. Download the dataset as JSON, CSV or Excel, or use the Apify API.

You enter no X cookies, login or API key at any step.

### Input

`twitterHandles` takes every form of an account, in any mix. The run checks each
account & delivers the ones that publish an email.

```json
{
  "twitterHandles": ["sample_user", "@sample_org", "https://x.com/sample_shop"],
  "maxItems": 1000
}
```

`startUrls` & `userIds` take the same forms. With `expandFollowers`, the run
reads the followers of each account instead & keeps the ones that publish an
email. `expansionRelation` picks `Followers` or `Following`.

```json
{
  "twitterHandles": ["sample_org"],
  "expandFollowers": true,
  "expansionRelation": "Followers",
  "maxScan": 10000,
  "emailDomains": "example.com, example.org"
}
```

`searchTerms` searches X users by name, username or bio words. Each term is 1
search.

```json
{
  "searchTerms": ["booking", "founder"],
  "businessEmailOnly": true,
  "minFollowers": 1000
}
```

About 1 follower in 400 publishes an email, so a followers scan reads far more
profiles than it delivers. `maxScan` caps the profiles the run reads of each
list or search. It starts at 10,000. The run status says how many rows it read
when it stops a list there, & you raise `maxScan` to read further. Scanned
profiles are free.

`emailDomains` keeps profiles with an email at a listed domain or a subdomain of
one. `businessEmailOnly` keeps profiles with an email outside free webmail, such
as Gmail. `minFollowers`, `maxFollowers`, `minAccountAgeDays`, `verifiedOnly`,
`hasWebsite`, `hasLocation`, `bioContains` & `locationContains` narrow the
profiles further. Every filter applies before billing.

`searchQueries` & `keyword` work as other names for `searchTerms`, &
`maxFollowersPerHandle` as another name for `maxScan`. An account the input
names twice is delivered & charged once. Small runs that go well skip
`run-report` & save Apify usage. Turn on `alwaysSaveRunRecords` to write it on
every run.

#### Migrate from another email Actor

Paste the input you already use. Xquik's X Email Scraper reads these field names
of other Actors. Each line names their fields, then the field they map to.

- `requireEmail` needs no field. Every delivered profile publishes an email.
- `requireWebsite` maps to `hasWebsite`. It keeps a profile with any link in its
  website field, & the run status says so.
- `bioKeywords` maps to `bioContains`. Any 1 of its terms may match.
- `locationKeywords` with 1 value maps to `locationContains`. More values stop
  the run before any read or charge.
- `emailDomains` as a list maps to `emailDomains`.
- `outputEmail`, `resolveShortLinks` need no field. Every row carries its emails
  & X's full links.
- `findEmails`, `extractEmails` need no field. Rows carry the emails a profile
  publishes on X. The run status says the Actor reads no linked site.
- `validateEmails` needs no field. The run status says emails come as published,
  since the Actor checks no mailbox.

When you set one of these names & its canonical field, the canonical value wins.
The run log names the field that lost.

### Output

Each profile that publishes an email is 1 dataset row. The contact details come
first, in `email`, `emailDomain`, `emailSource` & `contactInfo`. The full public
profile follows, with `id`, `username`, `name`, `description`, `followers`,
`following`, `verified`, `verifiedType`, `createdAt`, `profilePicture` & more.
Missing source fields stay absent. Xquik's X Email Scraper invents no values.

Examples use sample values. Results reflect live data. A row looks like this.

```json
{
  "email": "press@example.com",
  "emailDomain": "example.com",
  "emailSource": "bio",
  "contactInfo": {
    "emails": [
      {
        "value": "press@example.com",
        "domain": "example.com",
        "source": "bio"
      },
      {
        "value": "jane@example.org",
        "domain": "example.org",
        "source": "bio",
        "writtenAs": "jane [at] example [dot] org"
      }
    ],
    "phones": [
      {
        "value": "+14155550123",
        "source": "bio",
        "writtenAs": "+1 (415) 555-0123"
      }
    ],
    "links": [
      { "url": "https://example.com", "network": "website", "source": "url" }
    ]
  },
  "id": "1234567890",
  "username": "sample_user",
  "name": "Sample User",
  "description": "Press: press@example.com",
  "followers": 1200,
  "verified": true,
  "createdAt": "2017-03-21T20:50:14.000Z",
  "resultType": "profile",
  "sourceTarget": "sample_user"
}
```

`resultType` is `profile` for an account or a search result, `profileFollower`
for a follower & `profileFollowing` for an account someone follows.
`sourceTarget` names the account or the search term the row came from.

### What the email means

An email is an address the account wrote on its own profile, in its bio, its
name or its location. The Actor returns it as the account published it &
lowercases it. Nothing checks that the address receives mail, & nothing reads
the website a profile links to. `writtenAs` holds the account's own spelling
when it differs, as in "jane \[at] example \[dot] org".

A phone number appears only when the profile writes it in a form that can be
nothing else, such as a WhatsApp link or a number that starts with +. A year, a
count or a price is never read as a phone number.

### How much does it cost to get emails from X profiles?

Every Apify plan costs $0.00015 per delivered row. Apify bills your platform
usage separately.

For more volume, [pick an Apify plan](https://apify.com/pricing?fpr=xquik) with
more prepaid usage.

- One charge per delivered data row. Diagnostics are free in `diagnostics`.
- No start or lookup fee.
- A profile without an email adds no row & no charge.
- An account X does not have adds no row & no charge.
- Deduplication runs before billing.
- Apify maximum-total-charge settings cap delivered rows.

A followers scan runs for a while to find few rows, since it reads about 350
profiles a second & keeps about 1 in 400. `maxScan` bounds that time.

### Limits & recovery

Xquik's X Email Scraper reads many accounts, lists & searches in 1 run.
Delivered rows & progress survive an Apify restart. The Actor adds no time limit
of its own. It respects any Apify timeout you set.

The run status names the accounts X has no match for & says to check the handle,
ID or URL. It also names suspended accounts. Interrupted extraction writes a
free `partial` diagnostic. Available results stay intact. Read
`availableResults`, `failedTargets`, `retryable` & `nextAction` before you
retry. A successful Actor exit confirms delivery, not complete extraction.

The run status names every cause of an early stop. `stopCauses` lists each cause
with its own `message`, `retryable` & `nextAction`. The causes are `scan_limit`,
`target_not_found`, `target_suspended`, `target_failed` & `deadline_reached`. A
missing or suspended target or a list stopped at `maxScan` joins the list only
when another cause stopped the run. The run is `retryable` when any cause is.

A list the run stops at `maxScan` ends no run early. A run with rows finishes, &
its status says how many rows it read & to raise `maxScan`. It writes no
diagnostic for that, which saves you a record write. A run report counts such
lists in `scanLimitedTargets`.

### Related Xquik Actors

Every Xquik Actor shares the same extraction engine, filter-first billing &
diagnostics. Pick the one that matches the data you need.

- [X Tweet Scraper](https://apify.com/xquik/x-tweet-scraper) scrapes tweets from
  searches, profile timelines, Lists & tweet IDs with 50+ filters & flat
  exports. Use it when you need tweet data without analysis. From $0.00015 per
  row.
- [X Profile Scraper](https://apify.com/xquik/x-profile-scraper) scrapes
  profiles plus their posts, replies, media & followers from handles, IDs or
  URLs. Use it when you start from accounts rather than searches. From $0.00015
  per row.
- [X Reply Scraper](https://apify.com/xquik/x-reply-scraper) scrapes replies,
  comments & whole conversations under posts with 25+ filters. Use it when you
  need the discussion beneath tweets. From $0.00015 per row.
- [X Engagement Scraper](https://apify.com/xquik/x-engagement-scraper) scrapes
  replies, quotes, retweeters & threads for post URLs or IDs in bulk. Use it
  when you measure who engaged with posts. From $0.00015 per row.
- [X Quote Tweets Scraper](https://apify.com/xquik/x-quote-tweets-scraper)
  scrapes the quote tweets of posts with text, media, counts, authors & 11
  filters. Use it when you study who quoted posts & what they said. From
  $0.00015 per tweet.
- [X Follower Scraper](https://apify.com/xquik/x-follower-scraper) scrapes
  followers, following, List members, subscribers & Community members as profile
  rows. Use it when you need audience or member lists. From $0.00015 per
  profile.
- [X User Search Scraper](https://apify.com/xquik/x-user-search-scraper)
  searches users by handle, bio & location with follower, verification, age &
  location filters. Use it when you build account lists from search. From
  $0.00015 per profile.
- [X Account Location Scraper](https://apify.com/xquik/x-account-location-scraper)
  checks where accounts are based with X's "Account based in" label, "connected
  via" & username changes. Use it when you vet where accounts are based. From
  $0.00015 per account.
- [X List Scraper](https://apify.com/xquik/x-list-scraper) scrapes List posts,
  members & followers from List URLs or IDs. Use it when a curated List defines
  your sources. From $0.00015 per row.
- [X Community Scraper](https://apify.com/xquik/x-community-scraper) scrapes
  Community info, posts, searches, members & moderators. Use it when your
  sources are X Communities. From $0.00015 per row.
- [X Space Scraper](https://apify.com/xquik/x-space-scraper) finds Spaces by
  keyword & reads their titles, states, times, listener counts, hosts &
  speakers. It also reads broadcasts by URL or ID. Use it when you track live
  audio & video on X. From $0.00015 per Space or broadcast.
- [X Trends Scraper](https://apify.com/xquik/x-trends-scraper) scrapes real-time
  trends by location with rank, volume, query & WOEID. Use it when you track
  what is trending where. From $0.00015 per trend.
- [X Jobs Scraper](https://apify.com/xquik/x-job-scraper) scrapes X job listings
  by keyword, place, workplace, seniority & company, with salaries & apply
  links. Use it when you collect job openings posted on X. From $0.00015 per
  job.
- [X Article Scraper](https://apify.com/xquik/x-article-scraper) scrapes
  long-form X Articles as Markdown & text with covers, authors, dates & metrics.
  Use it when you need article bodies, not tweets. From $0.00015 per article.
- [X Media Downloader](https://apify.com/xquik/x-media-downloader) extracts or
  stores photos, videos & GIFs from posts or profiles with MP4 & metadata
  options. Use it when you need the media files themselves. From $0.00015 per
  media row.
- [X (Twitter) Brand Monitoring with AI Analysis](https://apify.com/xquik/x-twitter-brand-monitoring)
  tracks brand mentions with AI relevance, sentiment & customer-experience
  answers & compares runs. Use it when you watch a brand over time. From $0.0003
  per analyzed tweet.
- [X Tweet Sentiment Analysis with AI](https://apify.com/xquik/x-tweet-sentiment-analysis)
  labels attitude, intensity & sarcasm probability for every tweet with AI. Use
  it when you need general sentiment on any topic. From $0.0003 per analyzed
  tweet.
- [X (Twitter) Stock & Crypto AI Trading Signals](https://apify.com/xquik/x-twitter-stock-crypto-signals)
  labels bullish, bearish, neutral or mixed stance, content type, conviction &
  asset relevance with AI. Use it when you follow stocks, crypto or trading
  talk. From $0.0003 per analyzed tweet.
- [X (Twitter) News Monitor with AI Analysis](https://apify.com/xquik/x-twitter-news-monitor)
  labels news posts by format, source attribution & topic relevance with AI. Use
  it when you separate reporting from commentary. From $0.0003 per analyzed
  tweet.
- [X Tweet Classifier with AI Analysis](https://apify.com/xquik/x-twitter-tweet-classifier)
  answers your own category, score & yes/no questions for every tweet with AI.
  Use it when the preset analyses do not fit your labels. From $0.0003 per
  analyzed tweet.
- [X Tweet Viral Score Analyzer with AI](https://apify.com/xquik/x-tweet-viral-score-analyzer)
  estimates a Viral Score from 0 to 100 & a verdict for every tweet from 8 AI
  trait answers. Use it when you study why tweets spread or flop. From $0.0003
  per analyzed tweet.

### FAQ

Answers to common questions, then where to get help.

#### Do I need X cookies, an API key or a login?

No. Xquik's X Email Scraper needs no X cookies, API key, login or credentials.
Every read runs on Xquik's infrastructure.

#### Where do the emails come from?

They come from the profile itself, in the bio, the name & the location the
account wrote. The Actor reads no post & no linked website, so every email is
one the account published on its own X profile.

#### Does the Actor check that an email works?

No. It returns each address as the account published it. Nothing checks that the
address receives mail.

#### Why did a followers scan deliver few rows?

About 1 follower in 400 publishes an email. The run status says how many rows
the run read. Raise `maxScan` to read further into a list, or use `searchTerms`
with words such as booking, which keep far more rows.

#### How many profiles can I check in 1 run?

As many as you paste. A run can return 100,000 rows & more. Raise `maxItems`
above the 1,000 the form starts with for a larger list.

#### Is it legal to collect emails from X profiles?

Xquik's X Email Scraper requests public X fields. Results contain personal data.
Confirm a lawful purpose, follow the privacy & email rules that apply to you &
honor opt-outs. Ask qualified counsel when uncertain.

#### Why did my run return no results?

Read the run status first. An empty run's status says to check the handle, ID or
URL of each account X has no match for. A profile without an email adds no row.
The free `diagnostics` output appears when something needs attention. Its
`stopCauses` gives each cause a `nextAction` to follow.

#### Can I use the API, schedules & integrations?

Yes. Use the Apify API or the Xquik REST API. The
[API tab](https://apify.com/xquik/x-email-scraper/api) has Python, JavaScript &
cURL examples. Apify [schedules](https://docs.apify.com/platform/schedules) run
Xquik's X Email Scraper on a cron. Agents use
[Apify MCP](https://docs.apify.com/platform/integrations/mcp). Use `latest`
unless you need an older build.

#### Where do I get help?

Open an issue in the
[Issues tab](https://apify.com/xquik/x-email-scraper/issues) with the run ID.
Free diagnostics in the key-value store explain runs that need attention. A run
that gets no row back says why in its status.

#### Can I get a custom solution?

Yes. Describe what you need in the
[Issues tab](https://apify.com/xquik/x-email-scraper/issues). Xquik also offers
a dashboard, a REST API, an MCP server & webhooks. Find Xquik's website on its
[Apify profile](https://apify.com/xquik).

# Changelog

This Actor's version history is a separate document: https://apify.com/xquik/x-email-scraper/changelog.md

# Actor input Schema

## `twitterHandles` (type: `array`):

Usernames with or without @, x.com or twitter.com profile URLs, or numeric user IDs, in any mix.

## `startUrls` (type: `array`):

Public x.com or twitter.com profile URLs. Use strings or {"url":"..."} objects. For example, \["https://x.com/Dexerto", {"url":"https://x.com/PopBase"}].

## `userIds` (type: `array`):

Numeric X user IDs.

## `expandFollowers` (type: `boolean`):

Read the followers or following of each account instead of the account itself, & keep the ones that publish an email.

## `expansionRelation` (type: `string`):

Which list of each account to scan.

## `searchTerms` (type: `array`):

Search X users by name, username or bio words, such as booking or founder. Each term is 1 search.

## `maxScan` (type: `integer`):

Profiles to read of each followers list or search before the run stops it. About 1 follower in 400 publishes an email, so a scan reads far more rows than it delivers. Scanned rows are free.

## `maxItems` (type: `integer`):

Global cap on delivered profiles. The form starts at 1,000. A run can return 100,000 rows & more, so raise it for a full job.

## `emailDomains` (type: `string`):

Only include users with an email at one of these domains. Separate domains with commas. Subdomains match. For example, acme.com, stanford.edu.

## `businessEmailOnly` (type: `boolean`):

Only include users who publish an email outside free webmail, such as Gmail.

## `minFollowers` (type: `integer`):

Keep profiles with at least this many followers.

## `maxFollowers` (type: `integer`):

Keep profiles with at most this many followers.

## `minAccountAgeDays` (type: `integer`):

Keep profiles at least this old.

## `verifiedOnly` (type: `boolean`):

Keep only verified profiles.

## `hasWebsite` (type: `boolean`):

Keep only profiles that also name a website.

## `hasLocation` (type: `boolean`):

Keep only profiles that also name a location.

## `bioContains` (type: `string`):

Keep profiles whose bio contains any of these words, ignoring case. Separate words with commas.

## `locationContains` (type: `string`):

Keep profiles whose location contains this text.

## `hasEmail` (type: `boolean`):

Always on here, since every delivered profile publishes an email. Kept for inputs that carry it.

## `verifiedType` (type: `string`):

Keep profiles with this verification type. Kept out of the form. An input that holds it filters by it.

## `usernameContains` (type: `string`):

Keep profiles whose username contains this text. Kept out of the form. An input that holds it filters by it.

## `minFollowing` (type: `integer`):

Keep profiles that follow at least this many accounts. Kept out of the form. An input that holds it filters by it.

## `maxFollowing` (type: `integer`):

Keep profiles that follow at most this many accounts. Kept out of the form. An input that holds it filters by it.

## `minStatuses` (type: `integer`):

Keep profiles with at least this many posts. Kept out of the form. An input that holds it filters by it.

## `maxStatuses` (type: `integer`):

Keep profiles with at most this many posts. Kept out of the form. An input that holds it filters by it.

## `blueVerifiedOnly` (type: `boolean`):

Keep profiles with X's blue mark. Kept out of the form. An input that holds it filters by it.

## `searchQueries` (type: `array`):

Another name for User Searches, for inputs that use it.

## `keyword` (type: `string`):

Another name for 1 user search, for inputs that use it.

## `maxFollowersPerHandle` (type: `integer`):

Another name for Maximum Profiles Scanned Per List, for inputs that use it.

## `dedupeAcrossTargets` (type: `boolean`):

Remove repeated canonical rows before billing.

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

How many accounts or searches to read at once. The default is the fastest safe setting.

## `fields` (type: `array`):

Keep only these fields in each row. Pick names or type your own. Use a dot for a field inside an object, such as accountBasedIn.value. Columns arrive in the order & spelling you write. Every row keeps its id. Leave empty for every field. The price per row stays the same. A wrong name stops the run before it reads, at no charge. If names cannot be checked, the run reads on & lists unseen names last.

## `omitFields` (type: `array`):

Drop these fields & keep the rest. Every row keeps its id.

## `renameFields` (type: `array`):

Give a field a new column name. The key is the field. The value is the new name. A renamed field becomes a top-level column.

## `flatten` (type: `boolean`):

Turn each nested object into top-level columns, such as accountBasedInValue. Lists stay lists. Use it for CSV & spreadsheets.

## `fillMissingFields` (type: `boolean`):

With Fields to keep, a field a row lacks arrives as null. Every row then has the same columns. Turn it off to leave such fields out.

## `joinFields` (type: `array`):

Turn each of these lists into 1 text value. Use it for CSV cells.

## `joinSeparator` (type: `string`):

Text between the items of a joined list.

## `constantFields` (type: `array`):

Add a column with the same text on every row. The key is the column name, such as campaign. The value is its text.

## `alwaysSaveRunRecords` (type: `boolean`):

Save run-report on every run. When off, small runs that go well skip it & cost less.

## Actor input object example

```json
{
  "twitterHandles": [
    "chartdata",
    "@PopBase",
    "https://x.com/Dexerto"
  ],
  "startUrls": [
    "https://x.com/Dexerto",
    {
      "url": "https://x.com/PopBase"
    }
  ],
  "expandFollowers": false,
  "expansionRelation": "Followers",
  "maxScan": 10000,
  "maxItems": 1000,
  "emailDomains": "acme.com",
  "businessEmailOnly": false,
  "verifiedOnly": false,
  "hasWebsite": false,
  "hasLocation": false,
  "bioContains": "founder",
  "dedupeAcrossTargets": true,
  "maxConcurrency": 100,
  "flatten": false,
  "fillMissingFields": true,
  "joinSeparator": ", ",
  "alwaysSaveRunRecords": false
}
```

# Actor output Schema

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

Unique delivered rows. Filters and deduplication run before billing.

## `diagnostics` (type: `string`):

Free actionable diagnostics, written only when something needs attention. They cover partial, invalid, aborted & recovered runs. An empty run whose filters removed rows writes 1 too. A run that read every target & got no row back writes none. A partial diagnostic lists each stop cause in stopCauses. Real results remain in the dataset.

## `runReport` (type: `string`):

Outcome, completion reason, counts, duration, and privacy-safe anomalies. A run writes it when it hits a problem, is large or has Always save run records on. Small runs that go well skip it & state the outcome in their status.

# 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 = {
    "twitterHandles": [
        "chartdata",
        "@PopBase",
        "https://x.com/Dexerto"
    ],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("xquik/x-email-scraper").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 = {
    "twitterHandles": [
        "chartdata",
        "@PopBase",
        "https://x.com/Dexerto",
    ],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("xquik/x-email-scraper").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 '{
  "twitterHandles": [
    "chartdata",
    "@PopBase",
    "https://x.com/Dexerto"
  ],
  "maxItems": 1000
}' |
apify call xquik/x-email-scraper --silent --output-dataset

```

## MCP server setup

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

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/Q1mDMCQT3j0Th3kjK/builds/uTSc9ZBuihu426sfn/openapi.json
