Scrape Bluesky Posts: Search, Author Feed and Threads avatar

Scrape Bluesky Posts: Search, Author Feed and Threads

Pricing

from $0.003 / record scraped

Go to Apify Store
Scrape Bluesky Posts: Search, Author Feed and Threads

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

Daniel Ainsworth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

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

ParameterTypeRequiredDescription
modestringsearchPosts, authorFeed, or thread
searchQuerystringsearchPostsKeyword, hashtag, or phrase to search
handlesstring[]authorFeedBluesky handles (e.g. ["user.bsky.social"])
threadUristringthreadPost URL or at:// URI
maxResultsnumberMax posts to return (default: 100, max: 10,000)
sortstringlatest or top (searchPosts only, default: latest)
sincestringStart date, ISO format (searchPosts only)
untilstringEnd date, ISO format (searchPosts only)
langstringLanguage filter, e.g. en (searchPosts only)
includeRepliesbooleanInclude reply posts (authorFeed only, default: false)
blueskyHandlestringsearchPostsYour Bluesky handle for auth
blueskyAppPasswordstringsearchPostsApp Password (not your main password)

Output fields

FieldTypeDescription
uristringAT Protocol URI of the post
cidstringContent identifier (cryptographic hash)
urlstringDirect link to the post on bsky.app
textstringFull post text content
languagestring|nullLanguage code of the post (en, de, etc.)
authorHandlestringBluesky handle of the author
authorDisplayNamestring|nullAuthor's display name
authorAvatarstring|nullURL to the author's profile picture
createdAtstringWhen the post was created (ISO 8601)
likeCountnumberNumber of likes
repostCountnumberNumber of reposts
replyCountnumberNumber of replies
quoteCountnumberNumber of quote posts
imagesarrayAttached images with thumb, fullsize, alt URLs
externalEmbedobject|nullLinked article preview (uri, title, description, thumb)
quotedPostUristring|nullAT URI of any quoted post
labelsstring[]Content labels applied by moderators
isReplybooleanWhether this post is a reply
replyToUristring|nullAT URI of the parent post (if reply)
rootPostUristring|nullAT URI of the thread root (if reply)
scrapedAtstringTimestamp 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:

EventPrice
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):

  1. Log in to bsky.app
  2. Go to Settings → App Passwords
  3. Click Add App Password, give it a name (e.g. "Apify Scraper")
  4. Copy the generated password and paste it into the blueskyAppPassword field

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.app endpoints 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-after header
  • Thread mode recursively flattens the full reply tree to a depth of 6 levels

Limitations

  • searchPosts date 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 authorFeed mode and cross-reference with the Bluesky user profile API separately