# Bluesky Scraper: Posts, Profiles, Feeds & Interactions (`autofacts/bluesky-scraper`) Actor

Scrape Bluesky posts, profiles, followers, feeds, threads, likes, reposts and authenticated search/hashtag results.

- **URL**: https://apify.com/autofacts/bluesky-scraper.md
- **Developed by:** [Richard Feng](https://apify.com/autofacts) (community)
- **Categories:** Social media, AI
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 bluesky items

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/platform/actors/running/actors-in-store#pay-per-event

## 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: Posts, Profiles, Feeds & Interactions

Scrape Bluesky public data through the AT Protocol XRPC APIs: posts, profiles, author feeds, followers, following, custom feeds, threads, likers and reposters, plus app-password search, hashtag results and authenticated account likes.

### Features

| Feature | Description |
|---------|-------------|
| Multi-mode coverage | One Actor covers search, profile, posts, followers, following, feed, thread, likers, reposters, actorLikes and hashtag modes |
| Public API first | Most profile, feed, thread and interaction modes use `public.api.bsky.app` without credentials |
| Authenticated modes | Search, hashtag and actorLikes modes use a Bluesky app password |
| Interaction exports | Export post likers and reposters, which many competing Actors omit |
| Clean JSON | Posts and profiles are normalized for monitoring, BI and RAG pipelines |

### Quick Start

```json
{
    "mode": "posts",
    "handles": ["bsky.app"],
    "maxItems": 100
}
````

Search requires an app password:

```json
{
    "mode": "search",
    "query": "open source AI",
    "language": "en",
    "identifier": "your-handle.bsky.social",
    "appPassword": "YOUR_APP_PASSWORD",
    "maxItems": 100
}
```

### Input

| Field | Type | Description |
|-------|------|-------------|
| `mode` | string | `search`, `profile`, `posts`, `followers`, `following`, `feed`, `thread`, `likers`, `reposters`, `actorLikes`, `hashtag` |
| `query` | string | Search text or hashtag text |
| `handles` | array | Handles for profile, posts, followers and following; for actorLikes, use the authenticated account handle or DID |
| `postUri` | string | AT URI for thread, likers and reposters |
| `feedUri` | string | AT URI for a custom feed |
| `dateFrom` | string | Earliest date for search/hashtag modes |
| `language` | string | Optional language filter for search |
| `identifier` | string | Bluesky handle/email for search, hashtag and actorLikes authentication |
| `appPassword` | secret string | Bluesky app password for search, hashtag and actorLikes; do not use your main password |
| `maxItems` | integer | Maximum saved items |

### Output

Post item:

```json
{
    "itemType": "post",
    "mode": "posts",
    "uri": "at://did:plc:.../app.bsky.feed.post/...",
    "author": { "handle": "bsky.app", "displayName": "Bluesky" },
    "text": "Example post text",
    "createdAt": "2026-06-11T00:00:00Z",
    "replyCount": 10,
    "repostCount": 20,
    "likeCount": 100,
    "url": "https://bsky.app/profile/bsky.app/post/..."
}
```

Profile item:

```json
{
    "itemType": "profile",
    "mode": "followers",
    "did": "did:plc:...",
    "handle": "alice.bsky.social",
    "displayName": "Alice",
    "followersCount": 1234,
    "url": "https://bsky.app/profile/alice.bsky.social"
}
```

### Recipes

#### Brand monitoring

```json
{
    "mode": "search",
    "query": "\"my brand\"",
    "identifier": "your-handle.bsky.social",
    "appPassword": "YOUR_APP_PASSWORD",
    "maxItems": 500
}
```

#### Export a creator's audience

```json
{
    "mode": "followers",
    "handles": ["bsky.app"],
    "maxItems": 1000
}
```

#### Analyze who engaged with a post

```json
{
    "mode": "likers",
    "postUri": "at://did:plc:.../app.bsky.feed.post/...",
    "maxItems": 1000
}
```

#### Export your authenticated account likes

Bluesky only exposes `actorLikes` for the authenticated account. Use the same account handle in `handles` and `identifier`.

```json
{
    "mode": "actorLikes",
    "handles": ["your-handle.bsky.social"],
    "identifier": "your-handle.bsky.social",
    "appPassword": "YOUR_APP_PASSWORD",
    "maxItems": 500
}
```

### Pricing

Pay-per-event: **$0.001 per saved item**. A 1,000-item export costs **$1.00**.

### FAQ

**Do I need credentials?**

Only for `search`, `hashtag` and `actorLikes`. Create an app password in Bluesky settings and pass it as `appPassword`. Public profile/feed/thread/likers/reposters modes do not require credentials.

**How do I find a feed URI?**

Open a feed in Bluesky, copy its AT URI from developer tooling or API output, and pass it as `feedUri`. Feed URIs look like `at://did:plc:.../app.bsky.feed.generator/...`.

### Legal & Compliance

This Actor uses the open AT Protocol APIs and only reads public Bluesky data, plus likes from the account that authenticates with an app password. Use an app password rather than your main password.

# Actor input Schema

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

What to scrape.

## `query` (type: `string`):

Search text for search mode, or hashtag text for hashtag mode. Hashtag mode automatically prefixes #.

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

Bluesky handles for profile, posts, followers and following modes. For actorLikes, provide the authenticated account handle or DID.

## `postUri` (type: `string`):

AT URI for thread, likers or reposters mode, e.g. at://did:plc:.../app.bsky.feed.post/...

## `feedUri` (type: `string`):

AT URI for a custom feed, e.g. at://did:plc:.../app.bsky.feed.generator/...

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

Earliest post date for authenticated search/hashtag modes (YYYY-MM-DD).

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

Optional BCP-47 language filter for search, e.g. en.

## `depth` (type: `integer`):

Reply depth for thread mode.

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

Required for search, hashtag and actorLikes modes. Use your handle or email.

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

Required for search, hashtag and actorLikes modes. Generate an app password in Bluesky settings; do not use your main password.

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

Maximum number of posts or profiles to extract and save. Each saved item is charged as one event.

## Actor input object example

```json
{
  "mode": "posts",
  "query": "openai",
  "handles": [
    "bsky.app"
  ],
  "depth": 6,
  "maxItems": 100
}
```

# Actor output Schema

## `overview` (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 = {
    "query": "openai",
    "handles": [
        "bsky.app"
    ]
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bluesky Scraper: Posts, Profiles, Feeds & Interactions",
        "description": "Scrape Bluesky posts, profiles, followers, feeds, threads, likes, reposts and authenticated search/hashtag results.",
        "version": "1.0",
        "x-build-id": "D8mmYb5JoVqYYbvrY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/autofacts~bluesky-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-autofacts-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/autofacts~bluesky-scraper/runs": {
            "post": {
                "operationId": "runs-sync-autofacts-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/autofacts~bluesky-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-autofacts-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": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "profile",
                            "posts",
                            "followers",
                            "following",
                            "feed",
                            "thread",
                            "likers",
                            "reposters",
                            "actorLikes",
                            "hashtag"
                        ],
                        "type": "string",
                        "description": "What to scrape.",
                        "default": "posts"
                    },
                    "query": {
                        "title": "Query or hashtag",
                        "type": "string",
                        "description": "Search text for search mode, or hashtag text for hashtag mode. Hashtag mode automatically prefixes #."
                    },
                    "handles": {
                        "title": "Handles",
                        "type": "array",
                        "description": "Bluesky handles for profile, posts, followers and following modes. For actorLikes, provide the authenticated account handle or DID.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postUri": {
                        "title": "Post URI",
                        "type": "string",
                        "description": "AT URI for thread, likers or reposters mode, e.g. at://did:plc:.../app.bsky.feed.post/..."
                    },
                    "feedUri": {
                        "title": "Feed URI",
                        "type": "string",
                        "description": "AT URI for a custom feed, e.g. at://did:plc:.../app.bsky.feed.generator/..."
                    },
                    "dateFrom": {
                        "title": "Date from",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Earliest post date for authenticated search/hashtag modes (YYYY-MM-DD)."
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Optional BCP-47 language filter for search, e.g. en."
                    },
                    "depth": {
                        "title": "Thread depth",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Reply depth for thread mode.",
                        "default": 6
                    },
                    "identifier": {
                        "title": "Bluesky identifier",
                        "type": "string",
                        "description": "Required for search, hashtag and actorLikes modes. Use your handle or email."
                    },
                    "appPassword": {
                        "title": "Bluesky app password",
                        "type": "string",
                        "description": "Required for search, hashtag and actorLikes modes. Generate an app password in Bluesky settings; do not use your main password."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of posts or profiles to extract and save. Each saved item is charged as one event.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
