# Bluesky Scraper - Posts, Profiles, Followers & Search (`hussain2407/bluesky-scraper`) Actor

Extract Bluesky posts, user profiles, followers and keyword search results from the AT Protocol. No API key needed for public data.

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

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 — Posts, Profiles, Followers & Search

Export data from **Bluesky** (the AT Protocol social network) to JSON, CSV or Excel.

Scrape posts from any account, full profile details, follower and following lists, complete reply
threads, and keyword search results — then download them or pull them straight into your own app
through the Apify API.

**No API key needed for public data.** Just pick a mode, enter a handle, and click Run.

***

### What you can extract

| Mode | What you get | Login needed? |
|---|---|---|
| **Posts from users** | Every post from one or more accounts, with full engagement metrics | No |
| **User profiles** | Display name, bio, avatar, banner, follower/following/post counts | No |
| **Followers** | The full follower list of any account | No |
| **Following** | Every account a user follows | No |
| **Post thread & replies** | A post plus its entire reply tree, with depth on each reply | No |
| **Search for accounts** | Find accounts matching a keyword | No |
| **Search posts by keyword** | Keyword and hashtag search across Bluesky | Yes — see below |

Six of the seven modes need no credentials at all.

***

### Why people use this

- **Brand monitoring** — track every mention of your product or company on Bluesky
- **Journalism & research** — Bluesky sentiment often diverges sharply from X; newsrooms and
  academics track both
- **Competitor tracking** — watch what competitors post and how their audience responds
- **Audience analysis** — export follower lists to understand who follows an account
- **AI / RAG pipelines** — feed clean, structured social text into your models
- **Community archiving** — preserve threads and discussions before they scroll away

***

### Quick start

1. Click **Try for free**
2. Leave everything on the defaults and press **Start** — you'll get real posts immediately
3. Change the handles or switch modes once you see the shape of the data

That's it. The default run works with no configuration.

***

### Input

| Field | Description |
|---|---|
| **What to scrape** | Which of the seven modes to run |
| **Bluesky handles or DIDs** | `bsky.app`, `nytimes.com`, or full `did:plc:...` values |
| **Post URLs** | For thread mode — e.g. `https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22` |
| **Search query** | Keyword or hashtag, for the two search modes |
| **Maximum results** | Stop after this many rows. Keep it small on your first run |
| **Include replies / reposts** | Optional filters for post modes |

***

### Output

One clean, flat row per item — ready for Excel or a database, with no nested JSON to unpick.

#### Post row

```json
{
  "uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3mv3zcjaijk22",
  "url": "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22",
  "text": "Welcome to the ONLY event about Apple happening today...",
  "createdAt": "2026-09-09T17:02:28.502Z",
  "langs": ["en"],
  "replyCount": 357,
  "repostCount": 161,
  "likeCount": 1680,
  "quoteCount": 51,
  "imageUrls": [],
  "externalUrl": null,
  "isReply": false,
  "authorHandle": "bsky.app",
  "authorDisplayName": "Bluesky",
  "authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur",
  "scrapedAt": "2026-09-10T20:00:32.285Z"
}
```

#### Profile row

```json
{
  "did": "did:plc:z72i7hdynmk6r22z27h6tvur",
  "handle": "bsky.app",
  "url": "https://bsky.app/profile/bsky.app",
  "displayName": "Bluesky",
  "description": "official Bluesky account",
  "followersCount": 1284593,
  "followsCount": 42,
  "postsCount": 1893,
  "createdAt": "2023-04-12T04:53:57.057Z",
  "scrapedAt": "2026-09-10T20:00:32.285Z"
}
```

All timestamps are ISO 8601 UTC.

***

### Keyword post search needs a free login

Bluesky requires an authenticated session for keyword post search. Every other mode is fully
public.

To use it:

1. In the Bluesky app, go to **Settings → App Passwords**
2. Create an app password — a separate, revocable password made for exactly this purpose
3. Paste your handle and that app password into the input fields

**Never use your main account password.** App passwords can be revoked at any time without
touching your account, and the value is stored encrypted by Apify.

Using your own credentials also means your own rate limits — nothing is shared with other users
of this Actor.

***

### Reliability

This Actor uses Bluesky's official AT Protocol HTTP API. There is no HTML parsing and no anti-bot
layer to fight, so it does not suffer the constant breakage typical of scrapers built on page
structure. Failed requests are retried with exponential backoff, and a single failed page is
skipped rather than killing a run that has already produced results.

***

### Notes & limits

- Only **public** data is returned. Private accounts and follower-only content are not accessible.
- Some accounts appear with the handle `handle.invalid`. That is genuine Bluesky behaviour for
  accounts whose handle did not resolve at index time — the DID is still correct and usable.
- Rate limits are Bluesky's own. Very large follower exports simply take longer.
- Deleted posts disappear from results, as they do on Bluesky itself.

***

### Is this legal?

This Actor reads publicly available data through Bluesky's official public API — the same data any
visitor can see without logging in. You receive the results directly; nothing is stored or resold
by this Actor.

You are responsible for how you use the output. If you process personal data of people in the
EU/UK, GDPR applies to *your* processing and you need your own lawful basis. Do not use this
Actor to build spam or unsolicited contact lists.

***

### Questions or a bug?

Open an issue on the Actor's **Issues** tab. Bug reports are usually fixed within a few days.

# Actor input Schema

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

Choose the type of data to extract. Everything except 'Search posts' works without any login.

## `actors` (type: `array`):

Handles such as bsky.app or nytimes.com, or full DIDs. Used by every mode except post search.

## `postUrls` (type: `array`):

Bluesky post links, e.g. https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l

## `searchQuery` (type: `string`):

Keyword or hashtag. Used by 'Search for accounts' and 'Search posts'.

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

Stop after this many results. Keep it low for a first test run.

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

Include the user's replies in post results.

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

Include reposts in post results.

## `identifier` (type: `string`):

Your own Bluesky handle. Only needed for 'Search posts by keyword'. Everything else is public.

## `appPassword` (type: `string`):

An app password from Bluesky Settings > App Passwords. Stored encrypted. Never use your account password.

## Actor input object example

```json
{
  "mode": "authorFeed",
  "actors": [
    "bsky.app"
  ],
  "postUrls": [],
  "searchQuery": "",
  "maxItems": 100,
  "includeReplies": false,
  "includeReposts": false,
  "identifier": ""
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

## `datasetInConsole` (type: `string`):

No description

# 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 = {
    "actors": [
        "bsky.app"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hussain2407/bluesky-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 = { "actors": ["bsky.app"] }

# Run the Actor and wait for it to finish
run = client.actor("hussain2407/bluesky-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 '{
  "actors": [
    "bsky.app"
  ]
}' |
apify call hussain2407/bluesky-scraper --silent --output-dataset

```

## MCP server setup

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