Scrape Bluesky Posts: Search, Author Feed and Threads
Pricing
from $0.003 / record scraped
Scrape Bluesky Posts: Search, Author Feed and Threads
Extract posts from Bluesky by keyword search, author feed, or full thread. Engagement metrics, images, embeds. Uses official AT Protocol API.
Pricing
from $0.003 / record scraped
Rating
0.0
(0)
Developer
Daniel Ainsworth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Scrape Bluesky Posts — Search, Author Feed & Threads
Extract posts from Bluesky Social with full engagement metrics, images, and author data. Three scraping modes in one actor: keyword search, author feed, and full thread extraction. Built on the official AT Protocol API — no browser automation, no unofficial tricks, no fragile DOM scraping.
Works without authentication for author feeds and threads. Keyword search requires a free Bluesky App Password.
What data you get
Each post returns a clean JSON record:
{"uri": "at://did:plc:abc123/app.bsky.feed.post/3lhxxxxxxxxx","cid": "bafyreiabc123","url": "https://bsky.app/profile/user.bsky.social/post/3lhxxxxxxxxx","text": "Interesting thread on B2B SaaS pricing — companies that charge per seat are leaving money on the table 🧵","language": "en","authorDid": "did:plc:abc123","authorHandle": "user.bsky.social","authorDisplayName": "User Name","authorAvatar": "https://cdn.bsky.app/img/avatar/...","createdAt": "2025-11-15T10:30:00.000Z","indexedAt": "2025-11-15T10:30:12.000Z","likeCount": 142,"repostCount": 28,"replyCount": 19,"quoteCount": 6,"images": [{"thumb": "https://cdn.bsky.app/img/feed_thumbnail/...","fullsize": "https://cdn.bsky.app/img/feed_fullsize/...","alt": "Chart showing revenue vs seat count"}],"externalEmbed": {"uri": "https://example.com/article","title": "The Hidden Cost of Per-Seat Pricing","description": "Why usage-based pricing outperforms seat pricing in B2B SaaS","thumb": "https://..."},"quotedPostUri": null,"labels": [],"isReply": false,"replyToUri": null,"rootPostUri": null,"scrapedAt": "2026-01-15T14:22:00.000Z"}
Scraping modes
1. Search posts (searchPosts)
Search Bluesky for any keyword, hashtag, or phrase. Returns posts in order of newest first or most-engaged first.
Requires a free Bluesky App Password — Bluesky's search API requires authentication. Your main password is never used.
Input:
{"mode": "searchPosts","searchQuery": "#buildinpublic","sort": "top","since": "2025-01-01","until": "2025-12-31","lang": "en","maxResults": 500,"blueskyHandle": "yourname.bsky.social","blueskyAppPassword": "xxxx-xxxx-xxxx-xxxx"}
Supported query syntax:
- Keywords:
SaaS pricing - Hashtags:
#buildinpublic - From a specific account:
from:user.bsky.social topic - Phrase:
"exact phrase here"
2. Author feed (authorFeed)
Get all posts from one or more Bluesky accounts. Useful for monitoring competitors, tracking thought leaders, or auditing your own content. No authentication required.
Input:
{"mode": "authorFeed","handles": ["paulgraham.bsky.social", "marc.bsky.social"],"maxResults": 200,"includeReplies": false}
Set includeReplies: true to also include reply posts from the author (off by default to return only original posts).
3. Full thread (thread)
Fetch a complete thread — root post plus all replies — from a post URL. Useful for extracting conversations, support threads, or discussion chains.
No authentication required.
Input:
{"mode": "thread","threadUri": "https://bsky.app/profile/user.bsky.social/post/3lhxxxxxxxxx"}
Accepts either a bsky.app URL or an at:// URI directly.
Input parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | ✅ | searchPosts, authorFeed, or thread |
searchQuery | string | searchPosts | Keyword, hashtag, or phrase to search |
handles | string[] | authorFeed | Bluesky handles (e.g. ["user.bsky.social"]) |
threadUri | string | thread | Post URL or at:// URI |
maxResults | number | — | Max posts to return (default: 100, max: 10,000) |
sort | string | — | latest or top (searchPosts only, default: latest) |
since | string | — | Start date, ISO format (searchPosts only) |
until | string | — | End date, ISO format (searchPosts only) |
lang | string | — | Language filter, e.g. en (searchPosts only) |
includeReplies | boolean | — | Include reply posts (authorFeed only, default: false) |
blueskyHandle | string | searchPosts | Your Bluesky handle for auth |
blueskyAppPassword | string | searchPosts | App Password (not your main password) |
Output fields
| Field | Type | Description |
|---|---|---|
uri | string | AT Protocol URI of the post |
cid | string | Content identifier (cryptographic hash) |
url | string | Direct link to the post on bsky.app |
text | string | Full post text content |
language | string|null | Language code of the post (en, de, etc.) |
authorHandle | string | Bluesky handle of the author |
authorDisplayName | string|null | Author's display name |
authorAvatar | string|null | URL to the author's profile picture |
createdAt | string | When the post was created (ISO 8601) |
likeCount | number | Number of likes |
repostCount | number | Number of reposts |
replyCount | number | Number of replies |
quoteCount | number | Number of quote posts |
images | array | Attached images with thumb, fullsize, alt URLs |
externalEmbed | object|null | Linked article preview (uri, title, description, thumb) |
quotedPostUri | string|null | AT URI of any quoted post |
labels | string[] | Content labels applied by moderators |
isReply | boolean | Whether this post is a reply |
replyToUri | string|null | AT URI of the parent post (if reply) |
rootPostUri | string|null | AT URI of the thread root (if reply) |
scrapedAt | string | Timestamp when this record was scraped |
Use cases
Brand monitoring and social listening
Search for your brand name, product, or competitors across Bluesky. Track sentiment shifts over time by running the actor on a schedule and comparing engagement metrics. Bluesky's growing B2B/tech audience makes it increasingly valuable for enterprise brand monitoring alongside Twitter/X.
Competitive intelligence
Pull the last 6 months of posts from competitor accounts using authorFeed mode. Analyse what content generates the most engagement (likes + reposts + quotes) to identify their messaging strategy and topic focus.
Influencer research and outreach
Before reaching out to a Bluesky account for a partnership, run authorFeed on their handle to audit posting frequency, average engagement, and content themes. Export to CSV for your sales or marketing team.
Lead generation and intent signals
Search for posts where users describe a problem you solve — #buildinpublic struggling with, "looking for a tool that", "anyone recommend" + your category. These are high-intent signals from people actively seeking solutions.
Academic research and trend analysis
Track public discourse on any topic with date-range filtering. Extract posts from a specific period, export as JSON or CSV, and analyse in Python or Excel. The AT Protocol's open design means data availability is not subject to arbitrary API access changes.
Pricing
This actor uses Pay Per Event (PPE) pricing — you only pay for what you scrape:
| Event | Price |
|---|---|
| Actor startup | $0.25 per run |
| Post scraped | $0.003 per post ($3.00 per 1,000) |
Example costs:
- 100 posts: $0.25 + $0.30 = $0.55
- 1,000 posts: $0.25 + $3.00 = $3.25
- 10,000 posts: $0.25 + $30.00 = $30.25
No monthly subscription. No minimum usage. Only pay when you run the actor.
Authentication setup
For searchPosts mode, you need a Bluesky App Password (not your main account password):
- Log in to bsky.app
- Go to Settings → App Passwords
- Click Add App Password, give it a name (e.g. "Apify Scraper")
- Copy the generated password and paste it into the
blueskyAppPasswordfield
App Passwords are revocable and can't access your DMs or account settings. Safe to use in Apify actors.
Technical notes
- Built on the AT Protocol public API — no unofficial scraping
public.api.bsky.appendpoints have generous rate limits; the actor adds a 300ms delay between paginated requests to stay well within them- Failed requests are automatically retried up to 3 times with exponential backoff
- Rate limit responses (HTTP 429) are handled with automatic back-off using the
retry-afterheader - Thread mode recursively flattens the full reply tree to a depth of 6 levels
Limitations
searchPostsdate range filtering depends on Bluesky's search index — very old posts (6+ months) may not be returned for all queries- Thread depth is limited to 6 levels of replies; deeply nested threads are truncated at that depth
- Bluesky does not expose follower counts in post views — if you need author follower counts, run
authorFeedmode and cross-reference with the Bluesky user profile API separately