Bluesky Scraper 🦋 avatar

Bluesky Scraper 🦋

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Bluesky Scraper 🦋

Bluesky Scraper 🦋

Scrape Bluesky posts and DMs without the hassle. This Actor extracts posts, replies, and direct messages from Bluesky, fast, reliable.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

No-Code Venture

No-Code Venture

Maintained by Community

Actor stats

1

Bookmarked

24

Total users

4

Monthly active users

2 months ago

Last modified

Share

Scrape Bluesky posts and DMs without the hassle. Scrapes posts, replies, and direct messages from Bluesky — fast, reliable, and no browser automation needed.

✨ Features

  • 🔍 Search Mode – Search for posts by keyword across all of Bluesky
  • 👤 User Feed Mode – Scrape posts from any public Bluesky profile
  • 💬 Reply Threads – Extract full reply threads with configurable depth
  • 📨 Direct Messages – Scrape your private DM conversations (requires auth)
  • 🖼️ Rich Content – Extracts text, images, videos, external links, and quote posts
  • ⚡ Fast & Lightweight – Uses the AT Protocol API directly (no browser needed)
  • 🔐 Authenticated – Requires login with your credentials (app password)

🚀 Getting Started

📖 Three Modes: Search, User Feed, or Messages

ModeWhen to UseRequired Fields
SearchFind posts by keyword across BlueskyscrapeMode: posts, searchQuery, auth
User FeedScrape posts from a specific userscrapeMode: posts, handle, auth
MessagesScrape your direct messagesscrapeMode: messages, auth

⚠️ Note: All modes require authentication.


📝 Posts Mode

🔍 Search for Posts

Search for posts by keyword across all of Bluesky.

{
"scrapeMode": "posts",
"searchQuery": "artificial intelligence",
"searchSort": "top",
"postCount": 20
}

Search Sort Options:

  • top – Most relevant/popular results (default)
  • latest – Most recent posts first

👤 Scrape User Feed

Scrape posts from a specific Bluesky user's profile.

{
"scrapeMode": "posts",
"handle": "apify.com",
"feedFilter": "posts_and_author_threads",
"postCount": 25
}

Feed Filter Options:

FilterDescription
posts_and_author_threadsPosts + conversation threads (default)
posts_no_repliesOnly original posts, no replies
posts_with_repliesPosts including replies to others
posts_with_mediaOnly posts with images/videos

💬 Including Reply Threads

Enable includeReplies to fetch the full reply thread for each post:

{
"scrapeMode": "posts",
"handle": "jay.bsky.team",
"postCount": 10,
"includeReplies": true,
"repliesDepth": 3
}

📨 Messages Mode (DMs)

Scrape your direct message conversations. Requires authentication.

{
"scrapeMode": "messages",
"conversationCount": 10,
"messagesPerConversation": 50,
"unreadOnly": false,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

Message Options:

ParameterDescriptionDefault
conversationCountNumber of conversations to fetch (0 = all)10
messagesPerConversationMessages per conversation (0 = all)50
unreadOnlyOnly fetch conversations with unread messagesfalse

📋 JSON Examples for All Use Cases

1. Search Posts - Basic

Find posts about a topic (authentication required):

{
"scrapeMode": "posts",
"searchQuery": "web scraping",
"postCount": 10,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

2. Search Posts - Latest

Get the latest posts:

{
"scrapeMode": "posts",
"searchQuery": "breaking news",
"searchSort": "latest",
"postCount": 50,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

3. Search Posts - With Reply Threads

Search and get all reply threads:

{
"scrapeMode": "posts",
"searchQuery": "controversial topic",
"searchSort": "top",
"postCount": 20,
"includeReplies": true,
"repliesDepth": 5,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

4. User Feed - All Post Types

Get all posts from a user (posts + threads):

{
"scrapeMode": "posts",
"handle": "apify.com",
"feedFilter": "posts_and_author_threads",
"postCount": 100
}

5. User Feed - Original Posts Only

Get only original posts (no replies to others):

{
"scrapeMode": "posts",
"handle": "jay.bsky.team",
"feedFilter": "posts_no_replies",
"postCount": 50
}

6. User Feed - Media Only

Get only posts with images/videos:

{
"scrapeMode": "posts",
"handle": "photography.bsky.social",
"feedFilter": "posts_with_media",
"postCount": 30
}

7. User Feed - With All Replies

Get posts including all replies to other users:

{
"scrapeMode": "posts",
"handle": "influencer.bsky.social",
"feedFilter": "posts_with_replies",
"postCount": 100,
"includeReplies": true,
"repliesDepth": 0
}

8. User Feed - Unlimited Posts

Get ALL posts from a user (0 = unlimited):

{
"scrapeMode": "posts",
"handle": "active-user.bsky.social",
"feedFilter": "posts_and_author_threads",
"postCount": 0,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

9. Direct Messages - Basic

Get your recent DM conversations:

{
"scrapeMode": "messages",
"conversationCount": 10,
"messagesPerConversation": 50,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

10. Direct Messages - Unread Only

Get only conversations with unread messages:

{
"scrapeMode": "messages",
"conversationCount": 0,
"messagesPerConversation": 20,
"unreadOnly": true,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

11. Direct Messages - Full Backup

Export ALL conversations with ALL messages:

{
"scrapeMode": "messages",
"conversationCount": 0,
"messagesPerConversation": 0,
"unreadOnly": false,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

12. Brand Monitoring

Track mentions of your brand:

{
"scrapeMode": "posts",
"searchQuery": "\"your brand name\"",
"searchSort": "latest",
"postCount": 100,
"includeReplies": true,
"repliesDepth": 2,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

13. Competitor Analysis

Monitor competitor's posts:

{
"scrapeMode": "posts",
"handle": "competitor.bsky.social",
"feedFilter": "posts_no_replies",
"postCount": 50,
"includeReplies": true,
"repliesDepth": 3
}

14. Hashtag/Topic Research

Find posts about a specific hashtag or topic:

{
"scrapeMode": "posts",
"searchQuery": "#buildinpublic",
"searchSort": "top",
"postCount": 100,
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

🔑 Authentication

Authentication is required for all operations.

{
"blueskyIdentifier": "your-handle.bsky.social",
"blueskyPassword": "your-app-password"
}

⚠️ Important: Use an App Password, not your main account password!

Create one at: Settings → App Passwords → Add App Password


Input Parameters

Mode Selection

ParameterTypeDescriptionDefault
scrapeModeStringWhat to scrape: posts or messagesposts

Posts Mode Parameters

ParameterTypeDescriptionDefault
searchQueryStringSearch term (enables search mode)
searchSortStringSort: top, latesttop
handleStringUser handle without "@"
feedFilterStringFeed filter typeposts_and_author_threads
postCountIntegerPosts to scrape (0 = all)10
includeRepliesBooleanFetch reply threadsfalse
repliesDepthIntegerReply thread depth (0 = all)2

Messages Mode Parameters

ParameterTypeDescriptionDefault
conversationCountIntegerConversations to fetch (0 = all)10
messagesPerConversationIntegerMessages per convo (0 = all)50
unreadOnlyBooleanOnly unread conversationsfalse

Authentication

ParameterTypeDescriptionDefault
blueskyIdentifierStringYour handle or email
blueskyPasswordStringYour app password

Protocol Settings

ParameterTypeDescriptionDefault
serviceStringAT Protocol service URL (for alternative PDS servers)https://bsky.social

📊 Output Examples

Post Output

{
"uri": "at://did:plc:xxx/app.bsky.feed.post/yyy",
"cid": "bafyrei...",
"text": "Just launched our new web scraping platform! 🚀",
"author": "Apify",
"authorHandle": "apify.com",
"authorDid": "did:plc:vu5ic5ygdeyunpefgmlamsmw",
"authorAvatar": "https://cdn.bsky.app/img/avatar/...",
"createdAt": "2024-01-15T10:30:00.000Z",
"likeCount": 142,
"repostCount": 28,
"replyCount": 15,
"quoteCount": 5,
"url": "https://bsky.app/profile/apify.com/post/yyy",
"embed": {
"type": "images",
"images": [
{
"url": "https://cdn.bsky.app/img/feed_fullsize/...",
"alt": "Screenshot of the new platform"
}
]
},
"replies": [
{
"uri": "at://did:plc:abc/app.bsky.feed.post/zzz",
"text": "This looks amazing!",
"author": "TechEnthusiast",
"authorHandle": "techlover.bsky.social",
"likeCount": 8,
"depth": 1
}
]
}

DM Output

{
"conversation": {
"id": "3abc123...",
"members": [
{
"did": "did:plc:xxx",
"handle": "friend.bsky.social",
"displayName": "Friend Name",
"avatar": "https://cdn.bsky.app/..."
}
],
"lastMessage": {
"id": "msg123",
"text": "Hey, how's it going?",
"sender": "did:plc:xxx",
"sentAt": "2024-01-15T10:30:00.000Z"
},
"unreadCount": 0,
"muted": false
},
"messages": [
{
"id": "msg123",
"text": "Hey, how's it going?",
"sender": {
"did": "did:plc:xxx",
"handle": "friend.bsky.social",
"displayName": "Friend Name"
},
"sentAt": "2024-01-15T10:30:00.000Z",
"conversationId": "3abc123..."
}
]
}

Embed Types

TypeDescriptionFields
imagesOne or more imagesimages[].url, images[].alt
videoVideo contentvideo.url, video.thumbnail
externalLink previewexternal.uri, external.title, external.description
quoteQuote postrecord.uri, record.cid, record.text

🎯 Use Cases

Posts

  • Brand Monitoring – Track mentions of your company or product
  • Market Research – Analyze trends and sentiment
  • Content Curation – Find popular posts for content ideas
  • Competitor Analysis – Monitor competitor activity

Direct Messages

  • Backup DMs – Export your conversation history
  • Message Analytics – Analyze your communication patterns
  • Data Migration – Move conversations to another platform
  • Research – Study DM patterns (with consent)

⚙️ How It Works

  1. Initialize – Creates a connection to Bluesky's API
  2. Authenticate (if provided) – Logs in for DM access or higher rate limits
  3. Fetch – Retrieves posts via search/feed or DMs via chat API
  4. Process – Extracts replies or messages as configured
  5. Output – Saves structured data to the dataset

🛡️ Rate Limits

StatusApproximate Limits
Authenticated~3000 requests/minute

💡 Tips

  • App passwords – Always use app passwords, never your main password
  • Start small – Test with small counts before scaling
  • Feed filters – Use posts_no_replies for cleaner original content
  • Search tips – Use quotes for exact phrases: "machine learning"
  • Alternative PDS – If your account is on a self-hosted PDS, set the service parameter

This Actor scrapes Bluesky's. Please:

  • Respect Bluesky's Terms of Service
  • Don't share or expose private messages
  • Use reasonable rate limits
  • Comply with data protection laws

🤝 Support

Having issues? Found a bug? Want a feature?

  • Open an issue on the Actor's page
  • Contact the developer through Apify

Built by nocodeventure • Made with 💙 for the Apify community