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

Search Bluesky posts far past the first page: 10,000 posts for one keyword in about 2 minutes. Filter by date, language, author, mention, website or hashtag. Export profiles, followers, following, likers, reposters, liked posts and full reply threads, every field readable.

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

## Pricing

from $0.69 / 1,000 posts

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

[![10,000 posts. 12,000 followers. Under 2 minutes. Richest Bluesky output on Apify.](https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/bluesky-scraper-readme-hero-refresh-v1-6497df6ddbaa.png)](https://console.apify.com/actors/KnyVQJR9KbHRywUXU/input)

From **Clearpath**, creators of [Reddit Search Scraper](https://apify.com/clearpath/reddit-search-scraper), [Reddit Post Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper) and [Reddit Subreddit Posts Scraper](https://apify.com/clearpath/reddit-subreddit-posts-scraper). **190,000+ combined lifetime runs** across these Reddit research scrapers.

### Why choose this actor?

**Detailed posts.** Export text, engagement counts, images, video, linked pages, reply context and author follower counts. Filter searches by date, language, author or hashtag.

**Detailed profiles.** Get handles, counts and public bios. Profile details add verification, past handles, lists and starter packs to the accounts you enter or find through people search. Export followers, replies and other audiences with the options you select.

**Ready to use.** Combine searches and profiles in one run. Download JSON, CSV or Excel for research and monitoring.

The timings come from separate recorded runs: 10,000 posts for "news" in 113 seconds, and 12,000 followers of nytimes.com in 100 seconds. Run times vary; another run of the same search took about 10 minutes. The panel illustrates collected data.

<a href="https://console.apify.com/actors/KnyVQJR9KbHRywUXU/input" data-demo-cta="true"><img src="https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/bluesky-scraper-readme-cta-refresh-v1-6f182feb52ad.png" width="248" height="52" alt="Get Bluesky data" /></a>

### Quick input

Try a small post search and follower export:

```json
{
  "searchPosts": [
    "news"
  ],
  "profiles": [
    "nytimes.com"
  ],
  "includeFollowers": true,
  "maxItemsPerList": 20,
  "includeProfileDetails": false
}
```

[Open actor input](https://console.apify.com/actors/KnyVQJR9KbHRywUXU/input) to change the search or profile. This trial returns up to 20 posts, 20 follower profiles and the entered profile. Each saved post or profile is billed separately. Set a spending limit before running. This small trial does not reproduce the bulk timings.

<table>
<tr><td style="padding:10px 14px;background:#1185FE;border:none;border-radius:4px 4px 0 0"><span style="color:#061129;font-size:14px;font-weight:700">Clearpath social research</span><span style="color:#061129;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Posts, comments &amp; audiences</span></td></tr>
<tr><td style="padding:6px;border:1px solid #C9D8FF;border-top:none;border-radius:0 0 4px 4px;background:#EAF0FF"><span style="display:inline-block;vertical-align:top;width:140px;margin:4px;padding:8px 12px;border:1px solid #C9D8FF;border-radius:4px;background:#D8E4FF"><span style="white-space:nowrap"><img src="https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/bluesky-scraper-readme-logo-search-v1-129da6593340.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://console.apify.com/actors/KnyVQJR9KbHRywUXU/input" style="color:#0B3D91;text-decoration:none;font-weight:700;font-size:13px">Bluesky</a></span><br><span style="color:#0B5CC0;font-size:12px;font-weight:600">&#10148; You are here</span></span>
<span style="display:inline-block;vertical-align:top;width:140px;margin:4px;padding:8px 12px;border:1px solid #C9D8FF;border-radius:4px;background:#EAF0FF"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-5LOwKe4dIDEJ64I58-RDxgtg9AKM-reddit-profile-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-search-scraper" style="color:#0B3D91;text-decoration:none;font-weight:700;font-size:13px">Reddit Search</a></span><br><span style="color:#44546A;font-size:12px">Keyword monitoring</span></span>
<span style="display:inline-block;vertical-align:top;width:140px;margin:4px;padding:8px 12px;border:1px solid #C9D8FF;border-radius:4px;background:#EAF0FF"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-AcNroNEs63pztgCy6-BEG4cWB3Re-reddit-user-posts-comments-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-post-comments-bulk-scraper" style="color:#0B3D91;text-decoration:none;font-weight:700;font-size:13px">Reddit Comments</a></span><br><span style="color:#44546A;font-size:12px">Full threads &amp; replies</span></span>
<span style="display:inline-block;vertical-align:top;width:140px;margin:4px;padding:8px 12px;border:1px solid #C9D8FF;border-radius:4px;background:#EAF0FF"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-9SchRh78ZcQprr5V8-D4wuc5kLga-reddit-user-posts-comments-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/clearpath/reddit-subreddit-posts-scraper" style="color:#0B3D91;text-decoration:none;font-weight:700;font-size:13px">Reddit Subreddits</a></span><br><span style="color:#44546A;font-size:12px">Bulk subreddit feeds</span></span></td></tr>
</table>

#### Copy to your AI assistant

```text
clearpath/bluesky-scraper on Apify returns public Bluesky data as flat rows: type "profile" (handle, did, counts, bio, verification with who verified it and when, labels with their meaning, pinned post, settings) or type "post" (text, url, likes, reposts, replies, quotes, bookmarks, author with follower counts, images, video, link card, quoted post, hashtags, mentions, reply context), each with relation saying how it was reached. Inputs, mixable in one run: profiles (handles, profile links or DIDs), searchPeople (keywords), searchPosts (keywords or Bluesky search syntax, with optional sort latest|top, since/until as dates or periods such as "7 days", language, fromAuthor, mentions, domain, hashtags matching any), postUrls, feedUrls (custom feeds), listUrls (lists and starter packs; members come back as profiles). Post search continues far past the first page (a recorded run saved 10,000 posts for "news" in about 2 minutes). For an account's posts set includePosts=true (postFilter all|noReplies|media|authorThreads|video); for followers or following includeFollowers / includeFollowing=true; for posts an account liked includeLikedPosts=true (adds likedAt); for a post's audience includeLikers (adds likedAt), includeReposters, includeQuotes; for its whole reply thread includeReplies=true (adds threadDepth, isThreadRoot, threadTruncated). These apply to listed, searched and list-member profiles and to top-level posts, are off by default, and every row they return is billed. includeProfileDetails (default true, free) adds lists, starterPacks, feeds, similarAccounts and identity (hosting, past handles, ID creation) to listed, searched and list-member profiles; set it false for faster bulk profile runs. maxItemsPerList caps each list on its own (each keyword, each profile's posts or followers, each post's replies or likers), maxItems caps the whole run; both empty mean everything, so set them or a spending limit. Deleted posts, deactivated accounts and content Bluesky hides from logged-out visitors are not returned; unreadable inputs are named in the run log. Pricing: one Post charge per saved post, $0.99 per 1,000 on the Free plan down to $0.69 on Gold; one Profile charge per saved profile, $1.49 down to $1.09; plus $0.005 per run start per GB of memory (512 MB default, one start); profile details at no extra charge; Apify adds $0.01 per 1,000 rows saved. Every input and output field and current pricing: the Input, Output and Pricing tabs at https://apify.com/clearpath/bluesky-scraper. To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: feature requests, a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### How to scrape Bluesky

Enter any mix of profiles, searches and links, one per line. Each profile and each post becomes one result row.

| What you enter | Example | What you get |
|---|---|---|
| Profiles | `jay.bsky.team`, `@nytimes.com`, `https://bsky.app/profile/bsky.app`, `did:plc:z72i7hdynmk6r22z27h6tvur` | One full profile per entry. A bare name like `alice` is read as `alice.bsky.social` |
| Search people | `journalist`, `climate scientist` | Every account the people search returns for the keyword |
| Search posts | `web scraping`, `"open source"`, `#art`, `from:nytimes.com` | Every matching post, newest first, as far back as the search reaches |
| Post links | `https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l` | The post itself, plus its replies, likers, reposters or quotes when turned on |
| Custom feeds | `https://bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur/feed/whats-hot` | The posts the feed shows, in feed order |
| Lists and starter packs | `https://bsky.app/profile/nytimes.com/lists/3lbl2hyzmfy2u`, `https://bsky.app/starter-pack/nytimes.com/3lbugqemf5427` | Every member as a full profile |

Up to 5,000 entries per run. An entry that cannot be read is named in the run log and skipped; the rest of the run continues.

#### Options

| Option | Default | What it does |
|---|---|---|
| `maxItemsPerList` | empty (everything) | Caps each list on its own: each search keyword, each profile's posts, followers, following and liked posts, each post's replies, likers, reposters and quotes, each feed, list or starter pack |
| `maxItems` | empty (no limit) | Stops the whole run after this many profiles and posts together |
| `sort` | `latest` | `latest` returns newest posts first; `top` starts with the posts Bluesky ranks most relevant and continues with the most relevant older posts |
| `since`, `until` | empty | Date range for post search: `2026-09-01`, a full date and time, or a period back from now such as `7 days` |
| `language` | empty | Posts in one language, for example `en`, `de`, `ja` |
| `fromAuthor`, `mentions` | empty | Posts by one account, or posts that mention one account (brand monitoring) |
| `domain`, `hashtags` | empty | Posts linking to a website, or carrying any of the listed hashtags |
| `includeProfileDetails` | `true` | Adds lists, starter packs, custom feeds, similar accounts and identity history to profiles you list, find by people search, or get from a list or starter pack. No extra charge |
| `includePosts` | `false` | Also returns each profile's posts, reposts and pinned post. `postFilter` picks everything (default), posts without replies, posts with media, posts with video, or the author's own threads |
| `includeFollowers`, `includeFollowing` | `false` | Also returns every follower or followed account of each profile, as full profiles with counts |
| `includeLikedPosts` | `false` | Also returns the posts each profile liked, newest like first, with `likedAt` |
| `includeReplies` | `false` | Also returns the full reply thread under each post, every level deep, with each reply's depth |
| `includeLikers`, `includeReposters`, `includeQuotes` | `false` | Also returns the accounts that liked (with `likedAt`) or reposted each post, or the posts that quote it |

Search filters apply to post search only. Every option that returns more rows is off by default, and each row it returns is charged like any other row.

#### More examples

Posts by one account about a topic in the last 30 days:

```json
{
  "searchPosts": [
    "climate"
  ],
  "fromAuthor": "nytimes.com",
  "since": "30 days"
}
```

Brand monitoring: every post mentioning an account in the last 7 days, in English:

```json
{
  "searchPosts": [
    "*"
  ],
  "mentions": "bsky.app",
  "language": "en",
  "since": "7 days"
}
```

A profile with up to 1,000 of its posts and 1,000 of its followers:

```json
{
  "profiles": [
    "nytimes.com"
  ],
  "includePosts": true,
  "includeFollowers": true,
  "maxItemsPerList": 1000
}
```

One post with its whole reply thread and everyone who liked it:

```json
{
  "postUrls": [
    "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l"
  ],
  "includeReplies": true,
  "includeLikers": true
}
```

Every member of a starter pack, as full profiles:

```json
{
  "listUrls": [
    "https://bsky.app/starter-pack/nytimes.com/3lbugqemf5427"
  ]
}
```

The third example caps each list at 1,000, so it returns at most 1,000 posts and 1,000 followers. Leave `maxItemsPerList` empty for everything, and set a spending limit for the run.

### What data can you extract from Bluesky?

Every row has `type` (`profile` or `post`) and `relation`, which says how it was reached: `input`, `search`, `follower`, `following`, `liker`, `reposter`, `listMember`, `starterPackMember`, `authorPost`, `postUrl`, `feed`, `likedBy`, `quote` or `reply`. `input`, `searchQuery`, `sourceHandle` and `sourcePostUrl` tie each row back to what you entered.

- **Profiles:** handle, permanent account ID, display name, bio, avatar, banner, follower, following and post counts, account creation date, pronouns, website, verification (who verified the account and when, and whether it can verify others), labels with their meaning, pinned post, live status, chat and notification settings with readable labels, the starter pack the account joined through, and the number of lists, feeds and starter packs it created.
- **Profile details** (on by default, for profiles you name, search, or get from a list or starter pack): the account's lists, starter packs and custom feeds (up to 100 of each; `listsCount`, `starterPacksCount` and `feedsCount` give the totals, and a list link returns any list in full), accounts similar to it, and its identity history: where the account is hosted, whether Bluesky hosts it, when its ID was created and every handle it has used.
- **Posts:** text, link, creation and indexing time, languages, likes, reposts, replies, quotes, bookmarks, the author with follower, following and post counts, images and videos with alt text and dimensions, link card, quoted post, hashtags, mentions with handles, links, labels with their meaning, who can reply, reply context, repost and pin markers.

A profile row (nytimes.com, profile details on). `similarAccounts` held 50 entries; two are shown:

```json
{
  "type": "profile",
  "relation": "input",
  "input": "https://bsky.app/profile/nytimes.com",
  "searchQuery": null,
  "sourceHandle": null,
  "sourcePostUrl": null,
  "likedAt": null,
  "did": "did:plc:eclio37ymobqex2ncko63h4r",
  "handle": "nytimes.com",
  "displayName": "The New York Times",
  "description": "We seek the truth and help people understand the world. Not a subscriber? Your first month is now free in our app. https://nytimes.onelink.me/Xpht/zbx4nci9",
  "url": "https://bsky.app/profile/nytimes.com",
  "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:eclio37ymobqex2ncko63h4r/bafkreidvvqj5jymmpaeklwkpq6gi532el447mjy2yultuukypzqm5ohfju",
  "banner": "https://cdn.bsky.app/img/banner/plain/did:plc:eclio37ymobqex2ncko63h4r/bafkreidlzzmt7sy2n6imz5mg7siygb3cy4e526nvbjucczeu5cutqro5ni",
  "followersCount": 1350895,
  "followsCount": 123,
  "postsCount": 44066,
  "createdAt": "2023-06-05T18:50:31.498Z",
  "indexedAt": "2026-08-03T12:35:56.360Z",
  "pronouns": null,
  "website": null,
  "isVerified": true,
  "verification": {
    "status": "valid",
    "statusLabel": "Verified",
    "isTrustedVerifier": true,
    "verifiedBy": [
      {
        "did": "did:plc:z72i7hdynmk6r22z27h6tvur",
        "handle": "bsky.app",
        "displayName": "Bluesky",
        "createdAt": "2025-04-21T10:46:44.369Z",
        "isValid": true,
        "recordUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.graph.verification/3lndptszmee2u"
      }
    ]
  },
  "labels": [],
  "listsCount": 2,
  "feedsCount": 0,
  "starterPacksCount": 1,
  "isLabeler": false,
  "chatAllowIncoming": "none",
  "chatAllowIncomingLabel": "No one",
  "chatAllowGroupInvites": "none",
  "chatAllowGroupInvitesLabel": "No one",
  "activitySubscriptions": "followers",
  "activitySubscriptionsLabel": "Followers",
  "germMessaging": null,
  "pinnedPost": null,
  "joinedViaStarterPack": null,
  "liveStatus": null,
  "identity": {
    "didMethod": "plc",
    "didMethodLabel": "Bluesky's public account directory",
    "pdsHost": "enoki.us-east.host.bsky.network",
    "hostedByBluesky": true,
    "didCreatedAt": "2023-06-05T18:50:31.498Z",
    "handleHistory": [
      {
        "handle": "tempnyt.bsky.social",
        "since": "2023-06-05T18:50:31.498Z"
      },
      {
        "handle": "nytimes.com",
        "since": "2023-06-05T19:24:25.280Z"
      }
    ]
  },
  "lists": [
    {
      "uri": "at://did:plc:eclio37ymobqex2ncko63h4r/app.bsky.graph.list/3lbl2hyzmfy2u",
      "url": "https://bsky.app/profile/nytimes.com/lists/3lbl2hyzmfy2u",
      "name": "NYT on Bluesky",
      "description": "Our reporters, editors and photographers on Bluesky.",
      "purpose": "curatelist",
      "purposeLabel": "Curated list of accounts",
      "memberCount": 246,
      "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:eclio37ymobqex2ncko63h4r/bafkreigj2g54lvb2i4kid75m2i5z3qw33nn7yjm77ywvdx2ho3fp7bwxsi",
      "creatorHandle": "nytimes.com",
      "indexedAt": "2024-12-06T14:53:18.862Z",
      "labels": []
    }
  ],
  "starterPacks": [
    {
      "uri": "at://did:plc:eclio37ymobqex2ncko63h4r/app.bsky.graph.starterpack/3lbugqemf5427",
      "url": "https://bsky.app/starter-pack/nytimes.com/3lbugqemf5427",
      "name": "NYT on Bluesky",
      "description": "Our reporters, editors and photographers on Bluesky.",
      "memberCount": 152,
      "joinedThisWeek": 0,
      "joinedAllTime": 2,
      "createdAt": "2024-11-26T16:16:40.993Z",
      "creatorHandle": "nytimes.com",
      "indexedAt": "2025-06-04T21:13:37.148Z"
    }
  ],
  "feeds": [],
  "similarAccounts": [
    {
      "did": "did:plc:i3fhjvvkbmirhyu4aeihhrnv",
      "handle": "wsj.com",
      "displayName": "The Wall Street Journal",
      "description": "Since 1889 🗞️\n\nSign up for our newsletters and alerts: http://wsj.com/newsletters\nGot a tip? http://wsj.com/tips\nFollow our staff: https://go.bsky.app/2ppWqxF",
      "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:i3fhjvvkbmirhyu4aeihhrnv/bafkreia4sbyxnecbgloskaa5ziul6sry6jj5ruujno67a27z6ssjhferni",
      "url": "https://bsky.app/profile/wsj.com",
      "isVerified": true
    },
    {
      "did": "did:plc:4llrhdclvdlmmynkwsmg5tdc",
      "handle": "atrupar.com",
      "displayName": "Aaron Rupar",
      "description": "Independent journalist, SnapStream brand ambassador, and publisher of the Public Notice newsletter https://www.publicnotice.co/subscribe",
      "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:4llrhdclvdlmmynkwsmg5tdc/bafkreibmhm3h6ar52pogvolisrzjdhwa2myras5vkxzj67twxn2l6pogwu",
      "url": "https://bsky.app/profile/atrupar.com",
      "isVerified": true
    }
  ],
  "scrapedAt": "2026-10-09T07:16:21.341Z"
}
```

A post row from a search for "news":

```json
{
  "type": "post",
  "relation": "search",
  "input": "news",
  "searchQuery": "news",
  "sourceHandle": null,
  "sourcePostUrl": null,
  "uri": "at://did:plc:njdpt3vjbjbifq5fxofeet2x/app.bsky.feed.post/3mxged67zik2t",
  "cid": "bafyreigix4abz6voxlip3uqob5tmmoewd3yn3vkex2mggn4pnpba3mcel4",
  "id": "3mxged67zik2t",
  "url": "https://bsky.app/profile/sightmagazine.bsky.social/post/3mxged67zik2t",
  "text": "Keeping global temperature gain in check is a matter of survival, COP31 president says @sightmagazine.bsky.social #COP31 #MuratKurum #Fiji #Turkey #climatechange \n\nsightmagazine.com.au/news/keeping...",
  "createdAt": "2026-10-09T06:36:42.306Z",
  "indexedAt": "2026-10-09T06:36:46.060Z",
  "sortAt": "2026-10-09T06:36:42.306Z",
  "lang": "en",
  "langs": [
    "en"
  ],
  "likeCount": 0,
  "repostCount": 0,
  "replyCount": 0,
  "quoteCount": 0,
  "bookmarkCount": 0,
  "engagementTotal": 0,
  "authorDid": "did:plc:njdpt3vjbjbifq5fxofeet2x",
  "authorHandle": "sightmagazine.bsky.social",
  "authorDisplayName": "Sight Magazine",
  "authorAvatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:njdpt3vjbjbifq5fxofeet2x/bafkreiemzxsio3itmknmldivdxhk2h64etisxb3i7weowb7iwglngylvgq",
  "authorIsVerified": false,
  "authorCreatedAt": "2024-11-20T03:45:28.071Z",
  "authorLabels": [],
  "authorFollowersCount": 234,
  "authorFollowsCount": 3,
  "authorPostsCount": 10702,
  "isReply": false,
  "replyParentUri": null,
  "replyRootUri": null,
  "replyParentUrl": null,
  "replyRootUrl": null,
  "authorThreadIndex": null,
  "authorThreadCount": null,
  "isRepost": false,
  "repostedBy": null,
  "repostedAt": null,
  "isPinned": false,
  "isQuote": false,
  "quotedPost": null,
  "embeddedRecord": null,
  "hasEmbed": true,
  "hasMedia": false,
  "mediaCount": 0,
  "mediaUrls": [],
  "images": [],
  "videos": [],
  "externalLink": {
    "url": "https://sightmagazine.com.au/news/keeping-global-temperature-gain-in-check-is-a-matter-of-survival-cop31-president-says/",
    "title": "Keeping global temperature gain in check is a matter of survival, COP31 president says - Sight Magazine",
    "description": "Restricting global warming is a matter of survival and too many countries are shirking their responsibility to cut emissions, Murat Kurum said",
    "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:njdpt3vjbjbifq5fxofeet2x/bafkreickbludlx5sixjhwvdfnpugbr45jiihywxgddsmulcaqai6dk3k5m"
  },
  "hashtags": [
    "COP31",
    "MuratKurum",
    "Fiji",
    "Turkey",
    "climatechange"
  ],
  "mentions": [
    {
      "did": "did:plc:njdpt3vjbjbifq5fxofeet2x",
      "handle": "sightmagazine.bsky.social"
    }
  ],
  "links": [
    "https://sightmagazine.com.au/news/keeping-global-temperature-gain-in-check-is-a-matter-of-survival-cop31-president-says/"
  ],
  "labels": [],
  "whoCanReply": null,
  "hiddenReplies": [],
  "likedAt": null,
  "threadDepth": null,
  "isThreadRoot": null,
  "threadTruncated": null,
  "scrapedAt": "2026-10-09T07:19:31.961Z"
}
```

Fields that appear only on some rows, with real values:

| Field | Filled on | Example |
|---|---|---|
| `isRepost`, `repostedBy`, `repostedAt` | Reposts in a profile's posts or a feed | `"repostedBy": {"did": "did:plc:z72i7hdynmk6r22z27h6tvur", "handle": "bsky.app", "displayName": "Bluesky", "repostUri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.repost/3mxfsi72lu72j", "repostCid": "bafyreicf3gg36ipogxrckj2irx2ncmokgnnstba334ql33szs3anl2y34q"}` |
| `isPinned` | The pinned post in a profile's posts | `true` |
| `threadDepth`, `isThreadRoot`, `threadTruncated` | Posts with Replies on, and their replies | `"threadDepth": 2` on a reply two levels down; `threadTruncated` is `true` when the run's limits leave replies out |
| `likedAt` | Liked posts, and likers (when they liked the post) | `"likedAt": "2026-10-06T19:08:39.867Z"` |
| `authorThreadIndex`, `authorThreadCount` | Profile and feed posts that belong to their author's own thread | `"authorThreadIndex": 1, "authorThreadCount": 4` |
| `hiddenReplies` | Posts whose author hid replies | `[{"uri": "at://did:plc:osg2vzhifd2tjfsvfwua7scy/app.bsky.feed.post/3mx5jquevnk2n", "url": "https://bsky.app/profile/did:plc:osg2vzhifd2tjfsvfwua7scy/post/3mx5jquevnk2n"}]` |
| `quotedPost` | Quote posts | the quoted post's text, author, counts, media, hashtags and labels |
| `whoCanReply` | Posts whose author limits replies | `[{"rule": "mentionRule", "label": "Mentioned users"}, {"rule": "followingRule", "label": "People they follow"}, {"rule": "followerRule", "label": "Their followers"}]` |
| `embeddedRecord` | Posts that embed a feed, list or starter pack | `"kind": "starterPack"`, with its name, link and counts |

Values the source does not have are `null`, never invented: some accounts hosted outside Bluesky have no creation date, and a reply whose earlier post was deleted has no known depth. JSON keeps every nested field; CSV and Excel flatten nested objects into columns.

### How much does it cost to scrape Bluesky?

You pay per row saved, plus a small fee when the run starts. Profile details add no charge.

| Event | When charged | Price |
|---|---|---|
| Post | Once for each post saved (post links, search results, profile posts, feed posts, liked posts, quotes and replies) | $0.99 per 1,000 |
| Profile | Once for each profile saved (profiles you list, people search results, followers, following, likers, reposters, list and starter pack members) | $1.49 per 1,000 |
| Actor start | Once per run, per GB of memory (default 512 MB: one start) | $0.005 |

Discounts by Apify plan, per 1,000: posts $0.99 on Free, $0.89 on Bronze, $0.79 on Silver, $0.69 on Gold and above; profiles $1.49, $1.39, $1.29 and $1.09. Apify also charges $0.01 per 1,000 rows saved (dataset item fee).

Typical runs on the Free plan: 100 search posts, about $0.11 with the start fee; 10,000 search posts, about $10.01; one profile with 1,000 followers, about $1.51. Set `maxItems`, `maxItemsPerList` or a spending limit to cap any run. A run that reaches its spending limit stops and keeps every row it saved.

### FAQ

**Do I need a Bluesky account, app password or developer key?**
No. Enter profiles, keywords or links and run. Nothing to log in to, no cookie, no key.

**Can I search Bluesky posts without an account?**
Yes. Bluesky's own website asks you to sign in to search; this actor searches without one. Filter by date, language, author, mentioned account, linked website or hashtags, and use Bluesky's search syntax such as `from:nytimes.com` or `#art`.

**How many posts can one search return?**
Every match the search reaches, newest first, far past the first page. A recorded run saved 10,000 unique posts for "news" in about 2 minutes. Searching `*` with only filters (for example `mentions`) works too; for one account's full post history, use Profiles with Profile posts.

**Can I export all followers or following of an account?**
Yes, every one the source lists, with full profiles and counts. There is no 10,000 cap. A recorded run saved 12,000 followers of nytimes.com in about 2 minutes. The default one-hour run limit covers roughly 300,000 followers at that rate; the run stops just before its limit and keeps every row, so for larger accounts set a per-list limit or raise the run timeout.

**Can I get who liked, reposted or quoted a post, and the full reply thread?**
Yes. Turn on Likers, Reposters, Quote posts or Replies. Replies cover the whole thread, every level deep, with each reply's depth and parent. A recorded run returned 6,647 replies under a single post.

**Can I see which posts an account liked?**
Yes, with Liked posts on. Each liked post comes with `likedAt`.

**How do I track follower growth or brand mentions over time?**
Schedule the actor (daily or hourly) with relative dates such as `since: "1 day"`. Every run adds a dated snapshot of counts or new mentions to its own dataset.

**Is this the firehose?**
No. It collects on demand: each run fetches what you ask for. Schedule it for monitoring.

**Why are some accounts or posts missing?**
Deleted posts, suspended or deactivated accounts and content Bluesky does not show to logged-out visitors are not returned. Names that cannot be found are listed in the run log with suggestions.

**How do I use it from my own code or an AI agent?**
Run it from the Apify Console, on a schedule, from n8n, Make or Zapier, with the Apify client for Python or JavaScript, or through Apify's MCP server, then read the dataset when the run finishes.

### More Clearpath scrapers for Reddit

- [Reddit Search Scraper](https://apify.com/clearpath/reddit-search-scraper)
- [Reddit Subreddit Posts Scraper](https://apify.com/clearpath/reddit-subreddit-posts-scraper)
- [Reddit Post Comments Scraper](https://apify.com/clearpath/reddit-post-comments-bulk-scraper)
- [Reddit Profile Scraper](https://apify.com/clearpath/reddit-profile-scraper)
- [Reddit User Posts & Comments Scraper](https://apify.com/clearpath/reddit-user-content-scraper)
- [Reddit MCP Server](https://apify.com/clearpath/reddit-mcp)

Also from the same studio (name, then `account/slug` for the URL `https://apify.com/account/slug`):

- Reddit Answers API (`clearpath/reddit-answers-api`)
- Reddit to LLM (`clearpath/reddit-to-llm-api`)

Full directory: [Clearpath on Apify](https://apify.com/clearpath)

### Support

Found a bug or need a field? Open an issue in the Issues tab, or email max@mapa.slmail.me.

This actor is independent and not affiliated with Bluesky. It collects data Bluesky makes publicly available; you are responsible for how you use it.

# Actor input Schema

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

Bluesky handles, @handles, profile links or account IDs, one per line. Examples: <code>jay.bsky.team</code>, <code>@nytimes.com</code>, <code>https://bsky.app/profile/bsky.app</code>, <code>did:plc:z72i7hdynmk6r22z27h6tvur</code>. A bare name like <code>alice</code> is read as <code>alice.bsky.social</code>.

## `searchPeople` (type: `array`):

Find accounts by name, handle or bio keyword, for example <code>journalist</code> or <code>climate scientist</code>. Each keyword returns every matching account, up to the per-list limit below.

## `searchPosts` (type: `array`):

Find posts by keyword or phrase, for example <code>web scraping</code> or <code>"open source"</code>. Bluesky search syntax works too: <code>from:nytimes.com</code>, <code>#art</code>, <code>lang:de</code>. Each keyword returns every matching post, newest first, up to the per-list limit below. Narrow results with the filters in the next section.

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

Links to individual posts, for example <code>https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l</code>. Turn on replies, likers, reposters or quotes below to get each post's conversation and audience.

## `feedUrls` (type: `array`):

Links to Bluesky custom feeds, for example <code>https://bsky.app/profile/did:plc:z72i7hdynmk6r22z27h6tvur/feed/whats-hot</code>. Returns the posts the feed shows, in feed order.

## `listUrls` (type: `array`):

Links to Bluesky lists or starter packs, for example <code>https://bsky.app/profile/nytimes.com/lists/3lbl2hyzmfy2u</code>, <code>https://bsky.app/starter-pack/nytimes.com/3lbugqemf5427</code> or a <code>go.bsky.app</code> short link. Returns every member as a profile row.

## `maxItemsPerList` (type: `integer`):

Caps each list on its own: each search keyword, each profile's posts, followers, following and liked posts, each post's replies, likers, reposters and quotes, and each feed, list or starter pack. Leave empty to get everything; your spending limit for the run also stops it.

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

Stops the whole run after this many profiles and posts together. Leave empty for no overall limit.

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

<b>Latest</b> (used when empty) returns newest posts first and goes back as far as the search reaches. <b>Top</b> starts with the posts Bluesky ranks most relevant.

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

Only posts from this date or later, for example <code>2026-09-01</code>, or a period back from now such as <code>7 days</code> for scheduled monitoring.

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

Only posts before this date, for example <code>2026-10-01</code>, or a period back from now such as <code>1 day</code>.

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

Only posts in this language, as a two-letter code such as <code>en</code>, <code>de</code>, <code>ja</code> or <code>pt</code>.

## `fromAuthor` (type: `string`):

Handle or profile link. Returns only this account's posts that match the search.

## `mentions` (type: `string`):

Handle or profile link. Returns only posts that mention this account, useful for brand monitoring.

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

Only posts that link to this website, for example <code>nytimes.com</code>.

## `hashtags` (type: `array`):

Only posts carrying any of these hashtags, written without <code>#</code>.

## `includeProfileDetails` (type: `boolean`):

Adds the account's lists, starter packs, custom feeds, similar accounts and identity history (where the account is hosted, past handles, when it was created). On by default.

## `includePosts` (type: `boolean`):

Also return each profile's posts, reposts and pinned post, newest first. Each post is a separate result.

## `postFilter` (type: `string`):

Which posts to return when Profile posts is on. <b>Everything</b> (used when empty) includes replies and reposts.

## `includeFollowers` (type: `boolean`):

Also return every follower of each profile, as full profiles with follower counts. Each follower is a separate result; large accounts have millions, so set a per-list limit.

## `includeFollowing` (type: `boolean`):

Also return every account each profile follows, as full profiles. Each one is a separate result.

## `includeLikedPosts` (type: `boolean`):

Also return the posts each profile has liked, newest like first, with the time of the like. Each post is a separate result.

## `includeReplies` (type: `boolean`):

Also return the full reply thread under each post, every level deep, with each reply's depth and parent.

## `includeLikers` (type: `boolean`):

Also return every account that liked each post, as full profiles with when they liked it.

## `includeReposters` (type: `boolean`):

Also return every account that reposted each post, as full profiles.

## `includeQuotes` (type: `boolean`):

Also return every post that quotes each post.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "profiles": [
    "jay.bsky.team",
    "nytimes.com"
  ],
  "maxItemsPerList": 100,
  "includeProfileDetails": true,
  "includePosts": false,
  "includeFollowers": false,
  "includeFollowing": false,
  "includeLikedPosts": false,
  "includeReplies": false,
  "includeLikers": false,
  "includeReposters": false,
  "includeQuotes": false
}
```

# Actor output Schema

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

Every profile and post this run returned.

# 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 = {
    "profiles": [
        "jay.bsky.team",
        "nytimes.com"
    ],
    "maxItemsPerList": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/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 = {
    "profiles": [
        "jay.bsky.team",
        "nytimes.com",
    ],
    "maxItemsPerList": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/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 '{
  "profiles": [
    "jay.bsky.team",
    "nytimes.com"
  ],
  "maxItemsPerList": 100
}' |
apify call clearpath/bluesky-scraper --silent --output-dataset

```

## MCP server setup

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