# Bluesky Scraper (`knotless_cadence/bluesky-scraper`) Actor

Scrape Bluesky posts, profiles, feeds. 10+ runs, monitor trends on decentralized net. JSON/CSV. No API key. Custom scraper in 48h, $100 pilot. Email: spinov001@gmail.com • Tips: t.me/scraping\_ai

- **URL**: https://apify.com/knotless\_cadence/bluesky-scraper.md
- **Developed by:** [Alex](https://apify.com/knotless_cadence) (community)
- **Categories:** Social media, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — AT Protocol API, No Login Required

The most complete Bluesky scraper on Apify. Uses the **official AT Protocol API** — fully open, no authentication needed for profiles, no rate limits on public data.

### Why Bluesky?

Bluesky is the **fastest-growing social network** — from 10M to 41M users in one year (+302%). Built on the open AT Protocol, it's the only major platform where all public data is accessible via a free, open API.

**Why this scraper?**
- ✅ **Official AT Protocol** — not HTML scraping, uses `public.api.bsky.app`
- ✅ **No login for profiles** — scrape any public profile without credentials
- ✅ **Full post data** — text, likes, reposts, replies, quotes, hashtags, mentions
- ✅ **Profile analytics** — followers, following, post count, bio, avatar
- ✅ **Pagination** — automatic cursor-based pagination for 1000+ posts
- ✅ **Search support** — search posts by keyword (requires Bluesky App Password)
- ✅ **Cloud-tested** ✅ — verified on Apify Cloud

### Output Data — Profiles

```json
{
  "_type": "PROFILE",
  "did": "did:plc:z72i7hdynmk6r22z27h6tvur",
  "handle": "bsky.app",
  "displayName": "Bluesky",
  "description": "official Bluesky account",
  "followersCount": 32420172,
  "followsCount": 4,
  "postsCount": 725,
  "avatar": "https://cdn.bsky.app/img/avatar/...",
  "createdAt": "2023-04-12T04:53:57.057Z"
}
````

### Output Data — Posts

```json
{
  "_type": "POST",
  "author": {"handle": "toni.bsky.team", "displayName": "Toni Schneider"},
  "text": "Week 1 observations...",
  "likeCount": 843,
  "repostCount": 77,
  "replyCount": 77,
  "quoteCount": 59,
  "hasImages": false,
  "hashtags": ["#bluesky"],
  "languages": ["en"],
  "isReply": false,
  "createdAt": "2026-03-14T01:56:08.229Z"
}
```

### Use Cases

- **Brand monitoring** — track mentions of your brand on Bluesky
- **Sentiment analysis** — analyze public opinion on trending topics
- **Influencer research** — find and analyze Bluesky influencers by follower count
- **AI training data** — build NLP datasets from Bluesky conversations
- **Competitive intelligence** — monitor competitor activity on the platform
- **Content research** — discover trending topics and hashtags
- **Academic research** — study decentralized social networks
- **Migration analysis** — track Twitter/X users moving to Bluesky

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `handles` | Array | `[]` | Bluesky handles to scrape (e.g., `bsky.app`, `jay.bsky.team`) |
| `searchQueries` | Array | `[]` | Search posts by keyword (requires credentials) |
| `maxPostsPerSource` | Number | `100` | Max posts per handle or search |
| `blueskyHandle` | String | — | Your Bluesky handle (for search only) |
| `blueskyPassword` | String | — | Your App Password from Settings (for search only) |

### How It Works

1. **Profile scraping** (no auth): Uses `com.atproto.identity.resolveHandle` → `app.bsky.actor.getProfile` → `app.bsky.feed.getAuthorFeed`
2. **Post search** (needs auth): Uses `app.bsky.feed.searchPosts` with authenticated session

### Cost

- Free tier available
- \~$0.20 per 100 posts/profiles

***

*Part of 30+ data tools by knotless\_cadence on Apify. See also: [Reddit Scraper Pro](https://apify.com/knotless_cadence/reddit-scraper-pro), [YouTube Comments Scraper](https://apify.com/knotless_cadence/youtube-comments-scraper)*

### Related Products

- [Bluesky Feed Monitor](https://apify.com/knotless_cadence/bluesky-feed-monitor) — engagement analytics
- [Bluesky Hashtag Tracker](https://apify.com/knotless_cadence/bluesky-hashtag-tracker) — trending topics
- [Bluesky Profile Batch](https://apify.com/knotless_cadence/bluesky-profile-batch) — batch profile lookup

### More Tools

- [60+ free scrapers](https://github.com/spinov001-art/awesome-web-scraping-2026)
- [Market Research Reports](https://payhip.com/aimarketintel) — AI/ML, SaaS, E-commerce, HealthTech, FinTech
- [15 MCP Servers for AI Agents](https://github.com/spinov001-art/mcp-servers-collection)

# Actor input Schema

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

Bluesky handles to scrape (e.g., 'jay.bsky.team', 'bsky.app'). Works without login.

## `searchQueries` (type: `array`):

Search Bluesky for posts containing these keywords. Requires Bluesky credentials below.

## `maxPostsPerSource` (type: `integer`):

Maximum number of posts to extract per handle or search query

## `blueskyHandle` (type: `string`):

Your Bluesky handle for authenticated search (e.g., 'yourname.bsky.social'). Only needed for search queries.

## `blueskyPassword` (type: `string`):

Your Bluesky App Password for authenticated search. Create one at Settings > App Passwords. Only needed for search queries.

## `includeLikes` (type: `boolean`):

Whether to also scrape posts liked by the specified handles

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

Whether to include reposted content in the results

## Actor input object example

```json
{
  "handles": [],
  "searchQueries": [],
  "maxPostsPerSource": 100,
  "blueskyHandle": "",
  "includeLikes": false,
  "includeReposts": false
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("knotless_cadence/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 = {}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bluesky Scraper",
        "description": "Scrape Bluesky posts, profiles, feeds. 10+ runs, monitor trends on decentralized net. JSON/CSV. No API key. Custom scraper in 48h, $100 pilot. Email: spinov001@gmail.com • Tips: t.me/scraping_ai",
        "version": "1.0",
        "x-build-id": "KdN4XPlEKNU4g4Lge"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/knotless_cadence~bluesky-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-knotless_cadence-bluesky-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/knotless_cadence~bluesky-scraper/runs": {
            "post": {
                "operationId": "runs-sync-knotless_cadence-bluesky-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/knotless_cadence~bluesky-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-knotless_cadence-bluesky-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "handles": {
                        "title": "Bluesky Handles",
                        "type": "array",
                        "description": "Bluesky handles to scrape (e.g., 'jay.bsky.team', 'bsky.app'). Works without login.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "Search Bluesky for posts containing these keywords. Requires Bluesky credentials below.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPostsPerSource": {
                        "title": "Max Posts Per Source",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of posts to extract per handle or search query",
                        "default": 100
                    },
                    "blueskyHandle": {
                        "title": "Bluesky Handle (for search)",
                        "type": "string",
                        "description": "Your Bluesky handle for authenticated search (e.g., 'yourname.bsky.social'). Only needed for search queries.",
                        "default": ""
                    },
                    "blueskyPassword": {
                        "title": "Bluesky App Password (for search)",
                        "type": "string",
                        "description": "Your Bluesky App Password for authenticated search. Create one at Settings > App Passwords. Only needed for search queries."
                    },
                    "includeLikes": {
                        "title": "Include Liked Posts",
                        "type": "boolean",
                        "description": "Whether to also scrape posts liked by the specified handles",
                        "default": false
                    },
                    "includeReposts": {
                        "title": "Include Reposts",
                        "type": "boolean",
                        "description": "Whether to include reposted content in the results",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
