# Bluesky Scraper — $0.50/1k · Posts, Profiles & Followers (`tidydata/bluesky-scraper`) Actor

Scrape Bluesky without login: search posts by keyword, hashtag or language, get any profile's posts, a post's replies, followers and following lists, and search users. Likes, reposts, replies, quotes, links, images, follower counts. $0.50 per 1,000 results.

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

## Pricing

from $0.40 / 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.
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 & Search

Scrape **Bluesky** without an account: **search posts** by keyword, #hashtag or language, get **any profile and its posts**, a **post's replies**, **followers and following** lists, and **search users** by name or bio. Every post comes with **likes, reposts, replies, quotes, hashtags, links, images, video and the author** — optionally with the author's follower count. Every profile comes with **followers, following, posts count, bio and websites**.

**$0.50 per 1,000 results.** No login, no API key, no browser.

- ✅ **6 ways in**: post search · profiles · profile posts · post replies (threads) · followers / following · user search
- ✅ **Engagement**: likes, reposts, replies, quotes and bookmarks per post
- ✅ **Rich posts**: hashtags, mentions, links and link cards, images with alt text, video, quoted post, reply-to, reposts flagged
- ✅ **Search filters**: latest or top, language, date range, plus Bluesky's own syntax (`from:`, `mentions:`, `domain:`)
- ✅ **Profiles with stats** for followers/following lists and user search (great for influencer and lead lists)
- ✅ **Author stats on posts** (followers, following, posts) — find the most influential voices on a topic
- ✅ Official public AT Protocol API → fast and stable

### Who uses it

- **Brands & social media managers** — monitor mentions, hashtags and campaigns; find who talks about you.
- **Marketers & agencies** — build influencer and lead lists by topic, with follower counts.
- **Researchers & journalists** — collect public conversations on any topic, by language and date.
- **AI teams** — fresh, public, real-language text data for sentiment analysis and LLM pipelines.
- **Communities** — export your followers, or the replies to a post (giveaways, Q\&A).

### How to use it

Fill in any mix (all optional, at least one):

1. **Search posts** — `#photography`, `"climate tech"`, `apify from:someone.bsky.social`. Choose **latest/top**, **language** and **dates** (up to 100 per term without login — see below).
2. **Profiles** — `bsky.app`, `@someone.bsky.social` or `https://bsky.app/profile/…` (with or without their posts; filter replies or media).
3. **Post replies** — `https://bsky.app/profile/bsky.app/post/3myaytlknus25` → the post and its replies, most liked first.
4. **Followers of / Following of** — any account.
5. **Search users** — `data scientist`, `photographer madrid`.

Set **max results** per search/profile/list and run. Export to CSV, Excel, JSON, Google Sheets…, or schedule it to monitor a topic daily.

### Output examples

A post:

```json
{
  "type": "post",
  "source": "posts: bsky.app",
  "url": "https://bsky.app/profile/bsky.app/post/3myaytlknus25",
  "text": "if you remember none pizza with left beef, it's time to start taking a daily multivitamin",
  "createdAt": "2026-10-19T20:53:01.192Z",
  "authorHandle": "bsky.app",
  "authorName": "Bluesky",
  "authorFollowers": 35316453,
  "likeCount": 1485,
  "repostCount": 184,
  "replyCount": 74,
  "quoteCount": 37,
  "hashtags": null,
  "links": null,
  "images": null,
  "isReply": false,
  "isRepost": false,
  "lang": "en",
  "charged": true
}
```

A profile (from a profile, followers/following or user search):

```json
{
  "type": "profile",
  "handle": "bsky.app",
  "displayName": "Bluesky",
  "url": "https://bsky.app/profile/bsky.app",
  "description": "official Bluesky account (check username👆) …",
  "followersCount": 35316453,
  "followsCount": 22,
  "postsCount": 883,
  "createdAt": "2023-04-12T04:53:57.057Z",
  "websites": null,
  "charged": true
}
```

Other post fields: `uri`, `indexedAt`, `authorDid`, `authorAvatar`, `bookmarkCount`, `mentions`, `video`, `linkCard`, `quotedPost`, `replyTo`, `repostedBy`, `labels`. Profile fields also include `did`, `avatar`, `banner`, `pinnedPost`, and for lists `relation` / `ofAccount`.

### Pricing

**$0.0005 per result ($0.50 per 1,000)** — a post or a profile. Store discounts apply automatically on paid Apify plans (−10 % Bronze, −15 % Silver, −20 % Gold). Error rows are free. Set a maximum cost per run and the scraper stops right there.

Example: 2,000 posts about your brand + their authors' follower counts = **$1**.

### Good to know

- Only **public** data is collected, exactly what anyone sees on bsky.app without logging in. Accounts that ask not to be shown to logged-out users are respected by Bluesky's API.
- **Post search without login gives the newest 100 posts per search term** (Bluesky blocks deeper search for logged-out requests). Use several terms, a language or `from:` to cover more — or add **your Bluesky handle and an App Password** (Settings → Privacy and security → App passwords, never your main password) to unlock **full search with exact date ranges**. The password is stored encrypted by Apify and used only to log in. Profiles, posts of profiles, replies, followers and user search need no login and have no such cap.
- Replies are collected up to 10 levels deep.

### More from TidyData

[Telegram Channel Scraper](https://apify.com/tidydata/telegram-channel-scraper) · [YouTube Comments Scraper](https://apify.com/tidydata/youtube-comments-scraper) · [Google News Scraper](https://apify.com/tidydata/google-news-scraper) · [Merge, Deduplicate & Transform](https://apify.com/tidydata/merge-dedupe-datasets).

### FAQ

**Is it legal?** It uses Bluesky's public API for public posts and profiles, without login. Personal data in posts (names, handles) is protected by laws like GDPR: collect only what you need and have a legitimate reason to process it.

**Something missing?** Open an issue in the Issues tab — we answer fast.

# Actor input Schema

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

Keywords, #hashtags or phrases. Bluesky search syntax works too: from:handle, mentions:handle, domain:example.com, lang:en.

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

Order of search results.

## `since` (type: `string`):

Only search posts from this date, e.g. 2026-10-01.

## `until` (type: `string`):

Only search posts before this date, e.g. 2026-10-20.

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

2-letter code to filter search results, e.g. en, es, pt, ja.

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

Only for post search beyond 100 results per term and exact date filters: Bluesky blocks deeper search for logged-out requests. Example: yourname.bsky.social

## `blueskyAppPassword` (type: `string`):

Create one in Bluesky → Settings → Privacy and security → App passwords (never your main password). Stored encrypted by Apify, used only to log in for search.

## `profiles` (type: `array`):

Handles or profile links (bsky.app/profile/…). Returns the profile with followers/posts counts and, optionally, their posts.

## `includeProfilePosts` (type: `boolean`):

Add each profile's posts (up to max items).

## `profilePostsFilter` (type: `string`):

Same filters as on the profile page. Reposts are included and flagged with isRepost.

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

Post links (bsky.app/profile/…/post/…): the post and its replies, most liked first.

## `followersOf` (type: `array`):

Handles or profile links: list their followers with full profile stats.

## `followingOf` (type: `array`):

Handles or profile links: list the accounts they follow.

## `searchUsers` (type: `array`):

Find accounts by name, bio keyword or handle, e.g. 'data scientist'.

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

Limit for each search term, profile's posts, thread, followers list or user search.

## `addAuthorStats` (type: `boolean`):

Adds authorFollowers, authorFollowing and authorPosts to every post (same price).

## Actor input object example

```json
{
  "searchTerms": [
    "#photography"
  ],
  "sort": "latest",
  "profiles": [
    "bsky.app"
  ],
  "includeProfilePosts": true,
  "profilePostsFilter": "posts_with_replies",
  "maxItems": 100,
  "addAuthorStats": false
}
```

# Actor output Schema

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

One row per result.

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

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/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 = {
    "searchTerms": ["#photography"],
    "profiles": ["bsky.app"],
}

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

```

## MCP server setup

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