# Firefox Add-ons Email Scraper (`neuro-scraper/firefox-add-ons-email-scraper`) Actor

Firefox Add-ons Email Scraper SD - Firefox Add-ons Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from Firefox Add-ons results by keyword, location and email domain - Firefox Add-ons email extractor.

- **URL**: https://apify.com/neuro-scraper/firefox-add-ons-email-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

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

### Firefox Add-ons Email Scraper

The **Firefox Add-ons Email Scraper** builds a deduplicated contact list of add-on authors from what Google has already indexed on `addons.mozilla.org`.
It is aimed at partner recruitment, integration partnerships, agency sourcing and competitive research inside the Mozilla extension ecosystem.
No login, no API key, no browser automation — only public search results.

AMO is unusually generous to this kind of research because it exposes real author profile pages, not just product listings.
Mozilla also gives publishers an explicit optional **support email** field, and many add-on authors fill it in because users need a route to report bugs.
The Firefox Add-ons Email Scraper reads exactly that public text.

In our measured test runs the Firefox Add-ons Email Scraper attached an account identity to **10 of 10** sampled rows — the strongest identity rate in this family.
The reason is structural: AMO's user profile URLs are clean, human-readable and heavily indexed, so Google usually prints a handle next to the result.
Yield still varies with your keywords and domain filter.

#### Who the Firefox Add-ons Email Scraper is for

Developer-relations teams, SDK and API vendors, security researchers, privacy tooling companies, and agencies looking for contract extension engineers.
A firefox add-on developer email found this way belongs to a publisher who deliberately published a contact route for support and partnership enquiries.
Cross-browser teams normally pair this with the [Chrome Web Store Email Scraper](https://apify.com/leads-scraper/chrome-web-store-email-scraper), since most add-on authors ship to both browsers.

### What the Firefox Add-ons Email Scraper actually does

The Firefox Add-ons Email Scraper does **not** sign into AMO, use Mozilla's add-ons API, or open `addons.mozilla.org` in a browser.
It constructs Google queries with the `site:addons.mozilla.org` operator, fetches result pages through the Apify **GOOGLE_SERP** proxy using `aiohttp`, and parses each result block.
There is no headless browser, no JavaScript rendering, no authentication and no cookies.

Result blocks are located structurally — the parser finds the `<h3>` title, then the smallest surrounding block — rather than relying on Google's CSS class names.
A domain-filtered regex pulls addresses out of that block text, results are deduplicated globally, and each lead is pushed to the Apify dataset the moment it is found.
If Google changes its markup, a whole-page fallback parser keeps the run producing emails with less account detail instead of nothing at all.

That makes the Firefox Add-ons Email Scraper a **publicly indexed contact discovery** tool for the AMO author community.
It never reaches anything a visitor could not see in a search engine.

### Key features of the Firefox Add-ons Email Scraper

| Feature | What it means for your addons.mozilla.org contact list |
|---|---|
| `site:` targeting | Every query is scoped to `addons.mozilla.org`, so results stay inside AMO |
| Query expansion | Base, quoted and `intitle:` phrasings plus one variant per query modifier, per keyword x domain pair |
| AMO-tuned modifiers | Defaults are `email`, `contact`, `support`, `developer`, `publisher` — the words AMO listings and author profiles use |
| Domain filtering | Only addresses ending in your `customDomains` values survive; the leading `@` is optional |
| Global deduplication | Each address appears once per run, however many queries surfaced it |
| Obfuscation handling | Reads `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` |
| Junk filter | Discards placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character locals |
| Boundary-correct matching | `@gmail.com` never matches inside `@gmail.company` or `@gmail.com.br` |
| Soft-wrap repair | Drops a hit that is only the tail of another email in the same block |
| Async concurrency | An `asyncio` worker pool runs queries in parallel with a shared stop signal on `maxEmails` |
| Retries and backoff | Up to 3 attempts per page, exponential backoff, a fresh proxy session per request |
| Block detection | CAPTCHA, "unusual traffic" and consent pages are detected and retried, not treated as empty |
| Failed-query requeue | Blocked or failed queries get one more chance at the end of the run |
| Resumable state | Key-value store state keyed by an input hash, saved on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Fallback parser | Whole-page extraction if Google's layout shifts |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |

### How the Firefox Add-ons Email Scraper works, step by step

1. Reads input: keywords, location, email domains, and run limits.
2. Builds Google queries such as `site:addons.mozilla.org privacy add-on developer "@gmail.com"`.
3. Fetches Google result pages asynchronously through the Apify GOOGLE_SERP proxy.
4. Locates each organic result block structurally and reads its visible text.
5. Applies the domain filter, junk filter and soft-wrap repair to every candidate address.
6. Deduplicates globally and streams each new lead into the dataset immediately.

Base queries run before expanded ones, so the strongest matches from the Firefox Add-ons Email Scraper arrive first.
Stop a run early and you still keep the highest-signal rows rather than a random slice.
The shared stop signal halts every worker as soon as `maxEmails` is reached.

### Input reference for the Firefox Add-ons Email Scraper

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["add-on", "developer"]` | Search terms describing the add-on authors you want |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com","@yahoo.com"]` | Only emails on these domains are kept; `@` optional |
| `maxEmails` | integer 1-10000 | `20` | Stop after this many unique emails |
| `countryCode` | string | `""` | Two-letter country for the search proxy (US, GB, DE...) |
| `expandQueries` | boolean | `true` | Search each keyword x domain in several phrasings |
| `queryModifiers` | array | `["email","contact","support","developer","publisher"]` | Extra words combined with each keyword when expansion is on |
| `maxPagesPerQuery` | integer 1-50 | `30` | Page cap per query |
| `maxConcurrency` | integer 1-20 | `5` | Parallel queries |

#### Example input for the Firefox Add-ons Email Scraper

```json
{
  "keywords": [
    "privacy add-on",
    "ad blocker add-on developer",
    "firefox theme designer"
  ],
  "location": "",
  "customDomains": ["@gmail.com", "@protonmail.com"],
  "maxEmails": 250,
  "countryCode": "DE",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "support", "developer", "publisher"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

Match the vocabulary AMO itself uses. "add-on" outperforms "plugin", and "ad blocker add-on developer" outperforms "browser software company".
The Firefox Add-ons Email Scraper matches indexed page text, not a category tree.

### Output reference: what the Firefox Add-ons Email Scraper returns

Every dataset item includes all 14 fields.

| Field | Meaning |
|---|---|
| `network` | Platform name |
| `keyword` | The keyword that produced the lead |
| `query` | The exact Google query used |
| `title` | Raw result title |
| `accountName` | Account label Google prints |
| `fullName` | Display name parsed from a profile-style title; empty for non-profile results |
| `username` | URL-safe handle when the platform exposes one; otherwise `null` |
| `profileUrl` | Canonical account URL when a handle is known; otherwise empty |
| `url` | Direct platform link when exposed, else the profile URL |
| `description` | Bio/description snippet, cleaned of labels and counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain (e.g. `@gmail.com`) |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email |
| `foundAt` | ISO 8601 UTC timestamp |

#### Example output from the Firefox Add-ons Email Scraper

```json
[
  {
    "network": "Firefox Add-ons",
    "keyword": "privacy add-on",
    "query": "site:addons.mozilla.org privacy add-on \"@gmail.com\"",
    "title": "privacy-tools-lab - Firefox Add-ons User Profile",
    "accountName": "privacy-tools-lab",
    "fullName": "Privacy Tools Lab",
    "username": "privacy-tools-lab",
    "profileUrl": "https://addons.mozilla.org/en-US/firefox/user/privacy-tools-lab/",
    "url": "https://addons.mozilla.org/en-US/firefox/user/privacy-tools-lab/",
    "description": "We build open-source privacy add-ons. Support: privacytoolslab.dev@gmail.com",
    "email": "privacytoolslab.dev@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T10:04:19Z"
  },
  {
    "network": "Firefox Add-ons",
    "keyword": "ad blocker add-on developer",
    "query": "site:addons.mozilla.org ad blocker add-on developer contact \"@protonmail.com\"",
    "title": "Quiet Filter - Get this Extension for Firefox",
    "accountName": "Quiet Filter",
    "fullName": "",
    "username": "quietfilter",
    "profileUrl": "https://addons.mozilla.org/en-US/firefox/user/quietfilter/",
    "url": "https://addons.mozilla.org/en-US/firefox/addon/quiet-filter/",
    "description": "Lightweight filtering add-on. Report issues to quietfilter.dev@protonmail.com or...",
    "email": "quietfilter.dev@protonmail.com",
    "emailDomain": "@protonmail.com",
    "possiblyTruncated": true,
    "foundAt": "2026-08-31T10:05:47Z"
  }
]
```

Note the second row: `possiblyTruncated: true` because Google's ellipsis landed beside the address.
Filter those out — or verify them — before any of the Firefox Add-ons Email Scraper output reaches a sending tool.

### Use cases for the Firefox Add-ons Email Scraper

| Use case | How the Firefox Add-ons Email Scraper supports it |
|---|---|
| Cross-browser partner recruitment | Find AMO authors who have not yet shipped to other stores and offer porting support |
| Developer relations and SDK adoption | Build a reachable list of add-on authors for your SDK, auth provider or telemetry library |
| Integration partnerships | Spot add-ons adjacent to your product and open an integration conversation |
| Agency and contractor sourcing | Surface independent firefox extension developer leads available for contract work |
| Open-source maintainer outreach | Reach maintainers about sponsorship, grants or a security disclosure |
| Competitive and market research | Map who publishes in a niche, with a contact route for interviews |
| Beta and research recruiting | Invite active authors into a private beta, survey or developer programme |
| Acquisition sourcing | Locate small add-on publishers who list a direct business contact |

These are B2B ecosystem contacts, not consumer prospects.
Reference the specific add-on in your first line and a Firefox Add-ons Email Scraper list behaves far more like a partner pipeline than cold outbound.
Mozilla's author community is small and interconnected, so relevance matters more here than volume.

### Tuning the Firefox Add-ons Email Scraper for better yield

Broaden `customDomains` first. The AMO community skews open-source and privacy-minded, so `@protonmail.com`, `@proton.me`, `@posteo.de` and `@tutanota.com` are worth adding next to the defaults.
Company domains work too — put `@acme.io` or `example.com` in the list and only those addresses are kept.

Keep `expandQueries` enabled. Google caps a single query at roughly 300 results, and expansion is how the Firefox Add-ons Email Scraper reaches past that ceiling.
Add AMO-native words to `queryModifiers` — `addon`, `extension`, `theme`, `homepage`, `author` — to open new query surface.

Use `countryCode` for regional weighting; AMO has a strong European author base, so `DE`, `FR` and `PL` often return authors that a US-weighted run misses.
Raise `maxConcurrency` for speed on paid plans, and rely on resumable state if a run migrates mid-flight.
Pairing with the [GitHub Email Scraper](https://apify.com/leads-scraper/github-email-scraper) is effective here, because most Firefox add-ons are open source and link a repository.

### Expected results and honest limitations of the Firefox Add-ons Email Scraper

- The Firefox Add-ons Email Scraper only finds authors whose email is **publicly visible in Google's index**. Mozilla makes the support email optional, so publishers who left it blank will not appear.
- Google caps a single query at roughly 300 results. Query expansion mitigates this; it does not remove it.
- `username` and `profileUrl` are populated only when Google's result exposes a handle. Some rows carry `accountName` and `fullName` with an empty `username` and `profileUrl` — a Google limitation, not a bug.
- `possiblyTruncated: true` means Google's snippet ellipsis touched the address. Verify those rows before sending.
- The Actor requires the Apify **GOOGLE_SERP** proxy and cannot run without Apify proxy credentials.
- Free Apify plans are capped at **100 emails per run**; paid plans are uncapped.
- Results vary with keywords, domains, country and location. No volume is guaranteed.

The Firefox Add-ons Email Scraper is not affiliated with, endorsed by or supported by Mozilla.
It reads public Google search results only.

### Legal and ethical use of Firefox Add-ons Email Scraper output

The Actor collects public data; how you use it is your responsibility.
A published support address does not by itself grant a lawful basis for bulk marketing under GDPR, CAN-SPAM or CASL — most AMO authors are European, so GDPR is the default assumption.
Identify yourself, keep the message relevant to the add-on, and honour opt-outs immediately.

### FAQ about the Firefox Add-ons Email Scraper

#### Does the Firefox Add-ons Email Scraper log into addons.mozilla.org?

No. It never authenticates, never opens AMO and never touches Mozilla's API. It reads publicly indexed Google search results only.

#### Where do the emails the Firefox Add-ons Email Scraper returns come from?

From the visible text of Google result blocks — titles, snippets and site labels — for pages on `addons.mozilla.org`.

#### Why does AMO give such strong account identity?

Because AMO publishes readable user profile URLs that Google indexes well, so a handle is usually present. In our sample the Firefox Add-ons Email Scraper resolved an identity on 10 of 10 rows.

#### Why does the Firefox Add-ons Email Scraper sometimes return `username: null` anyway?

When Google prints only a display name with no handle, the row keeps `accountName`, `fullName`, `description` and the email, but `username` is `null` and `profileUrl` is empty.

#### How many emails can one Firefox Add-ons Email Scraper run return?

`maxEmails` accepts 1 to 10000. Free Apify plans stop at 100 emails per run; paid plans are uncapped. Real yield depends on your keywords and domain filter.

#### What does `possiblyTruncated` mean in Firefox Add-ons Email Scraper output?

Google cut the snippet with an ellipsis right at the email, so the address may be incomplete. Treat those rows as needing verification.

#### Can I schedule the Firefox Add-ons Email Scraper?

Yes. Apify Schedules can re-run it weekly. Deduplication is per run, so diff each dataset against your CRM to catch newly published AMO author contact list entries.

#### Can the Firefox Add-ons Email Scraper target company domains instead of free mailboxes?

Yes. Any domain can go into `customDomains`, with or without the `@`. Boundary-correct matching prevents false positives such as `@gmail.company`.

#### Do I need a proxy to run the Firefox Add-ons Email Scraper?

Yes. It runs on the Apify GOOGLE_SERP proxy and will not work without Apify proxy credentials.

#### Is a Firefox Add-ons Email Scraper run resumable?

Yes. State is persisted in the key-value store keyed by a hash of your input and saved on Apify's `PERSIST_STATE`, `MIGRATING` and `ABORTING` events.

#### Why did my Firefox Add-ons Email Scraper run return fewer results than expected?

Usually a narrow domain filter or generic keywords. Broaden `customDomains`, add AMO-native terms to `queryModifiers`, and keep `expandQueries` on.

#### Are these consumer contacts?

No. They are add-on publishers, open-source maintainers and agencies who published a support or developer address. Frame outreach as partnership, not consumer prospecting.

#### How do I export Firefox Add-ons Email Scraper results?

Through the standard Apify dataset export: JSON, CSV, Excel, XML or the Apify API.

### Related Actors

| Actor | What it collects |
|---|---|
| [Firefox Add-ons Email and Phone Number Scraper](https://apify.com/neuro-scraper/firefox-add-ons-email-and-phone-number-scraper) | Emails and phone numbers from Firefox Add-ons |
| [Firefox Add-ons Phone Number Scraper](https://apify.com/neuro-scraper/firefox-add-ons-phone-number-scraper) | Public phone numbers from Firefox Add-ons |
| [App Store Email Scraper](https://apify.com/leads-scraper/app-store-email-scraper) | Public contact emails from App Store |
| [Atlassian Marketplace Email Scraper](https://apify.com/leads-scraper/atlassian-marketplace-email-scraper) | Public contact emails from Atlassian Marketplace |
| [Bitbucket Email Scraper](https://apify.com/neuro-scraper/bitbucket-email-scraper) | Public contact emails from Bitbucket |
| [Chrome Web Store Email Scraper](https://apify.com/leads-scraper/chrome-web-store-email-scraper) | Public contact emails from Chrome Web Store |
| [CodePen Email Scraper](https://apify.com/neuro-scraper/codepen-email-scraper) | Public contact emails from CodePen |
| [Confluence Email Scraper](https://apify.com/neuro-scraper/confluence-email-scraper) | Public contact emails from Confluence |
| [Dev.to Email Scraper](https://apify.com/neuro-scraper/dev-to-email-scraper) | Public contact emails from DEV Community |
| [Docker Hub Email Scraper](https://apify.com/neuro-scraper/docker-hub-email-scraper) | Public contact emails from Docker Hub |
| [Figma Community Email Scraper](https://apify.com/neuro-scraper/figma-community-email-scraper) | Public contact emails from Figma Community |
| [GitHub Email Scraper](https://apify.com/leads-scraper/github-email-scraper) | Public contact emails from GitHub |
| [GitLab Email Scraper](https://apify.com/neuro-scraper/gitlab-email-scraper) | Public contact emails from GitLab |
| [Google Play Email Scraper](https://apify.com/leads-scraper/google-play-email-scraper) | Public contact emails from Google Play |
| [Hashnode Email Scraper](https://apify.com/neuro-scraper/hashnode-email-scraper) | Public contact emails from Hashnode |
| [HubSpot Marketplace Email Scraper](https://apify.com/leads-scraper/hubspot-marketplace-email-scraper) | Public contact emails from HubSpot Marketplace |
| [Hugging Face Email Scraper](https://apify.com/leads-scraper/hugging-face-email-scraper) | Public contact emails from Hugging Face |
| [Jira Email Scraper](https://apify.com/neuro-scraper/jira-email-scraper) | Public contact emails from Jira |
| [Maven Central Email Scraper](https://apify.com/neuro-scraper/maven-central-email-scraper) | Public contact emails from Maven Central |
| [Microsoft AppSource Email Scraper](https://apify.com/neuro-scraper/microsoft-appsource-email-scraper) | Public contact emails from Microsoft AppSource |
| [Salesforce AppExchange Email Scraper](https://apify.com/leads-scraper/salesforce-appexchange-email-scraper) | Public contact emails from Salesforce AppExchange |
| [Shopify App Store Email Scraper](https://apify.com/leads-scraper/shopify-app-store-email-scraper) | Public contact emails from Shopify App Store |
| [Slack App Directory Email Scraper](https://apify.com/leads-scraper/slack-app-directory-email-scraper) | Public contact emails from Slack App Directory |
| [SourceForge Email Scraper](https://apify.com/leads-scraper/sourceforge-email-scraper) | Public contact emails from SourceForge |
| [Stack Overflow Email Scraper](https://apify.com/leads-scraper/stack-overflow-email-scraper) | Public contact emails from Stack Overflow |
| [Unity Asset Store Email Scraper](https://apify.com/leads-scraper/unity-asset-store-email-scraper) | Public contact emails from Unity Asset Store |
| [Unreal Engine Marketplace Email Scraper](https://apify.com/leads-scraper/unreal-engine-marketplace-email-scraper) | Public contact emails from Unreal Engine Marketplace |
| [WordPress Plugin Directory Email Scraper](https://apify.com/neuro-scraper/wordpress-plugin-directory-email-scraper) | Public contact emails from WordPress Plugin Directory |
| [WordPress Theme Directory Email Scraper](https://apify.com/leads-scraper/wordpress-theme-directory-email-scraper) | Public contact emails from WordPress Theme Directory |
| [Zapier App Directory Email Scraper](https://apify.com/leads-scraper/zapier-app-directory-email-scraper) | Public contact emails from Zapier App Directory |
| [App Store Email and Phone Number Scraper](https://apify.com/leads-scraper/app-store-email-and-phone-number-scraper) | Emails and phone numbers from App Store |
| [Atlassian Marketplace Email and Phone Number Scraper](https://apify.com/neuro-scraper/atlassian-marketplace-email-and-phone-number-scraper) | Emails and phone numbers from Atlassian Marketplace |
| [Bitbucket Email and Phone Number Scraper](https://apify.com/neuro-scraper/bitbucket-email-and-phone-number-scraper) | Emails and phone numbers from Bitbucket |
| [Chrome Web Store Email and Phone Number Scraper](https://apify.com/neuro-scraper/chrome-web-store-email-and-phone-number-scraper) | Emails and phone numbers from Chrome Web Store |
| [CodePen Email and Phone Number Scraper](https://apify.com/neuro-scraper/codepen-email-and-phone-number-scraper) | Emails and phone numbers from CodePen |
| [Confluence Email and Phone Number Scraper](https://apify.com/neuro-scraper/confluence-email-and-phone-number-scraper) | Emails and phone numbers from Confluence |
| [DEV Community Email and Phone Number Scraper](https://apify.com/neuro-scraper/dev-to-email-and-phone-number-scraper) | Emails and phone numbers from DEV Community |
| [Docker Hub Email and Phone Number Scraper](https://apify.com/neuro-scraper/docker-hub-email-and-phone-number-scraper) | Emails and phone numbers from Docker Hub |
| [Figma Community Email and Phone Number Scraper](https://apify.com/neuro-scraper/figma-community-email-and-phone-number-scraper) | Emails and phone numbers from Figma Community |
| [GitHub Email and Phone Number Scraper](https://apify.com/leads-scraper/github-email-and-phone-number-scraper) | Emails and phone numbers from GitHub |
| [GitLab Email and Phone Number Scraper](https://apify.com/neuro-scraper/gitlab-email-and-phone-number-scraper) | Emails and phone numbers from GitLab |
| [Google Play Email and Phone Number Scraper](https://apify.com/leads-scraper/google-play-email-and-phone-number-scraper) | Emails and phone numbers from Google Play |

### Leave a review

If the Firefox Add-ons Email Scraper saved you time, please leave a star rating and a short
review on the Actor page.

Reviews are how other buyers judge whether a tool works, and they tell us which features to
build next.

If something did not work, email <neurodata.apify@gmail.com>
instead - bugs get fixed faster than they get complained about.

### Support

Questions, a bug report or a custom build of the Firefox Add-ons Email Scraper? Email **neurodata.apify@gmail.com**.

# Actor input Schema

## `keywords` (type: `array`):

Search terms describing the Firefox Add-ons accounts you want (niche, job title, industry).

## `location` (type: `string`):

Optional location phrase added to every query (e.g. "New York").

## `customDomains` (type: `array`):

Only emails ending with one of these domains are collected. With or without the leading @. Each domain is searched separately, so more domains means more results but a longer run - remove some for a faster, narrower search, or add your own (e.g. @company.com).

## `maxEmails` (type: `integer`):

Stop once this many unique emails have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for Firefox Add-ons.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

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

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "add-on",
    "developer"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "support",
    "developer",
    "publisher"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Firefox Add-ons Email Scraper, stored in the run's default dataset.

# 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 = {
    "keywords": [
        "add-on",
        "developer"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "support",
        "developer",
        "publisher"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/firefox-add-ons-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 = {
    "keywords": [
        "add-on",
        "developer",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "support",
        "developer",
        "publisher",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/firefox-add-ons-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 '{
  "keywords": [
    "add-on",
    "developer"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "support",
    "developer",
    "publisher"
  ]
}' |
apify call neuro-scraper/firefox-add-ons-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/firefox-add-ons-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/RW2szZLIEQdqWN4MA/builds/Ebtd2ev7szyeBqemu/openapi.json
