# Bitbucket Email Scraper (`neuro-scraper/bitbucket-email-scraper`) Actor

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

- **URL**: https://apify.com/neuro-scraper/bitbucket-email-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 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

### Bitbucket Email Scraper - public contact emails from Bitbucket workspaces and repositories

The **Bitbucket Email Scraper** is an Apify Actor that collects publicly indexed contact emails connected to Bitbucket workspaces, projects and repositories. Feed it keywords, an optional location and your email domains, and it returns a structured dataset of leads.

One thing to know before you run it: **Bitbucket results identify the workspace that owns a repository, so rows usually carry a team or project name rather than a personal profile URL.** That is how Bitbucket is structured and how Google indexes it.

In practice that makes the Bitbucket Email Scraper a team-and-vendor discovery tool more than a person-finder. If you want individual engineers, run the [GitHub Email Scraper](https://apify.com/leads-scraper/github-email-scraper) or the [GitLab Email Scraper](https://apify.com/neuro-scraper/gitlab-email-scraper) alongside it.

#### Where the emails actually come from

Developers publish addresses in `README` files, `CONTRIBUTING` and `SECURITY` docs, package manifests, issue threads and static sites hosted on `bitbucket.io`. The Bitbucket Email Scraper finds those addresses only when Google has already indexed the page.

It does **not** read git history, clone repositories, or use the Bitbucket API. There is no login, no app password, no browser, no JavaScript rendering and no cookies.

This matters because Atlassian does not publish workspace administrator contact details - their own guidance is to open a support ticket. Everything this Actor returns is an address someone chose to publish on a public page.

#### Who the Bitbucket Email Scraper is built for

Agencies and vendors prospecting engineering teams, developer relations programmes mapping who ships what, security researchers looking for a disclosure address, and partnership teams identifying organisations working in their category.

Because the unit of discovery is the workspace, the Bitbucket Email Scraper is strongest for **account-based outreach** - reaching a team - rather than individual candidate sourcing.

***

### Key features of the Bitbucket Email Scraper

| Feature | What it does |
|---|---|
| Google `site:` dorking | Queries `bitbucket.org` and `bitbucket.io` through the Apify GOOGLE_SERP proxy |
| Query expansion | Base, quoted and `intitle:` variants plus one variant per query modifier; base queries run first |
| Domain-filtered extraction | Keeps only emails ending in your `customDomains` values |
| Global deduplication | One row per unique email address across every query and page |
| Obfuscation handling | Understands `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` |
| Junk filter | Rejects 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 | Discards a hit that is only the tail of another email in the same result block |
| Structural parsing | Locates the `<h3>` title then the smallest surrounding block, not Google's CSS class names |
| Whole-page fallback | A Google markup change degrades the run to "emails without account details", not "no emails" |
| Block detection | CAPTCHA, "unusual traffic" and consent pages are detected and retried rather than treated as empty |
| Retries and backoff | Up to 3 attempts per page, exponential backoff, a fresh proxy session per request |
| Requeue of failures | Blocked or failed queries are re-queued once at the end of the run |
| Async concurrency | An `asyncio` worker pool with a shared stop signal on `maxEmails` |
| Resumable state | Key-value-store progress keyed by an input hash, with throttled saves plus saves on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Streaming output | Leads reach the dataset as they are found, so an aborted run keeps what it collected |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |

***

### How the Bitbucket Email Scraper works

The Bitbucket Email Scraper pipeline is six steps, with no authentication anywhere in it.

1. It reads your input: keywords, location, email domains and limits.
2. It builds Google queries with the `site:` operator, for example `site:bitbucket.org team contact "@gmail.com"`.
3. It fetches Google result pages asynchronously with `aiohttp` through the Apify GOOGLE_SERP proxy.
4. It parses each result block structurally, finding the `<h3>` title and the smallest block around it.
5. It extracts emails from the block text using a domain-filtered regex.
6. It deduplicates globally and pushes each lead immediately into the Apify dataset.

#### Why query expansion is on by default

Google caps a single query at roughly 300 results, so one query has a hard ceiling no matter how many pages you allow.

Query expansion gets the Bitbucket Email Scraper past that ceiling by combining each keyword with each email domain in several phrasings, each variant carrying its own result budget.

The default `queryModifiers` for this Actor - `email`, `contact`, `maintainer`, `author`, `support` - reflect the words that appear near addresses in repository documentation.

#### What the Bitbucket Email Scraper does not do

No Bitbucket login, no app password, no Bitbucket API, no repository cloning, no commit-history parsing, no JavaScript rendering. It is an independent Apify Actor, not affiliated with or endorsed by Bitbucket or Atlassian.

***

### Bitbucket Email Scraper input fields

Only `keywords` is required by the Bitbucket Email Scraper. All defaults below come from the Actor's shipped input schema.

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["developer", "team"]` | Search terms describing the Bitbucket accounts you want (niche, job title, industry) |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com", "@yahoo.com"]` | Only emails on these domains are kept; the leading `@` is 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 pair in several phrasings |
| `queryModifiers` | array | `["email", "contact", "maintainer", "author", "support"]` | 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 Bitbucket Email Scraper input

```json
{
  "keywords": ["mobile development team", "java consultancy", "devops team"],
  "location": "Sydney",
  "customDomains": ["@gmail.com", "@outlook.com"],
  "maxEmails": 300,
  "countryCode": "AU",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "maintainer", "author", "support"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Tuning the Bitbucket Email Scraper

Team-shaped keywords work better in the Bitbucket Email Scraper than person-shaped ones. `android agency`, `qa automation team` and `erp integration partner` match how workspaces describe themselves.

Add domains before adding keywords when a run comes back thin - each extra domain multiplies the number of distinct queries and the total result budget.

Leave `expandQueries` on. Switching it off reduces the Bitbucket Email Scraper to one query per keyword and domain pair and caps out fast.

***

### Bitbucket Email Scraper output fields

Every dataset item the Bitbucket Email Scraper writes carries all 14 fields. Values are empty or `null` when Bitbucket did not expose them in Google's result - they are never dropped.

| 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 - on Bitbucket usually the workspace or team name |
| `fullName` | Display name parsed from a profile-style title; empty for repository and doc pages |
| `username` | URL-safe workspace handle when one is exposed; otherwise `null` |
| `profileUrl` | Canonical `https://bitbucket.org/{username}/` URL when a handle is known; otherwise empty |
| `url` | Direct platform link when exposed, else the profile URL |
| `description` | Snippet text, cleaned of labels and engagement counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain, for example `@gmail.com` |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email - verify before sending |
| `foundAt` | ISO 8601 UTC timestamp |

#### Example Bitbucket Email Scraper output

```json
[
  {
    "network": "Bitbucket",
    "keyword": "mobile development team",
    "query": "site:bitbucket.org mobile development team \"@gmail.com\" \"Sydney\"",
    "title": "harbourline / harbourline-android - README",
    "accountName": "harbourline",
    "fullName": "",
    "username": "harbourline",
    "profileUrl": "https://bitbucket.org/harbourline/",
    "url": "https://bitbucket.org/harbourline/harbourline-android",
    "description": "Android team repo. Build questions and integration requests to harbourline.dev@gmail.com",
    "email": "harbourline.dev@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T11:21:04.552Z"
  },
  {
    "network": "Bitbucket",
    "keyword": "java consultancy",
    "query": "site:bitbucket.org java consultancy contact \"@gmail.com\"",
    "title": "Meridian Systems - Repositories",
    "accountName": "Meridian Systems",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "https://bitbucket.org/meridian-systems/meridian-core/src/master/CONTRIBUTING.md",
    "description": "Maintained by Meridian Systems. Support and licensing enquiries: meridian.systems.dev@gmail.com",
    "email": "meridian.systems.dev@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T11:21:18.907Z"
  },
  {
    "network": "Bitbucket",
    "keyword": "devops team",
    "query": "site:bitbucket.io devops team support \"@outlook.com\"",
    "title": "Pipeline Docs - Support",
    "accountName": "Pipeline Docs",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "https://cobaltworks.bitbucket.io/pipeline-docs/support/",
    "description": "Deployment questions go to cobalt.pipelines@outlook.com. Please include your build ...",
    "email": "cobalt.pipelines@outlook.com",
    "emailDomain": "@outlook.com",
    "possiblyTruncated": true,
    "foundAt": "2026-08-31T11:21:47.330Z"
  }
]
```

Two of these three rows have `username: null` and an empty `profileUrl`. That is the realistic shape of Bitbucket Email Scraper output, not an unlucky sample - see the coverage section below.

***

### Use cases for the Bitbucket Email Scraper

| Use case | How the Bitbucket Email Scraper helps |
|---|---|
| Account-based prospecting | Identify engineering teams and consultancies by technology and reach the address they publish |
| Vendor and partner discovery | Find agencies shipping code in your category, with a contact route already on the page |
| Developer relations | Map which teams build on your stack before a launch or integration push |
| Security disclosure | Collect published security and support addresses for projects you depend on |
| Open-source outreach | Reach maintainers listed in `README`, `CONTRIBUTING` and `SECURITY` docs |
| Developer lead generation | Feed a devtools or API pipeline with teams matching a technical niche |
| Competitive research | See which organisations keep public repositories in a given ecosystem |
| Recruitment research | Spot teams active in a technology, then source individuals elsewhere |

#### Account-based outreach beats candidate sourcing here

Because the workspace is the unit Google exposes, the Bitbucket Email Scraper naturally produces team-level leads: a consultancy, a product squad, an open-source org.

That makes the Bitbucket Email Scraper genuinely useful for B2B prospecting and partnership work. It is a poor fit if your goal is a named engineer with a personal profile URL.

#### Combining with sibling Actors

Run the Bitbucket Email Scraper for team discovery, then the [Atlassian Marketplace Email Scraper](https://apify.com/leads-scraper/atlassian-marketplace-email-scraper) and the [Jira Email Scraper](https://apify.com/neuro-scraper/jira-email-scraper) to cover the rest of the Atlassian ecosystem those teams live in.

***

### Expected results from the Bitbucket Email Scraper

Live Bitbucket Email Scraper runs against Google produced an unusual split. Every parsed result carried **some** account identity - **10 out of 10 rows had an `accountName`** - but only about **1 in 10 resolved to a usable profile URL**.

The reason is the yield note above: Bitbucket results identify the workspace that owns a repository, so what you get is a team or project name, frequently without a canonical handle Google exposes cleanly.

Read this as a feature of the platform, not a defect of the Actor. You will reliably learn *who owns the code and how to email them*; you will not reliably get a personal profile link.

***

### Limitations of the Bitbucket Email Scraper

- **Workspace, not person.** Bitbucket results identify the workspace that owns a repository, so rows usually carry a team or project name rather than a personal profile URL. Plan your outreach around teams.
- **Publicly indexed emails only.** An address is findable only when it is already visible in Google's index. Private repositories and unindexed pages are out of reach.
- **No git history, no Bitbucket API.** Commit author emails and API responses are never read. Only Google result titles and snippets are parsed.
- **Google's ~300-result cap.** One query returns roughly 300 results at most, which is why `expandQueries` exists and why disabling it lowers volume.
- **`possiblyTruncated`.** When `true`, Google's snippet ellipsis touched the email and it may be cut off. Verify those rows before sending.
- **`username` and `profileUrl` are frequently empty.** They are populated only when Bitbucket exposes a handle in the result, which on this platform is the minority case. `accountName` is the field to rely on.
- **Apify GOOGLE_SERP proxy required.** The Bitbucket Email Scraper cannot run without Apify proxy credentials.
- **Free plan cap.** Free Apify plans are limited to 100 emails per run; paid plans are uncapped.
- **Variable results.** Output depends on keywords, domains and location, and Google's index changes over time.

***

### Responsible use

The addresses the Bitbucket Email Scraper returns were published for project correspondence - bug reports, security disclosures, integration and support questions.

If you contact people in the EU or UK, GDPR applies. Have a lawful basis, identify yourself, say where you found the address, and honour opt-outs immediately.

Team inboxes are still read by people. Respect platform norms, keep outreach relevant and specific, and never treat a published support address as a bulk marketing list.

***

### Bitbucket Email Scraper FAQ

#### Why do so many rows have no profile URL?

Because Bitbucket results identify the workspace that owns a repository, so rows usually carry a team or project name rather than a personal profile URL. In live testing every row had an `accountName` but only about 1 in 10 resolved to a profile URL.

#### Does the Bitbucket Email Scraper read git history or use the Bitbucket API?

No. It does not read git history, clone repositories or call the Bitbucket API. It parses Google search results for public pages on `bitbucket.org` and `bitbucket.io` that Google has already indexed.

#### Do I need a Bitbucket account or app password?

No. There is no authentication, no browser, no JavaScript rendering and no cookies. The only credential involved is your Apify account's GOOGLE_SERP proxy access.

#### Can it find the administrator of a workspace?

Only if that person's address was published on a public page Google indexed. Atlassian does not expose workspace admin contacts, and this Actor does not attempt to.

#### Where does the Bitbucket Email Scraper get the emails?

From the text in Google's result titles and snippets: `README`, `CONTRIBUTING` and `SECURITY` files, workspace and project descriptions, issue text, and static sites on `bitbucket.io`.

#### How many emails can one Bitbucket Email Scraper run return?

`maxEmails` accepts 1 to 10000 and defaults to 20. Free Apify plans are capped at 100 emails per run; paid plans are uncapped.

#### What does `possiblyTruncated: true` mean?

Google's snippet ellipsis touched the address, so it may be incomplete. Verify those rows before you use them.

#### Can I restrict Bitbucket Email Scraper results to corporate domains?

Yes. Set `customDomains` to the domains you want, for example `["@acme.io", "@example.com"]`. The leading `@` is optional and only matching addresses are kept.

#### Does the Bitbucket Email Scraper handle obfuscated addresses?

Yes. It normalises `[at]`, `(at)`, spaced `@`, spaced `.com`, zero-width characters and the full-width `＠`, and filters placeholders such as `test@` and `yourname@`.

#### How do I target a single country?

Set `countryCode` to a two-letter code such as `US`, `GB` or `AU`, and put a city or region in `location` so it is appended to every query.

#### What happens if a Bitbucket Email Scraper run is interrupted?

Progress is stored in the key-value store keyed by a hash of your input, with saves on `PERSIST_STATE`, `MIGRATING` and `ABORTING`. Leads already pushed to the dataset are kept.

#### Is the Bitbucket Email Scraper affiliated with Atlassian?

No. It is an independent Apify Actor and is not supported, endorsed or affiliated with Bitbucket or Atlassian.

***

### Related Actors

The Bitbucket Email Scraper is part of a Developer & Technology family of Apify Actors applying the same method to different platforms. Run several to cover an ecosystem rather than a single site.

| Actor | What it collects |
|---|---|
| [Bitbucket Email and Phone Number Scraper](https://apify.com/neuro-scraper/bitbucket-email-and-phone-number-scraper) | Emails and phone numbers from Bitbucket |
| [Bitbucket Phone Number Scraper](https://apify.com/neuro-scraper/bitbucket-phone-number-scraper) | Public phone numbers from Bitbucket |
| [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 |
| [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 |
| [Firefox Add-ons Email Scraper](https://apify.com/neuro-scraper/firefox-add-ons-email-scraper) | Public contact emails from Firefox Add-ons |
| [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 |
| [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 |
| [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 |
| [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 Bitbucket 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, bug reports, or a custom build of the Bitbucket Email Scraper tuned to your own domain list? Email **neurodata.apify@gmail.com**.

# Actor input Schema

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

Search terms describing the Bitbucket 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 Bitbucket.

## `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": [
    "developer",
    "team"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "maintainer",
    "author",
    "support"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Bitbucket 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": [
        "developer",
        "team"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "maintainer",
        "author",
        "support"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/bitbucket-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/J2mgCcD8JZsrdQr7f/builds/4gSuem0fwvbkqlJ5g/openapi.json
