Bluesky Scraper & API: Export Posts, Profiles & Search
Pricing
from $0.59 / 1,000 posts
Bluesky Scraper & API: Export Posts, Profiles & Search
Scrape Bluesky posts without login: search by keyword, hashtag, date, language, author, mention or domain, every post of any profile, custom feeds and lists. Likes, reposts, replies, quotes, author followers, media and links, only new posts since the last run, and a profiles table with contacts.
Pricing
from $0.59 / 1,000 posts
Rating
0.0
(0)
Developer
Superior Actors
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Bluesky Scraper & API: Export Posts, Profiles & Search
Scrape Bluesky posts to CSV, Excel or JSON: search by keyword or hashtag (latest or top, date range, language, author, mentions, linked domain), every post of any profile down to the first one, custom feeds (Discover and any other) and lists, or single posts by link. Each row has the text, likes, reposts, replies, quotes and saves, the author's follower count and engagement rate, the posting date, images, video, link card and quoted post, hashtags, mentions and links. Get only new posts since the last run for brand and keyword monitoring, and a free profiles table: followers, bio contacts, average likes and reposts, posts per week, top post.
{ "searchQueries": ["artificial intelligence"], "usernames": ["nytimes.com"], "maxPostsPerInput": 0 }
No Bluesky account, app password or login needed. Use it as a Bluesky search API and Bluesky posts API: one call returns clean JSON, 100 posts per request. 0 = all: every search result within your dates (up to 100,000 per query), every post of a profile (all 6,408 posts and threads of @pfrazee.com in 107 requests).
What you get
One row per post. Real example, October 2026 (the newest post of each input):
| authorHandle | mediaType | likeCount | repostCount | replyCount | quoteCount | bookmarkCount | authorFollowerCount | engagementRate | createdAt |
|---|---|---|---|---|---|---|---|---|---|
| bsky.app | quote | 6,578 | 1,307 | 205 | 138 | 134 | 35,292,873 | 0.023 | 2026-10-17 |
| theonion.com | image | 1,650 | 135 | 23 | 10 | 10 | 1,358,649 | 0.134 | 2026-10-17 |
| nytimes.com | video | 246 | 40 | 5 | 8 | 29 | 1,352,179 | 0.022 | 2026-10-18 |
| pfrazee.com | image | 76 | 12 | 14 | 6 | 23 | 309,376 | 0.035 | 2026-10-17 |
| Field | Description |
|---|---|
postUrl, text, createdAt, indexedAt | Link to the post on bsky.app, full text, posting time and when Bluesky indexed it (UTC) |
likeCount, repostCount, replyCount, quoteCount, bookmarkCount | Likes, reposts, replies, quotes and saves |
authorFollowerCount, engagementRate | The author's followers and (likes + reposts + replies + quotes) / followers, in % (Bluesky has no view counts) |
authorHandle, authorName, authorUrl, authorVerified, authorAvatar, authorDid | The author; authorVerified = Bluesky's blue check |
mediaType, imageUrl, images, imageCount | text, image, video, link or quote; every image in full size with its alt text and size |
videoUrl, videoThumbnail | The video stream (HLS .m3u8) and its cover |
externalUrl, externalTitle, externalDescription | The link card of the post |
quotedPostUrl, quotedAuthor, quotedText | The post this one quotes |
hashtags, mentions, links, languages | #hashtags, mentioned handles, links in the text (full addresses), the post's languages |
postType, isReply, replyToPostUrl, threadRootUrl | post, reply or repost; for replies the post answered and the first post of the thread |
isPinned, repostedBy, repostedAt | For profiles: the pinned post; for reposts the account and when it reposted (the row is the original post) |
labels, uri, cid | Moderation labels and the AT Protocol identifiers of the post |
input, inputType, profile, scrapedAt | Which query, profile, feed or link the row came from |
Profiles table (run's Output tab → Profiles (CSV), also as JSON: key-value store records profiles.csv and PROFILES), one row per profile you entered, free. Real example, October 2026, over the 20 latest posts:
| handle | followersCount | postsCount | website | averageLikes | medianLikes | averageReposts | postsPerWeek | |
|---|---|---|---|---|---|---|---|---|
| bsky.app | 35,292,873 | 880 | support@bsky.app | 8,536.9 | 2,798 | 1,237.5 | 2.41 | |
| theonion.com | 1,358,649 | 8,802 | theonion.com/newsletters | 807.9 | 733.5 | 78 | 114.12 | |
| nytimes.com | 1,352,179 | 44,457 | nytimes.onelink.me | 77.2 | 54 | 21.8 | 394.47 |
| Column | Description |
|---|---|
handle, displayName, did, profileUrl, description, avatar, banner, createdAt, isVerified | The account and its bio |
followersCount, followsCount, postsCount | Followers, following and posts, exact |
feedsCount, listsCount, starterPacksCount, isLabeler, pinnedPostUrl | Custom feeds, lists and starter packs the account made |
email, emails, website, handleDomain, linkInBio, instagram, youtube, x, facebook, linkedin, telegram, twitch | Contacts written in the bio; handleDomain = the custom domain of the handle (nytimes.com) |
postsScraped, repliesScraped, repostsScraped, newestPostAt, oldestPostAt, postsPerWeek, averageLikes, medianLikes, averageReposts, averageReplies, averageQuotes, averageEngagementRate, topPostUrl, topPostLikes, topPostReposts | Over the account's own posts of the run (your limit and dates) |
error | Why a profile failed (not found) |
How it works
- Add search queries, profiles, feed or list links and/or post links (any mix)
- Set Max posts per query, profile or feed (
0= all), the order and optional filters - Run, then download the dataset as CSV, Excel, JSON or HTML
| Input | What it does |
|---|---|
| Search posts | Words, a #hashtag or a "quoted phrase"; Bluesky operators like from:, mentions:, domain:, lang: work too |
| Profiles | name.bsky.social, a custom-domain handle (nytimes.com), @handle, a bsky.app link or a DID |
| Custom feeds and lists | bsky.app/profile/<handle>/feed/<name> (Discover, What's Hot, any custom feed) or .../lists/<id> |
| Post links | Single posts with all stats |
| Max posts | Per query, profile and feed, default 100, 0 = all |
| Search order | Latest = every match, newest first. Top = most popular: 100 per query, or 100 for each day with Posted after |
| Language, From this account, Mentioning this account, Linking to this website, With these hashtags | Search filters, applied by Bluesky itself |
| Replies / Reposts of the profiles | Add the replies a profile wrote to others and the posts it reposted |
| Posted after / Posted before | A date (2026-01-01) or a period (24 hours, 7 days, 6 months) |
| Minimum likes | Only posts with at least this many likes |
| Author follower counts | On by default: followers and engagement rate for search and feed results |
| Only new posts since the previous run | For schedules: only what was posted since the last check |
A missing profile, feed or post is reported in the run status and not charged. Posts left out by a filter are not charged. Posts of accounts that asked apps not to show their content to logged-out people (Bluesky's !no-unauthenticated setting) are left out and not charged; the run status says how many.
Why this Actor
| 🔍 Search with no 100-post wall | Without login Bluesky gives one page of search results; this Actor walks back in time and returns every match, newest first |
| 📈 Top posts per day | Top order with a date range gives the 100 most popular posts of every day: trend and campaign reports in one run |
| 📜 Every post of a profile | Down to the account's first post, with its own threads, and optionally replies and reposts |
| 👥 Author reach in every row | Follower count and engagement rate of the author, also for search and feed results |
| 🔔 Brand and keyword alerts | Schedule it hourly: each run returns only new mentions, a run with nothing new costs only the start |
| 📇 Profiles table, free | Followers, contacts from the bio, average and median likes, posts per week, top post |
| 💰 $0.91 per 1,000 posts | Search filters, follower counts, the profiles table and monitoring included, no add-on fees |
Monitor brand mentions and keywords: only new posts
- Add your brand, product or competitor names as search queries (or use Mentioning this account), and the profiles you follow
- Turn on Only new posts since the previous run, save as a task and add a schedule, e.g. every hour
- First run returns the latest posts and remembers the newest one per query, profile and feed. Every later run returns only posts published since then
The newest post seen is kept in your account (key-value store bluesky-scraper-state) and is shared by all your runs and tasks with the same query and filters. Connect Google Sheets, Slack or email with an integration to be notified.
Pricing
Pay per result, no subscription needed. Apify Scale and Business plans pay less:
| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Post in the results (post, reply or repost) | $0.00091 | $0.00077 | $0.00059 |
| Task | Cost |
|---|---|
| All 6,408 posts and threads of @pfrazee.com | ~$5.83 |
| Latest 20 posts of 100 accounts (2,000 posts) | ~$1.82 |
| 10,000 posts for a keyword | ~$9.10 |
| Hourly brand-mention alert for a month | ~$0.72 + $0.00091 per new post |
Profiles, feeds and posts that are not found, posts left out by filters and the profiles table are not charged.
Ready-made tasks
Open it, change the query, and run:
| Task | What you get |
|---|---|
| Search Bluesky Posts by Keyword and Date | Every post with a keyword in a date range, with likes and the author's followers |
FAQ
Can it search more than 100 posts? Yes. Without login Bluesky returns only the first page of a search; the Actor asks again for posts older than the last one and goes on until your limit, your Posted after date or the end of the results.
Does it get all posts of a profile? Yes, every post Bluesky lists on the profile, newest first, down to the account's first one, including its own threads. Turn on Replies of the profiles for its replies to others and Reposts of the profiles for reposts.
Why are some posts missing? Some accounts turn on Bluesky's setting that asks apps not to show their posts to logged-out people. The Actor respects it and leaves those posts out, free; the run status shows how many.
Do I need a Bluesky account or an app password? No. The Actor reads the public Bluesky API, the same data the bsky.app website shows to any visitor.
Are there view counts? No: Bluesky does not count or show views. The engagement rate uses the author's followers instead.
Can I download the videos? videoUrl is Bluesky's HLS stream (playlist.m3u8); tools like ffmpeg or yt-dlp save it as MP4. Images come in full size.
Where do the emails come from? From what the account wrote in its bio. The Actor does not guess emails.
Use with the API and AI agents
Run it via the Apify API from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the Apify MCP server: "What did people on Bluesky say about our launch this week, and which posts got the most reposts?"
Other Bluesky tools
| Tool | What it does |
|---|---|
| Threads Scraper | All posts, views and profiles of Threads accounts |
| TikTok Profile Scraper | All videos and stats of TikTok profiles |
| Google Sheets Import & Export | Send the posts to a Google Sheet |
Is it legal?
The Actor collects only public posts, profiles and stats that Bluesky shows to any visitor, without logging in, and leaves out accounts that asked not to be shown to logged-out people. Posts are their authors' content: respect copyright when you reuse texts and images, and use personal data such as handles and emails in line with GDPR and other privacy laws.