# Bluesky Email Scraper (`socialdataapi/bluesky-email-scraper`) Actor

Bluesky Email Scraper finds emails shown on public Bluesky profiles and posts from your keywords: email, page link, title and the public text it appeared in. Filter by location and email domain. No Bluesky account or login. Export as JSON, CSV or Excel, or use the API.

- **URL**: https://apify.com/socialdataapi/bluesky-email-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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

### Bluesky Email Scraper — Emails, Page Titles and Links

Bluesky Email Scraper is a Bluesky email finder: a keyword-based Bluesky email scraper that reads public Bluesky profiles and posts to find emails on Bluesky for you. Each match returns the email, page link, page title and the public text it appeared in, filtered by your chosen email domains. **Every response is structured JSON**, ready for an LLM, a vector store or a lead-generation pipeline. No Bluesky account or login needed. Start with one keyword, then scale to your full prospect list.

![Bluesky Email Scraper: every page and email from Bluesky as JSON](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/j-bluesky-email-hero.webp)

***

### What data can I extract with Bluesky Email Scraper?

Using this Bluesky email API, you will be able to extract the following Bluesky email data:

| 🌐 Network | 🔑 Keyword searched | 📝 Page title |
| --- | --- | --- |
| 📰 Page description | 🔗 Page URL | 📧 Email address |

***

### How to use Bluesky Email Scraper

Marketers, recruiters and lead-generation teams use this actor to collect public Bluesky contact emails without opening every profile or post by hand.

**Copy to your AI assistant:**

```text
Bluesky Email Scraper is an Apify Actor that returns email addresses found on public Bluesky profiles and posts as structured JSON: network, keyword, title, description, url and email. Use it whenever someone needs Bluesky contact emails without cookies, a login or a browser - for lead generation, outreach lists or market research. Inputs: keywords (array of search terms, required), location (string, optional city or region, default worldwide), emailDomains (array, default ["@gmail.com"], [] = any domain), maxEmails (integer 1-100000, default 10, emails per keyword), engine (select "legacy"), proxyConfiguration (object, optional). Each keyword stops once maxEmails is reached or its public results run out; the free Apify plan caps results at 20 per run in total (all keywords together) and 200 per month.
```

#### Bluesky Email Scraper MCP Server

Add the Apify MCP server and your AI assistant can call this Actor directly — no glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/bluesky-email-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [**Bluesky Email Scraper**](https://apify.com/socialdataapi/bluesky-email-scraper) in the Apify Store.
3. Enter one or more keywords, for example `marketing`, `coach` or `photographer`.
4. Optionally add a location and the email domains you want (default `@gmail.com`).
5. Click **Start**, then download or export your results as JSON, CSV or Excel.

#### How to scale Bluesky Email Scraper to bulk

`keywords` takes a list, so add every search term you want covered in one run — up to 3 keywords are processed at the same time, each with its own `maxEmails` budget. Use it as a Bluesky email list builder for an outreach campaign, or run a bulk Bluesky email search by adding your full term list and a rotating location. To cover more ground over time, schedule the Actor with a rotating keyword list, or call it from the Apify API with a different `keywords` / `location` pair per run.

***

### ✨ Features

Bluesky Email Scraper fetches clean, structured matches from public Bluesky profiles and posts. It's ideal as a Bluesky contact scraper for sales outreach, a Bluesky email extractor for market mapping, and a quick way to build a prospect list for a new niche.

It extracts, per match:

- **Email** – the address shown on the page, lower case, matching your email domains.
- **Page URL** – the public Bluesky page the email was found on.
- **Page title** – the result's title as shown in the search listing.
- **Description** – the public text the email appears in (up to 500 characters).
- **Keyword / network** – the keyword that found the row and the platform (`bsky.app`).

⚡ Every address is checked before it is kept: shortened or cut-off addresses, prose such as "that @gmail.com" and placeholders such as "username@gmail.com" are rejected, and the same email is returned once per keyword.

***

### Use cases 💡

- **Sales rep** — build an outreach list of Bluesky contacts by keyword and city in one run.
- **Recruiter** — find contact emails behind niche profiles and posts.
- **Agency** — plug this Bluesky lead generation tool into a client's niche and location filter.
- **Market researcher** — map which profiles and posts publish a contact email for a topic.
- **AI agent builder** — feed matched emails straight into a CRM-enrichment or lead-scoring pipeline with no parsing step.

Building an AI agent? [Connect this actor over MCP](#bluesky-email-scraper-mcp-server) and let it call the actor on its own.

***

### Why choose this actor?

- **Built to scrape Bluesky emails, not guess them.** A recorded local test run returned 7 emails for the keyword `marketing` in 287.3 seconds.
- **Six clean fields per match.** Every row carries the keyword, the page title, the public text the email appeared in and the page link.
- **Built-in retry.** When a search attempt is blocked the actor retries it with a fresh connection and continues on a backup source, so a run still delivers results.

***

### ⬇️ Input

![Bluesky Email Scraper input: keywords, location, email domains and max emails](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/j-bluesky-email-input.webp)

Enter one or more keywords (required); the rest is optional and has a working default.

| Parameter | Required | Type | Description | Example value |
| --- | --- | --- | --- | --- |
| `keywords` | Yes | Array of strings | Keywords to search on public Bluesky profiles and posts. Each one gets its own `maxEmails` budget; duplicates are removed. | `["marketing", "coach"]` |
| `location` | No | String | City or region searched as an exact phrase. Empty = worldwide. | `"London"` |
| `emailDomains` | No | Array of strings | Keep only emails of these domains (`@` optional). Default `["@gmail.com"]`; `[]` accepts any domain. | `["@gmail.com", "@outlook.com"]` |
| `maxEmails` | No | Integer | Emails to collect per keyword (1–100,000, default 10). Free-plan runs are capped at 20 per run in total (all keywords together) and 200 per month. | `50` |
| `engine` | No | String (select) | Processing engine; `legacy` is the only value. | `"legacy"` |
| `proxyConfiguration` | No | Object | Connection settings. Leave as it is and a suitable Apify proxy is selected automatically. | `{"useApifyProxy": false}` |

#### Free plan limits

Users on the Apify free plan can fetch up to 20 emails per run (all keywords together) and 200 emails per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

#### Example input

```json
{
  "keywords": ["marketing", "coach"],
  "location": "",
  "emailDomains": ["@gmail.com"],
  "maxEmails": 10,
  "engine": "legacy"
}
```

***

### ⬆️ Output

![Bluesky Email Scraper output: one row per match with network, keyword, title and email](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/j-bluesky-email-output.webp)

Every match is one JSON item with the same six fields on every run. Within a keyword the same email is returned once. Export Bluesky emails as JSON, CSV or Excel.

#### Example output

```json
{
  "network": "bsky.app",
  "keyword": "marketing",
  "title": "Post by @nodbrim.com",
  "description": "Marketing @krasskollektiv.com Team ARC Creator @arcsystemworks.com ... ✉ constantin.gcopywriting@ gmail.com . Create account. Sign in.",
  "url": "https://bsky.app/profile/nodbrim.com/post/3mi2y7c34bc2s/liked-by",
  "email": "constantin.gcopywriting@gmail.com"
}
```

***

### How does it work?

The actor doesn't log into Bluesky at all. For every keyword it searches public Bluesky profiles and posts that show an email address of your chosen domains (retrying with a fresh connection and continuing on a backup source when a search is blocked or runs dry). It only reads what any logged-out visitor can already see. The email is read from the page's public title and text, checked, lower-cased and returned with the page link.

***

### How do you integrate Bluesky Email Scraper into your stack?

Call it from any language over the Apify REST API, or wire it into a no-code tool. Building an AI agent instead? See [the MCP server section](#bluesky-email-scraper-mcp-server) above.

#### No-code tools (n8n, Make, LangChain)

In n8n, use the Apify node's **Run an Actor** action. In Make, use the Apify app's **Run an Actor** module followed by **Get Dataset Items**. In LangChain, install `langchain-apify` and call `ApifyActorsTool()` to let an agent run it as a tool.

***

### Is it legal to scrape Bluesky data?

Scraping publicly available data is generally permitted; the legal risk sits mostly in how the data is stored and used afterward. Bluesky Email Scraper returns only data that any logged-out visitor already sees. If you operate in the EU, GDPR applies to storing and using emails you collect: keep records you can justify and delete them when asked. Anti-spam rules (such as CAN-SPAM) still apply to outreach — the Actor finds public emails, it does not grant permission to contact them. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does Bluesky Email Scraper return?

The network, keyword, page title, description, page URL and email for every match. See [the data fields section](#what-data-can-i-extract-with-bluesky-email-scraper).

#### Does Bluesky Email Scraper require a Bluesky account or login?

No. Only public pages are read and no Bluesky credentials are ever requested.

#### Can I get emails of any domain, not only Gmail?

Yes. Set `emailDomains` to the domains you want (for example `@outlook.com` or your company domain), or to `[]` to accept any domain.

#### Can I search many keywords at once?

Yes. `keywords` takes a list; up to 3 keywords are processed at the same time, each with its own `maxEmails` budget.

#### Does Bluesky Email Scraper return data in a format LLMs can use directly?

Yes. Every result is typed JSON with consistent field names — pass it straight to an LLM, a vector store or an agent tool.

#### Can I use it with an AI agent through MCP?

Yes. Add the Apify MCP server — see [the MCP server section](#bluesky-email-scraper-mcp-server) — and your agent can call this Actor directly.

#### What happens when Bluesky changes its layout or anti-bot system?

The actor reads general page text rather than one fixed selector, so most layout changes don't break it. When a bigger change happens the actor is updated and your calls keep returning the same JSON schema.

#### Do I need to manage proxies?

No. Proxy rotation and retries run on the Actor's side — plain HTTP requests, no browser to maintain.

***

### Related scrapers

| Scraper | What it extracts |
| --- | --- |
| Bandcamp Email Scraper | Email addresses found on public Bandcamp artist and label pages for your keywords. |
| Craigslist Email Scraper | Email addresses found on public Craigslist listings for your keywords. |
| Flipkart Email Scraper | Email addresses found on public Flipkart product and seller pages for your keywords. |

***

### Your feedback

Found a bug or missing a field? Let us know through the Issues tab on this actor's Apify Store page. Every report is reviewed and fixes ship quickly.

# Actor input Schema

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

One or more keywords (e.g. marketing, coach, photographer). Each keyword is searched separately on public Bluesky profiles and posts and gets its own budget of maxEmails; every email found is returned with the keyword that found it. Duplicate keywords are removed.

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

Optional city or region (e.g. London, New York, Dubai), searched as an exact phrase so results mention this place. Leave empty to search worldwide.

## `emailDomains` (type: `array`):

Keep only emails of these domains, e.g. @gmail.com, @outlook.com, @hotmail.com, @icloud.com or a business domain like @yourcompany.com (the @ is optional, case does not matter). The domains also sharpen the search. When a result shows several emails, the first matching one is used. Leave empty to accept emails of any domain (fewer results then contain an email).

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

How many emails to collect per keyword (1 - 100,000). A keyword stops earlier when no more public results with an email are available. Free plan users are limited to 20 items per run in total (across all keywords) and 200 items per month; paid plans have no limit.

## `engine` (type: `string`):

Processing engine. Only 'legacy' is available.

## `proxyConfiguration` (type: `object`):

How the actor connects. Leave it as it is and a suitable Apify proxy is selected automatically. When a page is blocked the actor retries with a fresh proxy session (up to 3 attempts per page). You can also choose your own Apify proxy groups or custom proxy URLs.

## Actor input object example

```json
{
  "keywords": [
    "marketing"
  ],
  "location": "",
  "emailDomains": [
    "@gmail.com"
  ],
  "maxEmails": 10,
  "engine": "legacy",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset rows: network, keyword, title, description, url, email.

# 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": [
        "marketing"
    ],
    "emailDomains": [
        "@gmail.com"
    ],
    "maxEmails": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/bluesky-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": ["marketing"],
    "emailDomains": ["@gmail.com"],
    "maxEmails": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("socialdataapi/bluesky-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": [
    "marketing"
  ],
  "emailDomains": [
    "@gmail.com"
  ],
  "maxEmails": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call socialdataapi/bluesky-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialdataapi/bluesky-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/inOec7eDzttEduB20/builds/29MjEZ9YsLjU8qoUA/openapi.json
