# Bluesky Scraper  ($0.99 / 1K Results) (`scrapers-hub/bluesky-scraper-enterprise-grade`) Actor

\[𝘾𝙝𝙚𝙖𝙥𝙚𝙨𝙩] Bluesky scraper to extract profiles, posts, followers, engagement, and metadata from Bluesky 🦋📊 Ideal for social media research, audience analysis, and trend monitoring. Fast and reliable.

- **URL**: https://apify.com/scrapers-hub/bluesky-scraper-enterprise-grade.md
- **Developed by:** [Scrapers Hub](https://apify.com/scrapers-hub) (community)
- **Categories:** Social media, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Bluesky Scraper 🦋

**Bluesky Scraper** collects posts, replies, profiles, followers, and following lists from Bluesky and hands them to you as a clean, ready-to-use dataset. Whether you are tracking a topic, researching an audience, monitoring your brand, or studying how conversations spread, this Bluesky Scraper gathers the data without any coding.

No Bluesky account is needed. Choose what you want to collect, add your keywords or handles, press Run, and download the results as a spreadsheet or JSON file.

***

### 🚀 Why Choose This Bluesky Scraper?

| Feature | What It Means for You |
| --- | --- |
| ✅ **Five Collection Modes** | Works as a **Bluesky search scraper**, a **Bluesky post scraper**, a **Bluesky profile scraper**, and a **Bluesky followers scraper**, all in one tool |
| ✅ **Powerful Filtering** | Narrow results by date, language, author, hashtag, linked website, and minimum engagement |
| ✅ **Replies Included** | Collect the discussion under each post, not just the post itself |
| ✅ **Rich Attachments Kept** | Images, video, quoted posts, and link previews all survive into your results |
| ✅ **Keywords or Links** | Start from search words, Bluesky handles, or direct Bluesky links — whatever you already have |
| ✅ **Spreadsheet-Ready** | Clear, well-labelled columns let you **export Bluesky data to CSV**, Excel, or JSON instantly |

***

### 🔑 Key Features of the Bluesky Scraper

- 🔎 **Topic Search** — enter any keywords and the **Bluesky search scraper** finds every matching post across the network
- 👤 **Author Timelines** — give it a handle such as `alice.bsky.social` and the **Bluesky post scraper** collects that account's posts
- 🧑‍🤝‍🧑 **Audience Lists** — the **Bluesky followers scraper** pulls complete follower and following lists for any public account
- 📇 **Profile Details** — the **Bluesky profile scraper** returns bio, avatar, banner, follower count, and post count for each handle
- 🔗 **Direct Links** — paste Bluesky links to a post, profile, or search and they are collected exactly as given
- 💬 **Reply Collection** — switch on replies to gather the conversation beneath each post, saved as their own rows
- 📅 **Date Windows** — keep only posts published between two dates, so you can **scrape Bluesky data** for a specific campaign or event
- 🌍 **Language Filter** — restrict results to a single language when your research is region-specific
- 🏷️ **Hashtag Filter** — narrow a search to posts carrying specific hashtags
- ✍️ **Author Filters** — limit results to posts from a specific account, or posts that mention one
- 🌐 **Link Filters** — find posts that link to a particular website or share an exact link
- 📊 **Engagement Thresholds** — keep only posts above a minimum number of likes, reposts, or replies
- 🔁 **Reply and Repost Control** — include or exclude replies and reposts to keep your results focused
- 🥇 **Sort Order** — rank search results by newest first or by prominence
- 🔁 **Repeatable Runs** — save your settings once and repeat the same Bluesky data extraction whenever you need a fresh snapshot

***

### 📝 Input

Everything can be set up with the simple form in the Apify Console. If you prefer to enter settings directly, this is what a full configuration looks like:

```json
{
  "mode": "search_posts",
  "terms": ["climate policy", "renewable energy"],
  "count": 100,
  "startUrls": [
    "https://bsky.app/profile/alice.bsky.social"
  ],
  "sortOrder": "latest",
  "dateFrom": "2026-01-01",
  "dateTo": "2026-06-30",
  "language": "en",
  "fromAuthor": "alice.bsky.social",
  "mentionsAuthor": "bob.bsky.social",
  "hashtags": ["climate", "solar"],
  "domain": "nytimes.com",
  "minLikes": 10,
  "minReposts": 2,
  "minReplies": 1,
  "includeReplies": true,
  "includeReposts": false,
  "scrapeComments": true,
  "maxComments": 25
}
```

#### Input Settings

| Setting | Type | Default | What It Does |
| --- | --- | --- | --- |
| `mode` | text | `search_posts` | What to collect: `search_posts`, `author_feed`, `followers`, `following`, or `profile_details`. |
| `terms` | list | — | Your keywords (for searching) or Bluesky handles (for the other modes). |
| `count` | number | — | The most results to collect for each keyword or handle. |
| `startUrls` | list | — | Direct Bluesky links to a post, profile, or search page. |
| `sortOrder` | text | — | Rank search results by newest first or by prominence. |
| `dateFrom` / `dateTo` | text | — | Keep only posts published inside this date range (`YYYY-MM-DD`). |
| `language` | text | — | Keep only posts written in this language, e.g. `en`. |
| `fromAuthor` | text | — | Keep only posts written by this handle. |
| `mentionsAuthor` | text | — | Keep only posts that mention this handle. |
| `hashtags` | list | — | Keep only posts carrying these hashtags, with or without the `#`. |
| `domain` | text | — | Keep only posts linking to this website. |
| `exactUrl` | text | — | Keep only posts sharing this exact link. |
| `minLikes` | number | — | Keep only posts with at least this many likes. |
| `minReposts` | number | — | Keep only posts with at least this many reposts. |
| `minReplies` | number | — | Keep only posts with at least this many replies. |
| `includeReplies` | yes/no | — | When off, posts that are replies to someone else are skipped. |
| `includeReposts` | yes/no | — | When off, posts that appeared only because someone reposted them are skipped. |
| `scrapeComments` | yes/no | — | Also collect the replies under each post, saved as separate rows. |
| `maxComments` | number | — | The most replies to collect per post. |

💡 **Tip:** filters stack together. A **Bluesky keyword search** combined with a date range, a language, and a minimum like count turns a huge topic into a short, genuinely useful list.

***

### 📦 Output

The Bluesky Scraper writes one row per record. Each row is a **post**, a **comment**, a **profile**, or a **follower** entry, marked by the `kind` column. That makes results simple to separate and **export Bluesky data to CSV**. Here is one post row:

```json
[
  {
    "kind": "post",
    "query": "renewable energy",
    "id": "3kv2xq7ab2c",
    "uri": "at://did:plc:abc123/app.bsky.feed.post/3kv2xq7ab2c",
    "cid": "bafyreih4example",
    "authorHandle": "alice.bsky.social",
    "authorDid": "did:plc:abc123",
    "authorName": "Alice Nguyen",
    "authorAvatar": "https://cdn.bsky.app/img/avatar/alice.jpg",
    "text": "Solar just passed 20% of national generation for the first time.",
    "createdAt": "2026-03-14T08:41:02.000Z",
    "indexedAt": "2026-03-14T08:41:05.112Z",
    "languages": ["en"],
    "labels": [],
    "replyCount": 42,
    "repostCount": 318,
    "likeCount": 1904,
    "url": "https://bsky.app/profile/did:plc:abc123/post/3kv2xq7ab2c",
    "embed": {
      "type": "images",
      "images": [
        {
          "alt": "Chart showing solar generation over time",
          "thumb": "https://cdn.bsky.app/img/thumb/chart.jpg",
          "fullsize": "https://cdn.bsky.app/img/full/chart.jpg"
        }
      ]
    }
  }
]
```

#### Post and Comment Columns

| Column | Type | What It Contains |
| --- | --- | --- |
| `kind` | text | `post`, `comment`, `profile`, `follower`, or `following` |
| `query` | text | The keyword, handle, or link that produced this row |
| `id` | text | The post's short identifier |
| `uri` | text | Bluesky's full internal reference for the post |
| `cid` | text | The post's content fingerprint |
| `url` | text | A clickable link to the post on Bluesky |
| `authorHandle` | text | The poster's handle, e.g. `alice.bsky.social` |
| `authorDid` | text | Their permanent account identifier, which never changes even if the handle does |
| `authorName` | text | Their display name |
| `authorAvatar` | text | Their profile picture |
| `text` | text | What the post actually says |
| `createdAt` | text | When the author published it |
| `indexedAt` | text | When Bluesky recorded it |
| `languages` | list | The languages the post is tagged with |
| `labels` | list | Any moderation labels applied to the post |
| `replyCount` | number | How many replies it received |
| `repostCount` | number | How many times it was reposted |
| `likeCount` | number | How many likes it received |
| `facets` | list | Links, mentions, and hashtags detected inside the text |
| `embed` | object | Attached images, video, linked pages, or a quoted post |
| `repost` | object | Who reposted it, when the post appeared because of a repost |
| `sourcePostId` | text | For reply rows: which post it belongs to |
| `sourcePostUrl` | text | For reply rows: a link to the original post |
| `sourcePostAuthorHandle` | text | For reply rows: who wrote the original post |
| `commentDepth` | number | For reply rows: how deep in the conversation it sits |

#### Profile and Follower Columns

| Column | Type | What It Contains |
| --- | --- | --- |
| `kind` | text | `profile`, `follower`, or `following` |
| `id` / `uri` | text | The account's permanent identifier |
| `authorHandle` | text | The account handle |
| `authorName` | text | The display name |
| `text` | text | The account's bio |
| `avatar` | text | Their profile picture |
| `banner` | text | Their profile header image |
| `followersCount` | number | How many accounts follow them |
| `followsCount` | number | How many accounts they follow |
| `postsCount` | number | How many posts they have published |
| `createdAt` | text | When the account was created |
| `labels` | list | Any moderation labels on the account |
| `url` | text | A clickable link to their profile |

***

### 🚀 How to Use the Bluesky Scraper (Step by Step)

1. **Sign in** — go to [console.apify.com](https://console.apify.com) and open the **Actors** tab.
2. **Open the actor** — search for **Bluesky Scraper** and click its card.
3. **Choose your mode** — searching by topic, collecting one account's posts, pulling followers, or fetching profile details.
4. **Add your targets** — keywords for search mode, or Bluesky handles for the other modes. You can also paste direct links.
5. **Set your size** — choose how many results per keyword or handle. Start small to review the output.
6. **Narrow it down** — add date ranges, a language, hashtags, or minimum engagement to sharpen your results.
7. **Add replies** — switch on reply collection if you want the full conversation.
8. **Refine and repeat** — check the first results, then tighten your filters and run the **Bluesky keyword search** again.
9. **Press Run and download** — open the **OUTPUT** tab and save as CSV, Excel, JSON, XML, or RSS.

No coding required — the Bluesky Scraper gives you a complete dataset in minutes.

***

### 🎯 What Makes This Bluesky Scraper Different

- 🎛️ **One Tool Instead of Five** — search, timelines, followers, following, and profiles are all handled by the same Bluesky Scraper
- 🔍 **Filters That Actually Narrow** — combining date, language, hashtag, author, and engagement filters turns a huge topic into a workable list
- 🧵 **Conversations, Not Just Posts** — replies keep a link back to the post that started them, so your Bluesky data extraction preserves real context
- 🆔 **Stable Account IDs** — every row carries the permanent account identifier alongside the handle, so your records stay accurate even when someone renames themselves
- 🖼️ **Rich Attachments Kept** — images, video, quoted posts, and link previews are all preserved rather than flattened away
- 📈 **Engagement Included** — likes, reposts, and replies arrive with every post, ready for ranking and analysis
- 🎚️ **You Control the Volume** — set a limit per target and the Bluesky Scraper stops exactly there, so runs stay predictable
- 🔎 **Traceable Rows** — each result records which keyword or handle produced it, so combined runs stay easy to untangle

***

### 💡 Best Use Cases for the Bluesky Scraper

- 🗣️ **Brand and Reputation Monitoring** — use the Bluesky Scraper for ongoing **Bluesky social listening** on your product or company name
- 📊 **Audience Research** — pull follower lists to understand who is really engaging with an account in your niche
- 📰 **Journalism and Fact-Finding** — follow how a story spreads, with exact timestamps and engagement counts
- 🔬 **Academic Research** — **scrape Bluesky data** for defined date ranges to build datasets you can repeat and cite
- 🤝 **Influencer Discovery** — perform a **Bluesky handle lookup** across a topic to find the accounts driving real conversation
- 📈 **Campaign Measurement** — track hashtag performance before, during, and after a launch
- 🛎️ **Competitor Watch** — point the Bluesky Scraper at rival accounts for continuous **Bluesky social listening** on what they announce
- 🔗 **Community Mapping** — run a **Bluesky handle lookup** across follower lists to see which accounts overlap between communities
- 📅 **Event Coverage** — run a **Bluesky keyword search** across the exact days of a conference, launch, or news event
- 📥 **Reporting and Dashboards** — **export Bluesky data to CSV** and load it straight into your reporting tool

***

### 🔧 Good to Know

A few practical notes before you run the Bluesky Scraper:

- **What you can start from**
  - Search keywords and phrases
  - Bluesky handles, such as `alice.bsky.social`
  - Direct Bluesky links to a post, profile, or search
- **What each mode needs**
  - Search mode expects keywords; all other modes expect handles
- **Download formats**
  - CSV, Excel, JSON, XML, and RSS
- **Please note**
  - ❌ Private or deactivated accounts cannot be collected
  - ❌ Posts that have been deleted are no longer available
  - ℹ️ Engagement counts are a snapshot from the moment of collection, so they keep changing after your run finishes
  - ℹ️ Very broad keywords return large result sets, so combine filters to keep runs fast and focused

***

### 🤝 Support & Feature Requests

Need a hand, or have an idea for the **Bluesky Scraper**?

- 💡 **Feature Requests** — want list collection, scheduled monitoring runs, or alerting on new matches? Just ask.
- 📧 **Contact** — email us at <scrapershub@gmail.com>.

Your feedback shapes what we build next and helps keep this the most useful Bluesky Scraper on the Apify Store.

***

*Start today with the most complete Bluesky Scraper available — posts, replies, profiles, and audiences in one run.*

### Related Scrapers

If the Bluesky Scraper is useful to you, these tools from Scrapers Hub collect listings, profiles, posts, and contact details from other platforms:

- [Reddit Scraper](https://apify.com/scrapers-hub/reddit-scraper-enterprise)
- [Substack Scraper](https://apify.com/scrapers-hub/substack-scraper)
- [Pinterest Scraper](https://apify.com/scrapers-hub/pinterest-scraper-all-in-one)
- [Product Hunt Scraper with Founders & Emails](https://apify.com/scrapers-hub/product-hunt-scraper-with-founders-emails)
- [Y Combinator Scraper with Founders & Emails](https://apify.com/scrapers-hub/y-combinator-scraper-with-founders-emails)
- [Craigslist Scraper](https://apify.com/scrapers-hub/craigslist-scraper)
- [Alibaba Scraper](https://apify.com/scrapers-hub/alibaba-pro-search-scraper)
- [Mercari JP Scraper](https://apify.com/scrapers-hub/mercari-jp-search-scraper)
- [Avito Scraper](https://apify.com/scrapers-hub/avito-kvartiry-scraper)

### Disclaimer

This Bluesky Scraper collects information only from **publicly available sources**. It does not access private accounts, direct messages, or any password-protected content. You are responsible for following applicable data privacy laws and for respecting Bluesky's terms of service and community guidelines when using what you collect.

For data removal requests, please contact **<scrapershub@gmail.com>**. Always use these tools responsibly, ethically, and for legitimate purposes only.

# Actor input Schema

## `mode` (type: `string`):

Choose the collection mode that matches your goal. Then provide matching keywords, Bluesky handles, or direct Bluesky URLs below before running the actor.

## `terms` (type: `array`):

Choose at least one target before running the actor. Use search keywords when collecting posts by topic, or Bluesky handles (e.g. "alice.bsky.social") when collecting account-based data.

## `count` (type: `integer`):

Maximum number of results to collect for each keyword or handle.

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

Use direct Bluesky URLs when you already know exactly what you want to collect. Supported URLs can be used instead of, or alongside, the keyword and handle inputs above. Supports search, post, profile, followers, and follows/following pages.

## `sortOrder` (type: `string`):

Sort order for post search. Applies to keyword search and search URLs.

## `dateFrom` (type: `string`):

UTC date (YYYY-MM-DD). Adds a since: operator to searches and drops older post records locally.

## `dateTo` (type: `string`):

UTC date (YYYY-MM-DD). Adds an until: operator (full day included) and drops newer post records locally.

## `language` (type: `string`):

For post search, appends lang:<code> to each query.

## `fromAuthor` (type: `string`):

Bluesky handle or DID. For post search, appends from:<handle> to each query.

## `mentionsAuthor` (type: `string`):

Bluesky handle or DID. For post search, appends mentions:<handle> to each query.

## `hashtags` (type: `array`):

Hashtags appended to post search queries. With or without the leading #.

## `domain` (type: `string`):

For post search, appends domain:<domain>.

## `exactUrl` (type: `string`):

Exact shared URL appended to post search queries.

## `minLikes` (type: `integer`):

Applied locally to returned post records.

## `minReposts` (type: `integer`):

Applied locally to returned post records.

## `minReplies` (type: `integer`):

Applied locally to returned post records.

## `includeReplies` (type: `boolean`):

When off, post records that are replies to another post are skipped.

## `includeReposts` (type: `boolean`):

When off, records surfaced because they were reposted by another account are skipped.

## `scrapeComments` (type: `boolean`):

Turn on reply collection to also gather replies for each collected post as separate comment records. Useful for thread context, sentiment, or downstream conversation analysis.

## `maxComments` (type: `integer`):

Maximum number of replies to collect per source post when reply collection is enabled.

## Actor input object example

```json
{
  "mode": "search_posts",
  "terms": [
    "web scraping"
  ],
  "count": 100,
  "sortOrder": "latest",
  "language": "",
  "includeReplies": true,
  "includeReposts": true,
  "scrapeComments": false,
  "maxComments": 50
}
```

# 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 = {
    "mode": "search_posts",
    "terms": [
        "web scraping"
    ],
    "count": 100,
    "sortOrder": "latest",
    "maxComments": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers-hub/bluesky-scraper-enterprise-grade").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 = {
    "mode": "search_posts",
    "terms": ["web scraping"],
    "count": 100,
    "sortOrder": "latest",
    "maxComments": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers-hub/bluesky-scraper-enterprise-grade").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search_posts",
  "terms": [
    "web scraping"
  ],
  "count": 100,
  "sortOrder": "latest",
  "maxComments": 50
}' |
apify call scrapers-hub/bluesky-scraper-enterprise-grade --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapers-hub/bluesky-scraper-enterprise-grade",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sab8Hz38qM5WeeHcG/builds/L2gL3MHbxzfWVdZfe/openapi.json
