AIDEVELOPER TOOLS

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.

Try on Apify Store
$0.001per event
2
Users (30d)
72
Runs (30d)
90
Actively maintained
Maintenance Pulse
$0.001
Per event

Maintenance Pulse

90/100
Last Build
Today
Last Version
1d ago
Builds (30d)
8
Issue Response
N/A

Cost Estimate

How many results do you need?

post-fetcheds
Estimated cost:$0.10

Pricing

Pay Per Event model. You only pay for what you use.

EventDescriptionPrice
post-fetchedCharged 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 recordWithMedia embeds.
  • 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.app URL 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

  1. Navigate to the Bluesky Social Search actor page on Apify Store and click Start.
  2. 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.
  3. 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).
  4. 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).
  5. 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

FieldTypeRequiredDefaultDescription
queryStringYes"artificial intelligence"Search query for posts or profiles. Supports any keyword, phrase, or topic.
searchTypeEnumNo"posts"What to search: posts (post content), profiles (user accounts), or feed (author timeline).
handleStringNo--Bluesky handle for author feed lookup (e.g., jay.bsky.team). Required when searchType is feed.
sortByEnumNo"top"Sort order for post search: top (relevance) or latest (chronological). Only applies to post search mode.
maxResultsIntegerNo100Maximum 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 -- use jay.bsky.team, not @jay.bsky.team.
  • Start with a small maxResults value (25--50) when testing new queries, then increase for production runs once you confirm the results match your needs.
  • The sortBy parameter 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:

FieldTypeDescription
typeStringAlways "post" for post results.
uriStringAT Protocol URI for the post (e.g., at://did:plc:.../app.bsky.feed.post/...).
cidStringContent identifier (CID) hash for the post record.
author.didStringAuthor's Decentralized Identifier (DID) on the AT Protocol.
author.handleStringAuthor's Bluesky handle (e.g., alice.bsky.social).
author.displayNameStringAuthor's display name.
author.avatarStringURL to the author's avatar image, or null.
textStringFull text content of the post.
createdAtStringISO 8601 timestamp when the post was created.
likeCountNumberNumber of likes on the post.
repostCountNumberNumber of reposts (shares).
replyCountNumberNumber of replies.
quoteCountNumberNumber of quote posts.
hasImagesBooleanWhether the post contains image attachments.
hasVideoBooleanWhether the post contains a video attachment.
hasLinkBooleanWhether the post contains an external link embed.
embedUrlStringURL of the external link embed, or null.
embedTitleStringTitle of the external link embed, or null.
blueskyUrlStringDirect URL to view the post on bsky.app.

Profile output fields:

FieldTypeDescription
typeStringAlways "profile" for profile results.
didStringDecentralized Identifier (DID) for the account.
handleStringBluesky handle (e.g., alice.bsky.social).
displayNameStringUser's display name.
descriptionStringProfile bio/description text, or null.
avatarStringURL to the avatar image, or null.
bannerStringURL to the banner image, or null.
followersCountNumberNumber of followers.
followsCountNumberNumber of accounts followed.
postsCountNumberTotal number of posts authored.
createdAtStringISO 8601 timestamp of account creation, or null.
blueskyUrlStringDirect 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-client npm package in Node.js applications, serverless functions, or backend services.
  • Python SDK -- Use the apify-client package 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

  1. 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.
  2. 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, or app.bsky.feed.getAuthorFeed.
  3. 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.
  4. 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.
  5. URL construction -- The actor extracts the rkey from each post's AT Protocol URI (at://did:plc:.../app.bsky.feed.post/{rkey}) and combines it with the author handle to build clickable bsky.app URLs.
  6. 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.

ScenarioMax ResultsEstimated TimeEstimated Cost (USD)
Quick post search50~10 seconds~$0.001
Standard post search100~15 seconds~$0.002
Large post search500~45 seconds~$0.005
Full capacity search1,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 createdAt field 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.app URLs 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 blueskyUrl field.

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

ActorDescription
Brand Protection MonitorMonitor brand mentions across multiple platforms and receive alerts when your company name or trademark appears online.
Hacker News SearchSearch and extract posts, comments, and discussions from Hacker News by keyword, date, or popularity score.
Website Change MonitorTrack changes on any web page and get notified when content is updated, added, or removed.
WHOIS Domain LookupLook up domain registration details including registrar, creation date, expiration, and nameservers.
Multi-Platform Review AnalyzerAggregate and analyze reviews from multiple platforms to understand customer sentiment and trends.
Company Deep Research AgentComprehensive company intelligence from multiple public data sources for due diligence and sales research.

How it works

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

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.

Ready to try Bluesky Social Search?

Start for free on Apify. No credit card required.

Open on Apify Store