# Bluesky Scraper: Posts, Search, Replies, Followers (`themineworks/bluesky-scraper`) Actor

Scrape public Bluesky posts by keyword with date, language and author filters, a profile's posts, a post's replies, profiles with follower counts, and follower lists. Likes, reposts, replies, quotes, links, images. No login or app password. Pay per row.

- **URL**: https://apify.com/themineworks/bluesky-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 rows

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, Search, Replies, Followers

[![1,500 Bluesky posts in 6.4 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/bluesky-scraper-hero.png)](https://console.apify.com/actors/Sf86fyYNWa6RPLLKN/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Six jobs in one actor, all without a login.** Search posts by keyword, read a profile's posts, pull a post with every reply under it, get profiles with follower counts, and list followers or followed accounts. Our proof run read **1,500 posts for 3 searches in 6.4 seconds**, 500 each for "artificial intelligence", "climate" and #booksky. No Bluesky account, no app password, no cookies.
- **Real counts and the full post, not a snippet.** Every post row carries likes, reposts, replies, quotes and bookmarks as Bluesky counts them, the whole text, languages, hashtags, mentions, links, the link card, full size images with their alt text, the video playlist, the quoted post, and the reply chain. 2,141 posts in our proof runs filled `like_count`, `reply_count`, `repost_count`, `quote_count` and `embed_type` on every row.
- **You pay only for rows you receive.** One charge per post, profile or account row saved to your dataset, plus a flat start fee per run. Handles and posts that do not exist (our proof runs had one of each, reported as not found), refused requests, the same post found by two of your searches, reposts you switch off and results an earlier run already gave you (when you switch that on) are never charged.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/Sf86fyYNWa6RPLLKN/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Social media and video family:** [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this input and press Start. It returns the 20 newest posts that mention "artificial intelligence", in about 3 seconds:

```json
{
  "mode": "search",
  "searchTerms": ["artificial intelligence"],
  "maxResults": 20
}
```

Pick the job with `mode`, then fill the one field that mode reads:

- **search** reads `searchTerms`: plain words, `"exact phrases"`, `#hashtags`, or Bluesky's own operators such as `from:bsky.app` or `lang:en`, one search per line.
- **profile_posts**, **profiles**, **followers** and **following** read `handles`: a handle (`bsky.app`, `jay.bsky.team`), an `@handle`, a DID (`did:plc:z72i7hdynmk6r22z27h6tvur`) or a profile link (`https://bsky.app/profile/nytimes.com`). A bare name without a dot, such as `stephenking`, is read as `stephenking.bsky.social`.
- **thread_replies** reads `postUrls`: a post link (`https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22`) or an `at://` post URI.

Apify's free plan includes $5 of credit every month, which covers about 3,700 results at this actor's price.

#### Copy to your AI assistant

```text
themineworks/bluesky-scraper on Apify. Reads public Bluesky data without a login: posts matching a search (with date, language, author and linked domain filters), a profile's posts, a post and all its replies, profiles with follower and post counts, and the followers or follows of an account; one row per post or account with likes, reposts, replies, quotes, text, links, images, video, quoted post and reply chain. Call ApifyClient("TOKEN").actor("themineworks/bluesky-scraper").call(run_input={"mode": "search", "searchTerms": ["artificial intelligence"], "maxResults": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: mode (search, profile_posts, thread_replies, profiles, followers or following). Optional: searchTerms (search), handles (profile_posts, profiles, followers, following), postUrls (thread_replies), maxResults (default 50, 10 to 100000), sort (latest or top), since, until, language, author, domain, feedFilter (default posts_no_replies), includeReposts (default false), includeNestedReplies (default true), followerDetails (default false), onlyNewResults (default false). Skip rows that have "_type": "status". Full spec: GET https://api.apify.com/v2/acts/themineworks~bluesky-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Six modes**: `search`, `profile_posts`, `thread_replies`, `profiles`, `followers` and `following`, each with its own row shape, in one actor and one price.
- **Up to 100,000 rows per search term, account or post.** Bluesky hands out up to 100 posts or accounts per request. In our tests one "latest" search read 2,000 posts going back six months in 43 seconds, and a follower list read 200 accounts with their counts in 10 seconds.
- **Search filters that matter for monitoring**: newest first or Bluesky's top ranking, `since` and `until` (a date, a time, or a window such as `7 days`), `language`, only posts by one `author`, and only posts that link to a `domain` such as `nytimes.com`.
- **About 50 fields per post**: author handle, name, DID, avatar and verification; text, creation and index times; likes, reposts, replies, quotes, bookmarks; languages, hashtags, mentions, links; images with alt text, gallery carousels, video playlist and poster, link card, quoted post with its text; reply parent and root; repost flag and time; moderation labels.
- **Whole threads**: `thread_replies` returns the post itself, then every reply Bluesky shows under it, direct replies first, with `thread_depth` and the parent of each reply, up to 1,000 levels deep.
- **Only new results on repeat runs**: switch on `onlyNewResults` for a schedule and each run returns, and charges, only posts, replies or accounts no earlier run of yours delivered. In our test the second run delivered 0 posts and stopped after one request.

### How to use it

#### Basic: the latest posts about a topic

```json
{
  "mode": "search",
  "searchTerms": ["climate"],
  "maxResults": 200,
  "language": "en"
}
```

Newest first. Each request reads up to 100 posts, and the actor keeps going back in time until it has 200 or the search runs out.

#### Several searches at once, inside a date window

```json
{
  "mode": "search",
  "searchTerms": ["artificial intelligence", "\"open source\"", "#booksky"],
  "maxResults": 500,
  "since": "2026-10-01",
  "until": "2026-10-05"
}
```

Up to 500 searches per run, read four at a time. A post that matches two of your searches is delivered once, under the first one, and charged once.

#### A profile's posts, with reposts

```json
{
  "mode": "profile_posts",
  "handles": ["bsky.app", "https://bsky.app/profile/nytimes.com"],
  "maxResults": 100,
  "feedFilter": "posts_no_replies",
  "includeReposts": true
}
```

`feedFilter` picks the same tabs the profile page shows: `posts_no_replies`, `posts_with_replies`, `posts_with_media` or `posts_and_author_threads`. Reposts come with `is_repost`, `reposted_by_handle` and `reposted_at`; the author fields then name the original author.

#### Every reply under a post

```json
{
  "mode": "thread_replies",
  "postUrls": ["https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"],
  "maxResults": 500
}
```

The post itself comes first (`thread_depth` 0), then direct replies (1), then replies to replies (2) and so on. Set `includeNestedReplies` to false for direct replies only.

#### Profiles with follower, following and post counts

```json
{
  "mode": "profiles",
  "handles": ["bsky.app", "nytimes.com", "theonion.com", "did:plc:ewvi7nxzyoun6zhxrhs64oiz"]
}
```

One row per account, 25 accounts per request. Accounts that do not exist get a free status row that says so, and a handle and a DID of the same account give one row, charged once.

#### Followers or followed accounts

```json
{
  "mode": "followers",
  "handles": ["atproto.com"],
  "maxResults": 1000,
  "followerDetails": true
}
```

Use `following` instead of `followers` for the accounts a handle follows. Newest followers come first. `followerDetails` adds `followers_count`, `follows_count` and `posts_count` to every row, at one extra request per 25 accounts and no extra price.

#### Brand and keyword monitoring every morning

```json
{
  "mode": "search",
  "searchTerms": ["yourbrand", "\"your product name\"", "#yourhashtag"],
  "maxResults": 1000,
  "onlyNewResults": true
}
```

Schedule it daily in Apify Console (Schedules, then Add schedule). Each run returns, and charges, only posts no earlier run delivered for the same search, and it stops as soon as it reaches posts it has already seen, so a quiet day costs little more than the start fee.

#### Who shares links to your site

```json
{
  "mode": "search",
  "searchTerms": ["election"],
  "domain": "nytimes.com",
  "since": "7 days",
  "maxResults": 1000
}
```

`domain` keeps posts that link to that site. In our test, all 50 posts returned for "election" with `domain: nytimes.com` carried a nytimes.com link. Run one search per topic you care about, with your own site in `domain`.

#### Audience research on a competitor

Run `followers` with `followerDetails` on a competitor's handle, then sort by `followers_count` to find the accounts with reach in that audience. Run `profiles` weekly on a list of accounts to chart follower growth over time.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | `search` | `search`, `profile_posts`, `thread_replies`, `profiles`, `followers` or `following`. Required. |
| `searchTerms` | array of strings | `["artificial intelligence"]` | search mode: one search per line, words, phrases in quotes, hashtags or Bluesky operators. Up to 500 per run. |
| `handles` | array of strings | `["bsky.app"]` | profile_posts, profiles, followers and following: handles, @handles, DIDs or profile links. Up to 500 per run. |
| `postUrls` | array of strings | `["https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"]` | thread_replies: post links or `at://` post URIs. Up to 500 per run. |
| `maxResults` | integer | `50` | Rows per search term, account or post, 10 to 100,000. Ignored in profiles mode. |
| `sort` | string | `latest` | search mode: `latest` (newest first, reads back in time up to your max) or `top` (Bluesky's ranking, about 100 posts per term). |
| `since` | string | none | Posts on or after this date, time or window (`2026-10-01`, `2026-10-01T09:00:00Z`, `7 days`). search and profile_posts. |
| `until` | string | none | Posts before this date, time or window. search and profile_posts. |
| `language` | string | none | search mode: a language code such as `en`, `de` or `ja`. |
| `author` | string | none | search mode: only posts by this handle or DID. |
| `domain` | string | none | search mode: only posts that link to this site, for example `nytimes.com`. |
| `feedFilter` | string | `posts_no_replies` | profile_posts: `posts_no_replies`, `posts_with_replies`, `posts_with_media` or `posts_and_author_threads`. |
| `includeReposts` | boolean | `false` | profile_posts: also return posts the account reposted. Skipped reposts are not charged. |
| `includeNestedReplies` | boolean | `true` | thread_replies: also return replies to replies. Untick for direct replies only. |
| `followerDetails` | boolean | `false` | followers and following: add follower, following and post counts to every account row. |
| `onlyNewResults` | boolean | `false` | Skip results an earlier run of yours delivered for the same term, account or post. Not used in profiles mode. |

There is no proxy setting: the actor always reads through Apify's datacenter proxy, which is included in the price.

### What data do you get?

One row per post (`record_type` post), per profile (`profile`) or per account in a follower list (`follower` or `following`). Every row says which `source_mode` and `source_input` produced it and its `position`.

**Post rows**: `post_url`, `post_uri`, `post_cid`; the author's `author_handle`, `author_display_name`, `author_did`, `author_profile_url`, `author_avatar_url`, `author_verified`; `text`, `created_at`, `indexed_at`; `like_count`, `repost_count`, `reply_count`, `quote_count`, `bookmark_count`; `langs`, `hashtags`, `mentions`, `links`; `embed_type` with `image_urls`, `image_alts`, `video_playlist_url`, `video_thumbnail_url`, `external_url`, `external_title`, `external_description`, `quoted_post_url`, `quoted_post_uri`, `quoted_author_handle`, `quoted_text`; the reply chain `is_reply`, `reply_parent_url`, `reply_parent_uri`, `reply_root_url`, `reply_root_uri`; reposts `is_repost`, `reposted_by_handle`, `reposted_at`; moderation `labels`; and `search_term` (search) or `thread_depth` and `thread_post_url` (thread_replies).

**Profile rows**: `handle`, `display_name`, `did`, `profile_url`, `description`, `avatar_url`, `banner_url`, `followers_count`, `follows_count`, `posts_count`, `lists_count`, `feeds_count`, `starter_packs_count`, `is_labeler`, `verified`, `trusted_verifier`, `pinned_post_url`, `created_at`, `indexed_at`, `labels`.

**Follower and following rows**: `handle`, `display_name`, `did`, `profile_url`, `description`, `avatar_url`, `verified`, `created_at`, `indexed_at`, `labels`, the account they belong to (`target_handle`, `target_did`), and with `followerDetails` also `followers_count`, `follows_count` and `posts_count`.

All times are UTC in ISO 8601. In our proof runs, of 2,141 posts: 857 had a link card, 418 images, 13 a photo gallery, 49 a video, 188 quoted another post and 616 were text only.

#### Stable fields for automations

These fields were present in every one of the 2,141 post rows of the proof runs:

| Field | What it holds |
|---|---|
| `record_type` | post, profile, follower or following |
| `source_mode` | The mode that produced the row |
| `source_input` | Your search term, handle or post link |
| `post_url` | Link to the post on bsky.app |
| `post_uri` | Permanent at:// id of the post |
| `author_handle` | Author handle |
| `author_did` | Author's permanent account id |
| `text` | Full post text (empty for image only posts) |
| `created_at` | When the post was written, UTC |
| `like_count` | Likes |
| `repost_count` | Reposts |
| `reply_count` | Replies |
| `quote_count` | Quote posts |
| `embed_type` | none, images, gallery, video, external, quote or quote with media |
| `is_reply` | The post answers another post |

These names will not change. New fields may be added; existing ones keep their name and meaning.

#### Output examples

Four real rows from the proof runs, with avatar links and a few run fields left out.

##### Search result with a link card (The Bulwark, "artificial intelligence")

```json
{
  "record_type": "post",
  "source_mode": "search",
  "source_input": "artificial intelligence",
  "position": 123,
  "post_url": "https://bsky.app/profile/thebulwark.com/post/3mx5gzcyoke2p",
  "post_uri": "at://did:plc:aunpu65mdrhwfie7ynymlzeh/app.bsky.feed.post/3mx5gzcyoke2p",
  "author_handle": "thebulwark.com",
  "author_display_name": "The Bulwark",
  "author_did": "did:plc:aunpu65mdrhwfie7ynymlzeh",
  "author_verified": true,
  "text": "AI excels at gathering, digesting, and applying information, including scientific data. And this makes it useful for debunking charlatans, cranks, and conspiracy theorists. Like those peddling unfounded claims about the dangers of vaccines.",
  "created_at": "2026-10-05T17:30:54.951Z",
  "like_count": 81,
  "repost_count": 23,
  "reply_count": 4,
  "quote_count": 0,
  "bookmark_count": 2,
  "langs": ["en"],
  "links": ["https://lnk.thebulwark.com/4y4VFyy"],
  "embed_type": "external",
  "external_url": "https://lnk.thebulwark.com/4y4VFyy",
  "external_title": "RFK Jr. Wants to AI-ify Health Care. Claude Says He's Full of Sh*t.",
  "is_reply": false,
  "is_repost": false,
  "search_term": "artificial intelligence"
}
```

##### The post at the top of a thread, quoting another post (Bluesky)

```json
{
  "record_type": "post",
  "source_mode": "thread_replies",
  "position": 1,
  "post_url": "https://bsky.app/profile/bsky.app/post/3mx5e63uvns2d",
  "author_handle": "bsky.app",
  "author_display_name": "Bluesky",
  "text": "Congratulations to Nobel Prize winner @deisseroth.bsky.social! Follow along with the prize announcements all week via @nobelprize.org",
  "created_at": "2026-10-05T16:39:54.426Z",
  "like_count": 1233,
  "repost_count": 95,
  "reply_count": 17,
  "quote_count": 6,
  "bookmark_count": 12,
  "mentions": ["deisseroth.bsky.social", "nobelprize.org"],
  "embed_type": "quote",
  "quoted_post_url": "https://bsky.app/profile/nobelprize.org/post/3mx4smdh4el2k",
  "quoted_author_handle": "nobelprize.org",
  "quoted_text": "Congratulations to our first Nobel Prize laureate of 2026 🎉\n\nEarly this morning Karl Deisseroth found out he was awarded this year's Nobel Prize in Physiology or Medicine.",
  "thread_depth": 0,
  "thread_post_url": "https://bsky.app/profile/bsky.app/post/3mx5e63uvns2d"
}
```

The 20 rows after it in the same run are the replies, each with `thread_depth`, `reply_parent_url` and `reply_root_url`.

##### Profile with counts (Bluesky)

```json
{
  "record_type": "profile",
  "source_mode": "profiles",
  "source_input": "bsky.app",
  "handle": "bsky.app",
  "display_name": "Bluesky",
  "did": "did:plc:z72i7hdynmk6r22z27h6tvur",
  "profile_url": "https://bsky.app/profile/bsky.app",
  "description": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: support@bsky.app",
  "followers_count": 35158674,
  "follows_count": 15,
  "posts_count": 866,
  "lists_count": 18,
  "feeds_count": 7,
  "starter_packs_count": 15,
  "verified": false,
  "trusted_verifier": true,
  "pinned_post_url": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l",
  "created_at": "2023-04-12T04:53:57.057Z"
}
```

##### Follower with details (a follower of atproto.com)

```json
{
  "record_type": "follower",
  "source_mode": "followers",
  "source_input": "atproto.com",
  "position": 24,
  "handle": "freenext.app",
  "did": "did:plc:35u2kotouldl5zh3wu674i5b",
  "profile_url": "https://bsky.app/profile/freenext.app",
  "created_at": "2026-10-05T01:19:10.861Z",
  "target_handle": "atproto.com",
  "target_did": "did:plc:ewvi7nxzyoun6zhxrhs64oiz",
  "followers_count": 3,
  "follows_count": 5,
  "posts_count": 4
}
```

### Pricing

Pay per event: you pay for each row delivered to your dataset (a post, a profile or an account), plus a flat $0.005 per run, whatever memory you choose. Nothing else is billed: no proxy add-on, no charge per search term or per request.

| Event | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) and above |
|---|---|---|---|---|
| Row delivered, per 1,000 rows | $1.29 | $1.09 | $0.89 | $0.69 |
| Run start, once per run | $0.005 | $0.005 | $0.005 | $0.005 |

**Never charged:** handles and posts that do not exist or that Bluesky hides from logged out visitors, lines that are not handles or post links, requests Bluesky refuses, the same post found by two of your searches, reposts when `includeReposts` is off, results an earlier run already delivered when `onlyNewResults` is on, the extra profile requests that `followerDetails` makes, and the status rows that explain a target with no results. A run that delivers nothing costs only the start fee.

To cap a run's cost, set Maximum cost per run in the run options; the actor stops delivering, and charging, when that budget is used.

### FAQ

#### What does this actor read?

Bluesky's public AppView, the same xrpc service Bluesky's own app calls: `searchPosts` for search, `getAuthorFeed` for a profile's posts, `getPostThread` for replies, `getProfiles` for profiles, and `getFollowers` and `getFollows` for follower lists. It reads public data only, exactly as Bluesky serves it to anyone without an account.

#### Does Bluesky search need a login now?

Partly. The CDN host `public.api.bsky.app` refuses anonymous search outright, so this actor sends search to `api.bsky.app`, which answers a logged out search one page at a time, up to 100 posts, and refuses to follow its own next page link. A "latest" search therefore reads further back by asking again with the `until` filter set to the oldest post it already has, which is how our proof run reached 500 posts per search and a test run reached 2,000 posts going back six months. A "top" search has no time order to walk, so it returns its first page, about 100 posts. Profiles, feeds, threads and follower lists need no login at all.

#### How many results can I get?

Up to 100,000 rows per search term, account or post, and up to 500 search terms, accounts or posts per run. Feeds and follower lists page through to the end. Threads return every reply Bluesky shows under the post, which for very large threads can be fewer than the reply count on the post.

#### How fresh is the data?

Live. Every run reads Bluesky at that moment, and counts are as of the run. In our proof run the newest "artificial intelligence" post was 40 seconds old when it was read. `created_at` is the time the author's app wrote on the post, which is occasionally off (one "climate" post claimed a time two hours in the future); `indexed_at` is when Bluesky received it.

#### Do I need a Bluesky account, an app password or cookies?

No. The actor never logs in and never asks for your handle, password, app password or cookies. Nothing it does can affect an account of yours.

#### Do I need my own proxy?

No. Requests go through Apify's datacenter proxy, which is included in the price. In our proof runs Bluesky answered all 39 requests on the first try: 37 with data and 2 with its not found reply for the handle and the post that do not exist. If Bluesky refuses a request, the actor retries it up to 4 times on a new IP before it reports the target as blocked, uncharged.

#### Why do some searches with hashtags look slightly different past the first page?

Bluesky refuses a search made only of hashtags (for example `#booksky`) once a date filter is added. The actor then searches for the hashtag as a quoted phrase (`"#booksky"`), which Bluesky accepts. In our test, 94 of the first 100 posts were the same either way. Searches that mix words and hashtags are sent unchanged.

#### What happens with a handle or post that does not exist?

It gets a free status row (`_type: status`) that says not found, nothing is charged for it, and the other targets still run. A line that is not a handle, DID, profile link or post link is skipped with a warning and its own status row. Deactivated or taken down accounts are reported as unavailable, also free.

#### Can I monitor keywords or accounts on a schedule?

Yes. Schedule the actor in Apify Console (Schedules, then Add schedule) with `onlyNewResults` on, and each run returns and charges only posts, replies or followers that no earlier run of yours delivered for the same search, account or post. The run stops reading a target as soon as a page brings nothing new.

#### In what formats can I export the data?

From the dataset: JSON, CSV, Excel, XML, HTML table or RSS, from Console or the API. In CSV and Excel the list fields (`links`, `hashtags`, `mentions`, `image_urls`, `langs`) are flattened into columns. The Results view in Console shows type, author, text, counts and links side by side.

#### Can I use it from Claude, ChatGPT or another AI assistant?

Yes, through Apify's MCP server.

- Connector URL: https://mcp.apify.com/?tools=themineworks/bluesky-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http bluesky-scraper "https://mcp.apify.com/?tools=themineworks/bluesky-scraper"`

#### Is it legal to scrape Bluesky?

The actor collects only public posts and profiles that Bluesky serves to anyone without logging in, through Bluesky's own public API, and it does not log in or bypass any login. You are responsible for how you use the data: check Bluesky's terms for your use case and the data protection laws that apply to you, such as GDPR and CCPA, especially when you store or analyse posts and profiles of private people.

### Integrations

- **Google Sheets**: send each run's dataset to a sheet with Apify's Google Sheets integration, one row per post or account.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example to post new brand mentions to Slack.
- **Webhooks**: have Apify call your URL when a run finishes, then fetch the dataset.
- **API**: start runs and read results from any language with the Apify API or the Python and JavaScript clients (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor, VS Code and Claude Code, through the connector URL in the FAQ.

For Meta's Threads, use our [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), which reads posts, profiles, hashtags and search the same way: no login, pay per post.

### More from The Mine Works

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Twitter / X Scraper](https://apify.com/themineworks/twitter-x-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [YouTube Transcript](https://apify.com/themineworks/youtube-transcript-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Xiaohongshu (RED) Scraper](https://apify.com/themineworks/xiaohongshu-explore-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Scraper](https://apify.com/themineworks/telegram-channel-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Finder](https://apify.com/themineworks/telegram-channel-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Pinterest Profile Scraper](https://apify.com/themineworks/pinterest-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search, profile or thread that does not come back right, or a field you need? Open an issue in the Issues tab and include the run link. For new sources or a custom build, email dmineworks@gmail.com.

*Bluesky posts, searches, replies, profiles and follower lists through Bluesky's public API, with likes, reposts, replies, quotes, links and media on every post, no login, charged only for rows you receive.*

# Actor input Schema

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

search reads posts matching your search terms. profile_posts reads the posts of the handles you list. thread_replies reads a post and every reply under it. profiles returns one row per handle with follower, following and post counts. followers and following list the accounts that follow, or are followed by, each handle.

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

One search per line, read the way the Bluesky search box reads it: words, "exact phrases", #hashtags, or Bluesky operators such as from:bsky.app, lang:en or since:2026-10-01. Up to 500 per run. A post that matches two of your terms is delivered once.

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

One account per line: a handle (bsky.app, jay.bsky.team), @handle, a DID (did:plc:...) or a profile link (https://bsky.app/profile/bsky.app). A bare name without a dot is read as name.bsky.social. Up to 500 per run.

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

One post per line: a bsky.app post link or an at:// post URI. The post itself comes first (thread_depth 0), then its replies, direct replies first. Up to 500 per run.

## `maxResults` (type: `integer`):

How many rows to collect for each search term, account or post, 10 to 100,000. Bluesky returns up to 100 posts or accounts per request. A top search stops at about 100. Ignored in profiles mode (one row per handle).

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

search mode: latest reads newest first and keeps going back in time up to your max (our test read 2,000 posts going back 6 months). top uses Bluesky's own ranking, which a logged out visitor can read one page of, so top returns up to about 100 posts per term.

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

Optional. A date (2026-10-01), an ISO time (2026-10-01T09:00:00Z) or a window such as "7 days" or "12 hours". Applies to search and profile_posts.

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

Optional. Same formats as since. Applies to search and profile_posts.

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

Optional. A language code such as en, de, ja or pt. search mode keeps posts Bluesky tags with this language.

## `author` (type: `string`):

Optional. A handle or DID; search mode then returns only that account's posts that match your terms.

## `domain` (type: `string`):

Optional. For example nytimes.com: search mode keeps posts that link to that site. Useful to track who shares your pages.

## `feedFilter` (type: `string`):

profile_posts mode: which of the account's posts to read, the same tabs the Bluesky profile page shows.

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

profile_posts mode: also return posts the account reposted, marked is_repost with reposted_at. Skipped reposts are not charged.

## `includeNestedReplies` (type: `boolean`):

thread_replies mode: also return replies to replies, up to 1,000 levels deep. Untick for direct replies only.

## `followerDetails` (type: `boolean`):

followers and following modes: add followers_count, follows_count and posts_count to every account row. Costs one extra request per 25 accounts, so runs are slower; the price per row is the same.

## `onlyNewResults` (type: `boolean`):

Skip posts, replies and accounts an earlier run of yours already delivered for the same term, account or post, so a scheduled run returns and charges only new ones. Not used in profiles mode.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "artificial intelligence"
  ],
  "handles": [
    "bsky.app"
  ],
  "postUrls": [
    "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"
  ],
  "maxResults": 50,
  "sort": "latest",
  "feedFilter": "posts_no_replies",
  "includeReposts": false,
  "includeNestedReplies": true,
  "followerDetails": false,
  "onlyNewResults": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "mode": "search",
    "searchTerms": [
        "artificial intelligence"
    ],
    "handles": [
        "bsky.app"
    ],
    "postUrls": [
        "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = {
    "mode": "search",
    "searchTerms": ["artificial intelligence"],
    "handles": ["bsky.app"],
    "postUrls": ["https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/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 '{
  "mode": "search",
  "searchTerms": [
    "artificial intelligence"
  ],
  "handles": [
    "bsky.app"
  ],
  "postUrls": [
    "https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22"
  ],
  "maxResults": 50
}' |
apify call themineworks/bluesky-scraper --silent --output-dataset

```

## MCP server setup

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