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

The most powerful and affordable Bluesky scraper. Extract posts, profiles, followers, following lists, threads, and engagement data via AT Protocol API. No login needed. 7 modes. Export JSON/CSV. Built-in rate limiting and pagination up to 10K results.

- **URL**: https://apify.com/botflowtech/bluesky-scraper.md
- **Developed by:** [BotFlowTech](https://apify.com/botflowtech) (community)
- **Categories:** Social media
- **Stats:** 16 total users, 2 monthly users, 98.5% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.40 / 1,000 post scrapeds

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 - Posts, Profiles, Followers & Engagement 🦋

The most powerful and affordable Bluesky scraper on Apify. Extract posts, profiles, followers, following lists, threads, and engagement data from Bluesky's decentralized social network — all via the official AT Protocol API.

**No login required. No API key needed. No browser overhead.** Pure HTTP API calls = fast, reliable, and cheap to run.

### What Can This Bluesky Scraper Do?

#### 7 Scraping Modes

| Mode | Description | Use Case |
|------|-------------|----------|
| **Posts** | Search posts by keyword or get a user's feed | Social listening, trend tracking, content monitoring |
| **Profiles** | Search users or get specific profile data | Lead generation, audience research, influencer discovery |
| **Followers** | Extract follower lists of any public account | Competitive analysis, audience overlap, growth tracking |
| **Following** | Get accounts a user follows | Interest mapping, network analysis, partnership research |
| **Thread** | Get full conversation threads with all replies | Discussion analysis, sentiment tracking |
| **Engagement** | Get who liked and reposted a specific post | Engagement analysis, audience insights |
| **Both** | Posts + Profiles combined | Comprehensive data collection |

### Why Choose This Bluesky Scraper?

- ⚡ **Lightning fast** — Pure HTTP API, no browser needed. Runs in seconds, not minutes.
- 💰 **Cheapest on Apify** — Minimal compute costs since no browser is used.
- 🔓 **No authentication** — Uses Bluesky's public API. No login, no API keys.
- 📊 **Rich data** — Full post metadata, engagement metrics, images, links, quotes.
- 🔄 **Auto-pagination** — Get up to 10,000 results per run automatically.
- ⏱️ **Built-in rate limiting** — Respects Bluesky API limits, no bans.
- 📅 **Schedulable** — Run hourly, daily, or weekly for continuous monitoring.

### How to Use

#### Scrape Posts by Keyword

1. Set **Scrape Type** to "Posts"
2. Enter your **Search Query** (e.g., "artificial intelligence", "startup", "#tech")
3. Set **Max Results** (up to 10,000)
4. Click **Start**

#### Scrape a User's Profile & Posts

1. Set **Scrape Type** to "Both"
2. Add handles to **Bluesky Handles** (e.g., `bsky.app`, `jay.bsky.team`)
3. Click **Start**

#### Get Followers of an Account

1. Set **Scrape Type** to "Followers"
2. Add the handle to **Bluesky Handles**
3. Set **Max Results** to control how many followers to extract
4. Click **Start**

#### Analyze Post Engagement

1. Set **Scrape Type** to "Engagement"
2. Add post URLs to **Post URLs** (e.g., `https://bsky.app/profile/bsky.app/post/abc123`)
3. Click **Start** — returns everyone who liked and reposted the post

### Input Parameters

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `scrapeType` | Enum | What to scrape: posts, profiles, followers, following, thread, engagement, both | posts |
| `searchQuery` | String | Search keyword for posts/profiles, or handle for followers/following | — |
| `handles` | Array | Bluesky handles to scrape (e.g., `bsky.app`, `@jay.bsky.team`) | \[] |
| `postUrls` | Array | Post URLs for thread/engagement modes | \[] |
| `maxItems` | Integer | Max results per query/handle (1–10,000) | 100 |
| `sort` | Enum | Sort order for post search: `latest` or `top` | latest |

### Output Data

#### Post Output

```json
{
    "uri": "at://did:plc:.../app.bsky.feed.post/...",
    "text": "This is a Bluesky post about AI",
    "createdAt": "2024-01-15T10:30:00.000Z",
    "author": {
        "did": "did:plc:...",
        "handle": "user.bsky.social",
        "displayName": "User Name",
        "avatar": "https://..."
    },
    "likeCount": 42,
    "repostCount": 12,
    "replyCount": 5,
    "quoteCount": 3,
    "images": [{"url": "https://...", "alt": "Image description"}],
    "links": ["https://example.com"],
    "language": "en",
    "postUrl": "https://bsky.app/profile/user.bsky.social/post/..."
}
```

#### Profile Output

```json
{
    "did": "did:plc:...",
    "handle": "user.bsky.social",
    "displayName": "User Name",
    "description": "Bio text here",
    "avatar": "https://...",
    "followersCount": 1500,
    "followsCount": 300,
    "postsCount": 850,
    "createdAt": "2023-04-15T10:00:00.000Z",
    "isVerified": false,
    "profileUrl": "https://bsky.app/profile/user.bsky.social"
}
```

### Use Cases

- **Social Media Monitoring** — Track brand mentions, competitors, and industry trends on Bluesky
- **Lead Generation** — Find potential customers by searching posts and profiles by keyword
- **Influencer Discovery** — Identify top accounts in any niche with follower/engagement data
- **Academic Research** — Study decentralized social network dynamics and content spread
- **Content Analysis** — Analyze post engagement patterns, trending topics, and sentiment
- **Competitive Intelligence** — Monitor competitor accounts, their followers, and content strategy
- **OSINT & Journalism** — Track public conversations and information spread
- **Network Analysis** — Map follower/following relationships between accounts

### API Usage

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('BOTFLOWTECH/bluesky-scraper').call({
    scrapeType: 'posts',
    searchQuery: 'artificial intelligence',
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} Bluesky posts`);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('BOTFLOWTECH/bluesky-scraper').call(run_input={
    'scrapeType': 'profiles',
    'searchQuery': 'data science',
    'maxItems': 200,
})

items = client.dataset(run['defaultDatasetId']).list_items().items
print(f'Found {len(items)} Bluesky profiles')
```

### FAQ

**Is this scraper free?** You get free credits when signing up on Apify. After that, pay-per-result pricing starts at just $0.40 per 1,000 results — the lowest price on Apify Store.

**Do I need a Bluesky account?** No. This scraper uses the public AT Protocol API which requires no authentication.

**How fast is it?** Very fast. Since it uses pure HTTP API calls (no browser), most runs complete in seconds to minutes depending on data volume.

**What's the data limit?** Up to 10,000 results per run. For larger datasets, schedule multiple runs with different queries.

**Can I schedule it?** Yes. Apify supports hourly, daily, or weekly scheduling. Perfect for continuous social media monitoring.

**Is it legal?** This scraper only accesses publicly available data through Bluesky's official AT Protocol API — the same API that Bluesky's own apps use.

### Technical Details

- Built with Apify SDK 3.3.0 (latest)
- Uses public AT Protocol API at `public.api.bsky.app`
- No browser or Playwright needed — pure Node.js HTTP requests
- Built-in rate limiting and automatic retry on 429 errors
- Cursor-based pagination for complete data extraction
- Minimal memory usage (~256 MB)

# Actor input Schema

## `scrapeType` (type: `string`):

What data to extract from Bluesky

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

Keyword to search for in posts or profiles. For followers/following/thread modes, enter a handle or post URL here if not using the handles/postUrls fields.

## `handles` (type: `array`):

List of Bluesky handles to scrape. Accepts handles (jay.bsky.team), profile URLs (https://bsky.app/profile/jay.bsky.team), or @handles.

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

List of post URLs for thread/engagement modes. Accepts Bluesky post URLs or AT Protocol URIs.

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

Maximum number of results to return per search query or handle (1-10,000).

## `sort` (type: `string`):

Sort order for post search results

## Actor input object example

```json
{
  "scrapeType": "posts",
  "handles": [
    "bsky.app",
    "jay.bsky.team"
  ],
  "postUrls": [
    "https://bsky.app/profile/bsky.app/post/abc123"
  ],
  "maxItems": 100,
  "sort": "latest"
}
```

# 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 = {
    "scrapeType": "posts",
    "searchQuery": "",
    "handles": [],
    "postUrls": [],
    "maxItems": 100,
    "sort": "latest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("botflowtech/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 = {
    "scrapeType": "posts",
    "searchQuery": "",
    "handles": [],
    "postUrls": [],
    "maxItems": 100,
    "sort": "latest",
}

# Run the Actor and wait for it to finish
run = client.actor("botflowtech/bluesky-scraper").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 '{
  "scrapeType": "posts",
  "searchQuery": "",
  "handles": [],
  "postUrls": [],
  "maxItems": 100,
  "sort": "latest"
}' |
apify call botflowtech/bluesky-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Gbdsv2BxEdi8NFXf6/builds/m5MGd9xPZmKijsAm8/openapi.json
