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

Scrape Bluesky posts, profiles and social graph: a user's posts (text, likes, reposts, replies), profile stats, followers and following. Search users by keyword.

- **URL**: https://apify.com/hipersoft/bluesky-scraper.md
- **Developed by:** [Hipersoft](https://apify.com/hipersoft) (community)
- **Categories:** Social media
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.000635 / item scraped

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bluesky Scraper — Posts, Profiles, Followers & Keyword User Search

Scrape **Bluesky** posts, profiles, followers and following as structured data. Feed it handles, DIDs or profile URLs — or discover users by keyword — pick a data type, and export **engagement counts, post text, media, link cards and profile stats** to clean **JSON, CSV, Excel or XML**.

![Bluesky Scraper input — actors, search terms and data type in the Apify Console](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/bluesky-scraper-input.png?v=2)

### What does Bluesky Scraper do?

Bluesky Scraper is a crawler that extracts public data from the Bluesky social network. Give it one or more accounts (or a keyword to discover accounts) and choose whether to collect posts, profile info, followers or following. It returns tidy records with full engagement metrics, media, link previews and timeline context, ready to export or pull through the API.

### What data can you scrape from Bluesky?

| Data point | Description |
| --- | --- |
| Post text & URI | Post body, at:// URI and public link |
| Author | Handle, display name and DID |
| Timestamp & language | When posted and detected languages |
| Engagement | Likes, reposts, replies, quotes, bookmarks |
| Timeline context | Reply and repost flags |
| Media | Post images and embed type |
| Link cards | External URL, title and description |

### What you get

![Bluesky Scraper output example — posts with engagement counts and media as structured JSON](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/bluesky-scraper-output.png?v=5)

Each post is one clean JSON record:

```json
{
  "type": "post",
  "uri": "at://did:plc:abc123/app.bsky.feed.post/3kxyz",
  "handle": "nytimes.com",
  "displayName": "The New York Times",
  "authorDid": "did:plc:abc123",
  "text": "Breaking:...",
  "createdAt": "2026-07-20T14:03:00.000Z",
  "langs": ["en"],
  "likeCount": 812,
  "repostCount": 145,
  "replyCount": 63,
  "quoteCount": 21,
  "bookmarkCount": 9,
  "isReply": false,
  "isRepost": false,
  "embedType": "app.bsky.embed.images#view",
  "images": ["https://cdn.bsky.app/img/feed_fullsize/plain/..."],
  "externalUrl": null,
  "externalTitle": null,
  "externalDescription": null,
  "url": "https://bsky.app/profile/nytimes.com/post/3kxyz"
}
```

#### Output schema

| Field | Type | Description |
| --- | --- | --- |
| `type` | string | Record type, e.g. post, profile, follower. |
| `uri` | string | The at:// URI identifying the post. |
| `handle` | string | Author's Bluesky handle. |
| `displayName` | string | Author's display name. |
| `authorDid` | string | Author's decentralized identifier (DID). |
| `text` | string | Full text of the post. |
| `createdAt` | string (ISO date) | Timestamp when the post was created. |
| `langs` | array | Detected language codes for the post. |
| `likeCount` | integer | Number of likes. |
| `repostCount` | integer | Number of reposts. |
| `replyCount` | integer | Number of replies. |
| `quoteCount` | integer | Number of quote posts. |
| `bookmarkCount` | integer | Number of bookmarks. |
| `isReply` | boolean | True if the post is a reply. |
| `isRepost` | boolean | True if the record is a repost. |
| `embedType` | string | Type of embedded media on the post. |
| `images` | array | URLs of images attached to the post. |
| `externalUrl` | string | URL from an embedded link card, if any. |
| `externalTitle` | string | Title from an embedded link card. |
| `externalDescription` | string | Description from an embedded link card. |
| `url` | string (URL) | Direct link to the post on bsky.app. |

### Use cases

- Track engagement on a brand or competitor's Bluesky posts over time.
- Build follower/following graphs for network and influencer analysis.
- Discover accounts in a topic niche via keyword search, then pull their feeds.
- Monitor news outlets and public figures for social listening dashboards.
- Assemble datasets for research on discourse, sentiment and trends.
- Enrich CRM and outreach lists with public profile signals.

### How to scrape Bluesky data

1. Add Bluesky Scraper to your Apify account and open the input.
2. Enter one or more `actors` (handles, DIDs or profile URLs), or add `searchTerms` to discover accounts by keyword.
3. Choose the `dataType`: posts, profile, followers or following.
4. Set `maxItemsPerActor` (and `maxSearchActors`) to control volume, then click **Run**.
5. Export the results as JSON, CSV, Excel or XML, or pull them through the Apify API.

### Input

```json
{
  "actors": ["jay.bsky.team", "https://bsky.app/profile/nytimes.com"],
  "searchTerms": ["climate news"],
  "dataType": "posts",
  "maxItemsPerActor": 100,
  "maxSearchActors": 25
}
```

| Field | Description |
| --- | --- |
| `actors` | Handles, DIDs, or profile URLs to scrape. |
| `searchTerms` | Keywords; matching users are found and scraped too. |
| `dataType` | `posts`, `profile`, `followers`, or `following`. |
| `maxItemsPerActor` | Max posts/followers/following per user (up to 20000). |
| `maxSearchActors` | How many users to take from each search term. |

### Need more social data?

- [Twitter Scraper](https://apify.com/hipersoft/twitter-scraper)
- [Reddit Scraper](https://apify.com/hipersoft/reddit-scraper)
- [Pinterest Scraper](https://apify.com/hipersoft/pinterest-scraper)
- [Telegram Scraper](https://apify.com/hipersoft/telegram-scraper)
- [Weibo Scraper](https://apify.com/hipersoft/weibo-scraper)

### FAQ

**How many posts or followers can I scrape?**
Up to 20,000 items per account — set `maxItemsPerActor` to control volume.

**Can I discover accounts I don't know yet?**
Yes. Add `searchTerms` and the scraper finds matching accounts and scrapes them alongside your list.

**What export formats are supported?**
JSON, CSV, Excel and XML, plus programmatic access via the Apify API.

**How fresh is the data?**
Every run reads live public data, so results reflect the current state of each account.

**Can Bluesky Scraper connect to my other tools?**
The Bluesky Scraper can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JavaScript/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

**Is scraping Bluesky legal?**
The scraper reads only public, unauthenticated data. You are responsible for complying with Bluesky's terms and applicable laws.

### Related Actors

- [Twitter Scraper](https://apify.com/hipersoft/twitter-scraper)
- [Xiaohongshu Scraper](https://apify.com/hipersoft/xiaohongshu-scraper)
- [Weibo Scraper](https://apify.com/hipersoft/weibo-scraper)
- [Reddit Scraper](https://apify.com/hipersoft/reddit-scraper)

### Notes

Original clean-room implementation. Returns only public data; you are responsible for compliance with Bluesky's terms. Not affiliated with Bluesky.

# Actor input Schema

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

Bluesky handles (e.g. bsky.app), DIDs, or profile URLs. The selected data type is scraped for each.

## `searchTerms` (type: `array`):

Optional. Find users matching these keywords (via actor search) and include them alongside the handles above.

## `dataType` (type: `string`):

What to scrape for each user.

## `maxItemsPerActor` (type: `integer`):

Maximum posts / followers / following to collect per user (ignored for profile info).

## `maxSearchActors` (type: `integer`):

How many users to take from each search term.

## Actor input object example

```json
{
  "actors": [
    "jay.bsky.team",
    "https://bsky.app/profile/nytimes.com"
  ],
  "searchTerms": [
    "climate news"
  ],
  "dataType": "posts",
  "maxItemsPerActor": 100,
  "maxSearchActors": 25
}
```

# 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("hipersoft/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("hipersoft/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 hipersoft/bluesky-scraper --silent --output-dataset

```

## MCP server setup

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