Bluesky Social Search
Search and extract posts, profiles, and author feeds from the Bluesky decentralized social network using the public AT Protocol API. This actor collects structured data including full engagement metrics, media type detection, and direct post URLs -- all without requiring any API key or Bluesky account. Export results as JSON, CSV, or Excel for social listening, influencer research, brand monitoring, and competitive analysis.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| post-fetched | Charged per Bluesky social post record retrieved. | $0.001 |
Example: 100 events = $0.10 · 1,000 events = $1.00
Documentation
Search and extract posts, profiles, and author feeds from the Bluesky decentralized social network using the public AT Protocol API. This actor collects structured data including full engagement metrics, media type detection, and direct post URLs -- all without requiring any API key or Bluesky account. Export results as JSON, CSV, or Excel for social listening, influencer research, brand monitoring, and competitive analysis.
Why use Bluesky Social Search?
Bluesky is built on the AT Protocol -- an open, decentralized framework for social networking that gives users ownership of their data and identity. As the platform surpasses tens of millions of users, it has become a critical channel for public discourse, brand presence, and community building that marketing teams, researchers, and developers cannot afford to ignore. Manually browsing Bluesky's web interface to track mentions, discover influencers, or analyze trends is slow and unscalable, especially when you need structured data across hundreds or thousands of posts and profiles.
Bluesky Social Search solves this by providing programmatic access to three core search modes -- post search, profile discovery, and author feed retrieval -- through a single configurable actor. Instead of writing custom code against the AT Protocol XRPC endpoints, handling cursor-based pagination, parsing embed types, and managing rate limits yourself, this actor handles all of that out of the box. You get clean, normalized output with engagement counts, media flags, and clickable Bluesky URLs ready for dashboards, spreadsheets, or downstream automation pipelines.
Key features
- Three search modes -- Search posts by keyword, discover user profiles, or fetch any public author's complete feed from a single actor.
- Full engagement metrics -- Every post result includes likeCount, repostCount, replyCount, and quoteCount for immediate sentiment and virality analysis.
- Media type detection -- Automatically identifies whether each post contains images, video, or external links, including embedded URL and title extraction from
recordWithMediaembeds. - No authentication required -- Uses Bluesky's public AT Protocol XRPC endpoints (
api.bsky.app/xrpc/). No API key, login credentials, or Bluesky account needed. - Flexible sorting -- Sort post results by relevance ("top") to find the most engaging content, or by time ("latest") to catch real-time discussions and breaking news.
- Direct Bluesky URLs -- Every result includes a constructed
bsky.appURL derived from the AT Protocol URI rkey, so you can jump directly to any post or profile. - Automatic pagination -- Cursor-based pagination with built-in 500ms rate limiting collects up to 1,000 results per run without hitting API throttle errors.
- Decentralized identity support -- Output includes AT Protocol DIDs (Decentralized Identifiers) alongside human-readable handles, preserving the full identity chain for technical integrations.
- Lightweight and fast -- Pure API calls with no browser rendering. Runs on 256 MB memory and completes most searches in under 90 seconds.
- Export-ready output -- Structured JSON output works directly with Apify dataset exports to CSV, Excel, Google Sheets, and downstream API consumers.
How to use Bluesky Social Search
Using Apify Console
- Navigate to the Bluesky Social Search actor page on Apify Store and click Start.
- Select a Search Type -- choose "Posts" to search post content by keyword, "Profiles" to find Bluesky user accounts, or "Author Feed" to retrieve a specific user's recent posts.
- Enter your Search Query -- type any keyword, phrase, or topic. If you selected "Author Feed", enter the user's Bluesky handle in the Handle field (e.g.,
jay.bsky.team). - Configure Sort Order and Max Results -- select "Top" for relevance-ranked results or "Latest" for chronological order, and set your desired result count (1 to 1,000).
- Click Start, wait for the run to complete, then view results in the Output tab or download as JSON, CSV, or Excel.
Using the API
You can start the actor programmatically using the Apify API, JavaScript SDK, or Python SDK. See the API & Integration section below for ready-to-use code examples with the actor ID WaK34EBiICC9ai1zS.
Input parameters
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | String | Yes | "artificial intelligence" | Search query for posts or profiles. Supports any keyword, phrase, or topic. |
searchType | Enum | No | "posts" | What to search: posts (post content), profiles (user accounts), or feed (author timeline). |
handle | String | No | -- | Bluesky handle for author feed lookup (e.g., jay.bsky.team). Required when searchType is feed. |
sortBy | Enum | No | "top" | Sort order for post search: top (relevance) or latest (chronological). Only applies to post search mode. |
maxResults | Integer | No | 100 | Maximum number of results to return. Range: 1--1,000. |
Example input
{
"query": "artificial intelligence",
"searchType": "posts",
"sortBy": "latest",
"maxResults": 250
}
Tips for input
- Use specific multi-word queries like
"decentralized social media"rather than single generic terms for more relevant post results. - When using "Author Feed" mode, omit the
@symbol from the handle -- usejay.bsky.team, not@jay.bsky.team. - Start with a small
maxResultsvalue (25--50) when testing new queries, then increase for production runs once you confirm the results match your needs. - The
sortByparameter only affects post search mode. Profile search and author feed modes ignore this setting.
Output
Each run produces a dataset of structured results. The output schema depends on the search type selected.
Post search result:
{
"type": "post",
"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3lbfm4g7hsc2c",
"cid": "bafyreigxkzbjkr5h4p7tnj6k5q3dxwvhnmyclass47x6mtcfoknu4suvsi",
"author": {
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"displayName": "Bluesky",
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihagr2..."
},
"text": "Bluesky now has over 20 million users! Thank you to everyone who has joined and made this community what it is.",
"createdAt": "2024-11-20T18:30:00.000Z",
"likeCount": 48520,
"repostCount": 12340,
"replyCount": 3150,
"quoteCount": 1890,
"hasImages": false,
"hasVideo": false,
"hasLink": true,
"embedUrl": "https://bsky.social/about/blog/11-20-2024-20-million",
"embedTitle": "Bluesky Reaches 20 Million Users",
"blueskyUrl": "https://bsky.app/profile/bsky.app/post/3lbfm4g7hsc2c"
}
Profile search result:
{
"type": "profile",
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"displayName": "Bluesky",
"description": "Official account for Bluesky Social. Building a social internet. Download at bsky.app.",
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihagr2...",
"banner": "https://cdn.bsky.app/img/banner/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreib3...",
"followersCount": 1250000,
"followsCount": 35,
"postsCount": 890,
"createdAt": "2023-04-12T00:00:00.000Z",
"blueskyUrl": "https://bsky.app/profile/bsky.app"
}
Output fields
Post output fields:
| Field | Type | Description |
|---|---|---|
type | String | Always "post" for post results. |
uri | String | AT Protocol URI for the post (e.g., at://did:plc:.../app.bsky.feed.post/...). |
cid | String | Content identifier (CID) hash for the post record. |
author.did | String | Author's Decentralized Identifier (DID) on the AT Protocol. |
author.handle | String | Author's Bluesky handle (e.g., alice.bsky.social). |
author.displayName | String | Author's display name. |
author.avatar | String | URL to the author's avatar image, or null. |
text | String | Full text content of the post. |
createdAt | String | ISO 8601 timestamp when the post was created. |
likeCount | Number | Number of likes on the post. |
repostCount | Number | Number of reposts (shares). |
replyCount | Number | Number of replies. |
quoteCount | Number | Number of quote posts. |
hasImages | Boolean | Whether the post contains image attachments. |
hasVideo | Boolean | Whether the post contains a video attachment. |
hasLink | Boolean | Whether the post contains an external link embed. |
embedUrl | String | URL of the external link embed, or null. |
embedTitle | String | Title of the external link embed, or null. |
blueskyUrl | String | Direct URL to view the post on bsky.app. |
Profile output fields:
| Field | Type | Description |
|---|---|---|
type | String | Always "profile" for profile results. |
did | String | Decentralized Identifier (DID) for the account. |
handle | String | Bluesky handle (e.g., alice.bsky.social). |
displayName | String | User's display name. |
description | String | Profile bio/description text, or null. |
avatar | String | URL to the avatar image, or null. |
banner | String | URL to the banner image, or null. |
followersCount | Number | Number of followers. |
followsCount | Number | Number of accounts followed. |
postsCount | Number | Total number of posts authored. |
createdAt | String | ISO 8601 timestamp of account creation, or null. |
blueskyUrl | String | Direct URL to view the profile on bsky.app. |
Use cases
- Brand monitoring -- Track mentions of your company, product, or trademark on Bluesky with daily scheduled runs to catch emerging conversations before they go viral.
- Influencer discovery -- Search profiles by niche keywords to find high-follower accounts in specific industries, then analyze their feeds for content partnership opportunities.
- Competitive intelligence -- Monitor competitor brand names and product launches on Bluesky to understand market reception and customer sentiment in real time.
- Crisis management -- Use "latest" sort to detect negative mentions as they happen and feed results into alerting pipelines via webhooks or Zapier integrations.
- Academic research -- Study adoption patterns, discourse dynamics, and content trends on decentralized social platforms with structured, exportable datasets.
- Journalism and fact-checking -- Search for eyewitness accounts, primary sources, and public statements on breaking news topics across the Bluesky network.
- Campaign tracking -- Monitor hashtags and campaign-specific keywords to measure reach, engagement rates, and share-of-voice during marketing campaigns.
- Developer integrations -- Feed structured post and profile data into custom dashboards, analytics platforms, or notification systems via the Apify API.
- Content strategy -- Analyze top-performing posts in your niche by engagement metrics to identify what resonates with the Bluesky audience and inform your posting strategy.
API & Integration
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("WaK34EBiICC9ai1zS").call(run_input={
"query": "artificial intelligence",
"searchType": "posts",
"sortBy": "top",
"maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['author']['handle']}: {item['text'][:80]}...")
print(f" Likes: {item['likeCount']} | Reposts: {item['repostCount']}")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("WaK34EBiICC9ai1zS").call({
query: "artificial intelligence",
searchType: "posts",
sortBy: "top",
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.log(`${item.author.handle}: ${item.text.substring(0, 80)}...`);
console.log(` Likes: ${item.likeCount} | Reposts: ${item.repostCount}`);
});
cURL
curl -X POST "https://api.apify.com/v2/acts/WaK34EBiICC9ai1zS/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "artificial intelligence",
"searchType": "posts",
"sortBy": "top",
"maxResults": 100
}'
Integrations
- Apify API -- Trigger runs and retrieve datasets programmatically via the REST API.
- JavaScript SDK -- Use the
apify-clientnpm package in Node.js applications, serverless functions, or backend services. - Python SDK -- Use the
apify-clientpackage for data pipelines, Jupyter notebooks, or Flask/Django integrations. - Zapier -- Connect Bluesky search results to 5,000+ apps. Trigger Zaps on new brand mentions, send results to Slack, Google Sheets, or email.
- Make (Integromat) -- Build multi-step scenarios that run Bluesky searches and route results to CRMs, databases, or notification channels.
- Google Sheets -- Export results directly to a Google Sheet for collaborative analysis, pivot tables, and reporting dashboards.
- Webhooks -- Configure a webhook URL to receive results as soon as the run finishes for real-time alerting pipelines.
- Slack / Microsoft Teams -- Combine with Zapier or Make to post Bluesky mention alerts directly into your team chat channels.
How it works
- Input validation -- The actor reads your input configuration, validates required fields (query for post/profile search, handle for feed mode), and sets defaults for optional parameters.
- API endpoint selection -- Based on the
searchType, the actor targets one of three AT Protocol XRPC endpoints:app.bsky.feed.searchPosts,app.bsky.actor.searchActors, orapp.bsky.feed.getAuthorFeed. - Paginated data collection -- The actor sends requests with up to 100 items per page, using cursor-based pagination to walk through result sets. A 500ms delay between requests prevents rate limiting.
- Post transformation -- Each raw AT Protocol response is normalized into a clean output schema. The actor parses embed types (
images#view,video#view,external#view,recordWithMedia#view) to set media flags and extract embedded URLs. - URL construction -- The actor extracts the
rkeyfrom each post's AT Protocol URI (at://did:plc:.../app.bsky.feed.post/{rkey}) and combines it with the author handle to build clickablebsky.appURLs. - Dataset push -- All transformed results are pushed to the Apify dataset in a single batch, ready for export or API retrieval.
Input Config
|
v
+-------------------+
| Endpoint Selection | --> searchPosts / searchActors / getAuthorFeed
+-------------------+
|
v
+-------------------+
| Paginated Fetch | --> 100 items/page, cursor-based, 500ms delay
+-------------------+
|
v
+-------------------+
| Transform & Parse | --> Normalize fields, detect media, extract embeds
+-------------------+
|
v
+-------------------+
| Build URLs | --> Extract rkey, construct bsky.app links
+-------------------+
|
v
+-------------------+
| Push to Dataset | --> JSON, CSV, Excel export ready
+-------------------+
Performance & cost
The actor uses pure API calls with no browser rendering, making it extremely lightweight and cost-effective.
| Scenario | Max Results | Estimated Time | Estimated Cost (USD) |
|---|---|---|---|
| Quick post search | 50 | ~10 seconds | ~$0.001 |
| Standard post search | 100 | ~15 seconds | ~$0.002 |
| Large post search | 500 | ~45 seconds | ~$0.005 |
| Full capacity search | 1,000 | ~90 seconds | ~$0.010 |
| Daily monitoring (100/day for 30 days) | 3,000 total | ~7.5 minutes total | ~$0.06/month |
The actor runs on 256 MB of memory. At Apify's pay-as-you-go rate, 1 compute unit (1 GB-hour) costs approximately $0.25, which provides roughly 4 hours of runtime at 256 MB. Most individual runs complete for less than one cent.
Limitations
- Maximum 1,000 results per run -- The AT Protocol search endpoints return a finite result window. For larger datasets, run the actor multiple times with different queries or use scheduled runs over time.
- No date range filtering -- The Bluesky search API does not natively support date range parameters. Use "latest" sort and filter the output
createdAtfield after export to narrow by time window. - No language filtering -- The API does not expose a language filter. Results may include posts in any language matching the query text.
- Public content only -- The actor accesses publicly available data through unauthenticated endpoints. Private accounts or blocked content are not accessible.
- Rate limiting constraints -- The built-in 500ms delay between pages means collecting 1,000 results takes approximately 90 seconds. This is by design to respect Bluesky's public API limits.
- Embed parsing scope -- The actor detects images, video, and external link embeds. Other embed types (e.g., feed generator embeds, list embeds) are not currently flagged.
- Handle changes -- Bluesky allows users to change handles. Constructed
bsky.appURLs use the handle at the time of the search. If a user changes their handle later, the URL may redirect or break.
Responsible use
- Respect user privacy -- Although all data accessed is publicly available through the AT Protocol, avoid using collected data for harassment, doxxing, or targeted advertising without consent.
- Comply with Bluesky's terms -- Ensure your use of this actor aligns with Bluesky's Terms of Service and community guidelines for data access.
- Use rate limiting responsibly -- The actor includes built-in rate limiting. Do not attempt to bypass delays or run excessive parallel instances that could strain the public API infrastructure.
- Handle personal data carefully -- Post content, profile descriptions, and display names may contain personal information. Store and process this data in compliance with applicable privacy regulations (GDPR, CCPA, etc.).
- Attribute sources -- When publishing analysis or reports based on Bluesky data, credit original authors and link back to source posts using the provided
blueskyUrlfield.
FAQ
Does this actor require a Bluesky account or API key? No. The actor uses Bluesky's public AT Protocol XRPC endpoints, which do not require authentication. All data accessed is publicly available on the open network. You do not need to create a Bluesky account or obtain any tokens.
What is the AT Protocol and how does it relate to Bluesky? The AT Protocol (Authenticated Transfer Protocol) is the open, decentralized protocol that powers Bluesky. It defines how user identities (DIDs), posts, and social interactions are stored and transferred across federated servers. This actor queries the AT Protocol's XRPC API layer, which means it accesses the same data infrastructure that powers the Bluesky app itself.
What is the maximum number of results I can get per run?
You can retrieve up to 1,000 results per run via the maxResults parameter. If you need ongoing data collection, schedule the actor to run daily or hourly using Apify Scheduler, and results will accumulate across runs.
Can I search for posts by a specific user?
Yes. Set searchType to "feed" and enter the user's Bluesky handle in the handle field (e.g., jay.bsky.team). This retrieves their recent public posts with full engagement metrics. Do not include the @ symbol.
Does the actor support hashtag searches?
Yes. Enter the hashtag as your search query with or without the # symbol. Bluesky's post search matches against the full text content of posts, so hashtags are searchable just like any other keyword or phrase.
How real-time are the results? Results are fetched live from the Bluesky API at the time of the run. When you sort by "latest", you get the most recent posts matching your query. There is no caching layer -- each run queries the live AT Protocol network.
Can I filter results by date range or language?
The Bluesky search API does not currently support native date range or language filters. You can use "latest" sort to get the most recent results, then filter the exported dataset by the createdAt field in your spreadsheet or data pipeline.
What engagement metrics are included with posts?
Each post includes four engagement counters: likeCount, repostCount, replyCount, and quoteCount. Additionally, boolean flags (hasImages, hasVideo, hasLink) indicate media presence, with embedUrl and embedTitle providing link details when available.
What are DIDs in the output? DIDs (Decentralized Identifiers) are permanent, cryptographic identifiers for accounts on the AT Protocol. Unlike handles, which can change, a DID remains constant for the lifetime of an account. The output includes both the DID and the human-readable handle for maximum flexibility.
Is there a rate limit I should worry about? The actor handles rate limiting automatically with a 500ms delay between paginated requests. You do not need to configure anything -- the built-in throttling prevents errors and ensures reliable data collection.
Can I integrate this with my existing tools? Yes. You can trigger runs via the Apify REST API, Python SDK, JavaScript SDK, or connect through Zapier, Make, webhooks, and Google Sheets. See the API & Integration section for code examples.
How is this different from scraping the Bluesky website? This actor uses Bluesky's official public AT Protocol API endpoints rather than scraping HTML. This means faster execution, structured output, no browser overhead, and resilience to UI changes. The AT Protocol API is the intended programmatic interface for accessing Bluesky data.
Related actors
| Actor | Description |
|---|---|
| Brand Protection Monitor | Monitor brand mentions across multiple platforms and receive alerts when your company name or trademark appears online. |
| Hacker News Search | Search and extract posts, comments, and discussions from Hacker News by keyword, date, or popularity score. |
| Website Change Monitor | Track changes on any web page and get notified when content is updated, added, or removed. |
| WHOIS Domain Lookup | Look up domain registration details including registrar, creation date, expiration, and nameservers. |
| Multi-Platform Review Analyzer | Aggregate and analyze reviews from multiple platforms to understand customer sentiment and trends. |
| Company Deep Research Agent | Comprehensive company intelligence from multiple public data sources for due diligence and sales research. |
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
Bulk Email Verifier
Verify email deliverability at scale. MX record validation, SMTP mailbox checks, disposable and role-based detection, catch-all flagging, and confidence scoring. No external API costs.
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Website Tech Stack Detector
Detect 100+ web technologies on any website. Identifies CMS, frameworks, analytics, marketing tools, chat widgets, CDNs, payment systems, hosting, and more. Batch-analyze multiple sites with version detection and confidence scoring.
Ready to try Bluesky Social Search?
Start for free on Apify. No credit card required.
Open on Apify Store