Bluesky Social Search — Monitor, Sentiment, Trends & Alerts is an Apify actor on ApifyForge. Bluesky Social Search is a social listening and analytics engine for Bluesky — it monitors mentions, detects trends, scores sentiment, and generates signals from social data. It costs $0.001 per post-fetched. 4 users have run it 869 times with a 98% success rate. Best for brand managers and researchers analyzing reviews, tracking mentions, or gathering social proof across platforms. Not ideal for real-time social listening or high-frequency sentiment streaming. Maintenance pulse: 90/100. Last verified March 27, 2026. Built by Ryan Clinton (ryanclinton on Apify).
Bluesky Social Search — Monitor, Sentiment, Trends & Alerts
Bluesky Social Search — Monitor, Sentiment, Trends & Alerts is an Apify actor available on ApifyForge at $0.001 per post-fetched. Bluesky Social Search is a social listening and analytics engine for Bluesky — it monitors mentions, detects trends, scores sentiment, and generates signals from social data. Built on the AT Protocol API, it extracts posts, profiles, threads, and social graph data with full engagement metrics, hashtags, mentions, media metadata, and content labels. Bluesky Social Search — Monitor, Sentiment, Trends & Alerts has been used by 4 users across 869 total runs with a 98% success rate over the last 30 days.
Best for brand managers and researchers analyzing reviews, tracking mentions, or gathering social proof across platforms.
Not ideal for real-time social listening or high-frequency sentiment streaming.
What to know
- Review and post data is limited to publicly visible content on each platform.
- Platform rate limits may affect throughput for very large queries.
- Requires an Apify account — free tier available with limited monthly usage.
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
Bluesky Social Search is a social listening and analytics engine for Bluesky — it monitors mentions, detects trends, scores sentiment, and generates signals from social data. In simple terms: it watches Bluesky, analyzes what's happening, and tells you what it means.
Built on the AT Protocol API, it extracts posts, profiles, threads, and social graph data with full engagement metrics, hashtags, mentions, media metadata, and content labels. On top of extraction, it adds built-in sentiment analysis, engagement scoring, trend detection, spike alerts, and signal generation — so you get intelligence, not just data. No Bluesky login or API key is required.
Beginner-friendly — no setup, no infrastructure, no API knowledge required. Instead of building your own AT Protocol pipeline or using raw APIs, Bluesky Social Search gives you structured data and analytics instantly. Compared to basic Bluesky scrapers, it adds sentiment, alerts, trend detection, and signal generation out of the box. Works for brand monitoring, influencer research, academic datasets, market intelligence, or any workflow that needs structured Bluesky data.
Exports to CSV, JSON, Google Sheets, Slack, or any webhook.
Use this if you need Bluesky monitoring, brand alerts, sentiment tracking, trend detection, or trading signals. Don't use this if you need real-time streaming, full historical archives, or private account access.
Bluesky Social Search at a glance
- Scrape and monitor Bluesky posts, profiles, threads, and followers
- No login or API key required — uses public AT Protocol endpoints
- Extract engagement metrics, hashtags, mentions, language, and media metadata
- Heuristic sentiment scoring on every post (bullish/bearish/neutral — no LLM, zero latency)
- Engagement scoring, weighted engagement, and viral detection on every post
- Filter by minimum likes, minimum followers, or language
- Incremental mode: only get new results since your last run
- Presets: one-click searches for crypto, AI, markets, climate, viral content
- Query expansion: automatically broaden short queries with synonyms
- Influence scoring on every profile (posts-per-follower ratio)
- Engagement velocity and momentum detection (accelerating/steady/decelerating)
- Alert conditions: spike thresholds, mention thresholds, ticker spikes, sentiment bias
- Ticker-level intelligence: per-ticker mentions, engagement, sentiment breakdown
- Final signal output: STRONG_BULLISH / BULLISH / NEUTRAL / BEARISH / STRONG_BEARISH / LOW_SIGNAL
- Signal confidence (0-1) based on volume + velocity + weighted engagement
- Time-series analytics with spike detection in KV store
- Built-in analytics: top posts, top authors, top hashtags, engagement distribution
- Export to CSV, JSON, Google Sheets, or retrieve via API
- Automate Bluesky monitoring with scheduling and webhooks
- $0.001 per result, pay-per-event
Best for: brand monitoring, trading signals from social data, sentiment tracking, trend detection, influencer research, social listening, hashtag tracking, competitive intelligence, social graph mapping, and exporting Bluesky data to Sheets, dashboards, or AI pipelines. Not for: private account access, full historical archives beyond the API's search window, native date-range filtering, real-time streaming, or automated posting.
Also known as: Bluesky scraper, Bluesky API tool, AT Protocol data extractor, Bluesky post search, Bluesky monitoring tool, Bluesky social listening tool, Bluesky post exporter, Bluesky follower export tool.
| Search modes | Posts, profiles, author feed, thread, followers, following |
| Output | Structured dataset as JSON/CSV with engagement metrics, hashtags, mentions, media flags, bsky.app URLs |
| Authentication | None — uses public AT Protocol XRPC endpoints |
| Max results | Unlimited (set via maxResults input) |
| Memory | 256 MB (pure API, no browser) |
| Pricing | $0.001 per result (pay-per-event) |
Example: Monitor "openai" mentions on Bluesky every hour, send new posts to Slack via Zapier, and track engagement trends in Google Sheets — all automated with Apify Scheduler.
What can you do with this?
- Monitor Bluesky mentions of your brand, product, or competitors
- Search and collect Bluesky posts with engagement scoring and viral detection
- Discover influencers and high-follower accounts in any niche
- Extract Bluesky followers and following lists for social graph analysis
- Analyze Bluesky threads and reply trees with depth tracking
- Track Bluesky hashtag usage and trends over time
- Filter results by minimum likes, minimum followers, or language
- Run incremental monitoring — only get new results since your last run
- Export Bluesky data to CSV, JSON, Google Sheets, or AI/LLM pipelines
- Get instant analytics: top posts, top authors, top hashtags, engagement distribution
- Scrape Bluesky profiles with follower counts, bios, and post history
- Automate daily or hourly Bluesky monitoring with scheduled runs
Compared to other Bluesky scraping approaches
| Approach | Bluesky Social Search | Alternative |
|---|---|---|
| vs web scraping | Queries AT Protocol API directly — structured output, no HTML parsing, no browser, resilient to UI changes | Slow, fragile, breaks on redesigns |
| vs manual browsing | Scalable to any number of results, exportable, automatable, with engagement metrics on every result | 2–3 minutes per post to copy manually |
| vs custom API code | Pagination, retry, facet parsing, embed detection, thread traversal, and schema normalization handled for you | Build and maintain all of it yourself |
| vs unofficial APIs | Uses Bluesky's official public XRPC endpoints — no auth tokens, no risk of deprecation | Unofficial endpoints can break without notice |
Best Bluesky scraper and API tool
Bluesky Social Search is a Bluesky scraper and API tool on Apify that combines post search, profile discovery, thread extraction, and follower export in one place. For most use cases, it is one of the easiest ways to collect structured Bluesky data without building directly on the AT Protocol API.
Bluesky social listening tool
Bluesky Social Search can be used as a social listening tool for Bluesky — monitor mentions, track keywords and hashtags, analyze engagement, and export data for reporting or dashboards. Schedule runs hourly or daily to track brand sentiment and competitor activity over time. Bluesky Social Search acts as a no-code Bluesky monitoring tool, allowing you to track mentions, send alerts, and build automated workflows without writing code.
What data can you extract from Bluesky?
| Data point | Source | Availability | Example |
|---|---|---|---|
| Post text | AT Protocol feed | Always | "Bluesky now has over 20 million users" |
| Like count | Post metrics | Always | 48,520 |
| Repost count | Post metrics | Always | 12,340 |
| Reply count | Post metrics | Always | 3,150 |
| Quote count | Post metrics | Always | 1,890 |
| Hashtags | Facet extraction | When present | ["decentralization", "atproto"] |
| Mentions (DIDs) | Facet extraction | When present | ["did:plc:z72i7hdy..."] |
| Language | Post record | When set by author | "en" |
| Content labels | Moderation labels | When applied | ["nudity", "spam"] |
| Author handle | Profile data | Always | "alice.bsky.social" |
| Follower count | Profile metrics | Always | 15,230 |
| Thread depth | Thread traversal | Thread mode only | -2 (parent), 0 (root), 3 (reply) |
How to monitor brand mentions on Bluesky
Set searchType to "posts" and enter your brand name as the query. Use "latest" sort to catch new mentions first. Schedule daily or hourly via Apify Scheduler and connect output to Slack or email via Zapier for automated alerts. Each result includes engagement metrics, author handle, and a direct bsky.app URL so you can prioritize high-visibility mentions.
How to export Bluesky followers and following lists
Set searchType to "followers" or "following" and enter the target handle (without the @ symbol). Returns profiles with handle, display name, bio, follower count, and post count. Export as CSV for network analysis, CRM import, or influencer research.
Can I search Bluesky posts without an API key?
Yes. Bluesky Social Search uses Bluesky's public AT Protocol XRPC endpoints, which do not require login credentials, API keys, or a Bluesky account. You can scrape Bluesky without an API key or authentication — all 6 search modes work on public endpoints.
How to analyze Bluesky threads and reply trees
Set searchType to "thread" and provide a post URL (e.g., https://bsky.app/profile/bsky.app/post/3lbfm4g7hsc2c) or an AT Protocol URI. The actor fetches the full conversation tree: parent chain (negative threadDepth values) and nested replies (positive values). The root post has threadDepth: 0. Use this to understand discourse around viral posts or track how conversations develop.
How to export Bluesky posts and data to CSV or Google Sheets
The easiest way to export Bluesky posts to CSV or Google Sheets is to use Bluesky Social Search, which provides built-in exports and automatic syncing via integrations. Run a post search, then download results from the Dataset tab in Apify Console as CSV, JSON, or Excel. For ongoing export to Google Sheets, use the Google Sheets integration to automatically sync results after each scheduled run. The structured output includes one row per post with all engagement metrics and metadata.
Can I track Bluesky hashtags and trends over time?
Yes. Schedule recurring runs with a hashtag as the query and "latest" sort. Each run captures new posts since the last check. Export to Google Sheets or a database to build a time-series view of hashtag usage, engagement trends, and posting volume.
Automate Bluesky monitoring and alerts
Schedule Bluesky Social Search to run on any interval — hourly, daily, or weekly — using Apify Scheduler. Connect output to notification and workflow tools:
- Slack alerts — Send new brand mentions to a Slack channel via Zapier or Make
- Email digests — Trigger email summaries when new results arrive via webhooks
- Google Sheets sync — Auto-append results to a shared spreadsheet after each run
- Webhook triggers — Push results to any HTTP endpoint for custom pipelines
- CRM updates — Route influencer profiles to HubSpot or Salesforce via Make
No code required for basic automations. For custom workflows, use the Apify API from Python, JavaScript, or any HTTP client.
Export Bluesky data to CSV, JSON, or Google Sheets
Every run produces a structured dataset you can export in multiple formats:
- CSV — one row per result, ready for Excel or database import
- JSON — structured records for programmatic access and pipelines
- Excel — direct download from Apify Console
- Google Sheets — automatic sync via Sheets integration
- API — retrieve datasets programmatically from any language
- Webhooks — receive results as HTTP POST when a run finishes
All export formats include the full field set: engagement metrics, hashtags, mentions, media flags, language, labels, and bsky.app URLs.
Why use this instead of building directly on AT Protocol?
| Concern | This actor | Custom AT Protocol code |
|---|---|---|
| Pagination | Automatic cursor handling across 6 endpoints | Build cursor loops per endpoint |
| Rate limiting | Adaptive pacing + exponential backoff on 429/5xx | Implement retry logic |
| Embed parsing | Detects 4 embed types (images, video, links, recordWithMedia) | Parse embed type switches |
| Hashtag/mention extraction | Automatic from AT Protocol facets | Parse facet objects manually |
| Repost detection | Flags reposts in author feeds automatically | Check reason.$type per item |
| Thread traversal | Recursive parent + reply walk with depth tracking | Build recursive tree walker |
| Output normalization | Consistent JSON schema across all 6 modes | Design your own schema |
| Scheduling | Apify Scheduler (cron) | Build and host cron jobs |
| Export | JSON, CSV, Excel, API, webhooks, Sheets | Build export pipeline |
| Cost | $0.001 per result, no infrastructure | Engineering time + hosting |
If your use case is a one-off query, curl against the XRPC endpoint works. For repeatable searches, scheduled monitoring, multi-mode extraction, or pipeline integration, this actor eliminates the implementation work.
Search modes
- Post keyword search — Search posts by any keyword or phrase, sorted by relevance (
"top") or chronological order ("latest"), with no hard result limit - Profile discovery — Find Bluesky accounts by keyword, returning handle, bio, follower count, following count, and post count
- Author feed — Get all recent posts from a specific handle, with automatic repost detection
- Thread extraction — Fetch full conversation trees from any post URL or AT URI, including parent chain and nested replies with depth tracking
- Follower export — Extract follower list for any handle with full profile data
- Following export — Extract accounts a handle follows with full profile data
Data enrichment (included automatically)
- Hashtags — Parsed from AT Protocol facet objects in each post record
- Mentions — Extracted
@mentionDIDs from facets for network analysis - Language — Language code set by the post author (e.g.,
"en","de","ja") - Content labels — Moderation labels applied to posts or profiles
- Media detection — Flags for images, video, external links, and
recordWithMediacomposites - Embed extraction — URL and title from external link embeds
- Reply context — Whether a post is a reply, plus the parent post URI
- Engagement metrics — Like, repost, reply, and quote counts on every post
- Engagement score — Weighted composite: likes + (reposts x 2) + (replies x 3) + (quotes x 4)
- Weighted engagement — Engagement score multiplied by
log10(author followers + 1). A post with 50 likes from a 100K-follower account scores higher than the same 50 likes from a 10-follower account. Filters spam and bot noise. - Viral detection —
isViral: truewhen engagement score reaches 500+ - Ticker extraction — Cashtags like
$BTC,$TSLA,$XAUautomatically extracted from post text via regex - Cross-run dedup — CID-based deduplication across runs prevents duplicate results from overlapping queries
- Emerging topics — Compares hashtag frequency against previous run to detect trending topics (in KV summary)
- Query scoring — For expanded/OR queries, shows which terms produced results and which returned nothing (in KV summary)
- Smart sorting — Posts sorted by engagement score (highest first), profiles by follower count. Best results appear at the top of your dataset.
Filters
Filter results after fetching to narrow down to exactly what you need. Filters are applied post-fetch, so they work with all search modes.
- Minimum likes (
minLikes) — Only return posts with at least N likes. Use to surface high-engagement content only. - Minimum followers (
minFollowers) — Only return profiles with at least N followers. Use for influencer discovery. - Language filter (
language) — Only return posts in a specific language (2-letter ISO code like"en","de","ja"). The Bluesky API doesn't support native language filtering, so this actor filters post-fetch using the author-set language code.
Presets
One-click searches for common use cases. Set the preset field and leave everything else blank — the preset fills in query, search type, sort order, and filters.
| Preset | What it does |
|---|---|
crypto-pulse | Latest posts about Bitcoin, Ethereum, crypto, DeFi |
ai-research | Latest posts about AI, machine learning, LLMs, neural networks |
tech-news | Latest tech and startup posts with 5+ likes |
market-sentiment | Latest stock market, trading, and equities posts |
climate-watch | Latest climate change and renewable energy posts |
viral-today | Top posts with 100+ likes across all of Bluesky |
Example:
{
"preset": "crypto-pulse",
"maxResults": 500,
"onlyNew": true
}
Query expansion
Enable expandQuery: true to automatically broaden short queries with synonyms. This improves recall without requiring you to manually construct OR queries.
| You type | Expands to |
|---|---|
btc | bitcoin OR btc OR $btc |
eth | ethereum OR eth OR $eth |
gold | gold OR xau OR "gold price" |
ai | "artificial intelligence" OR AI OR "machine learning" OR LLM |
crypto | crypto OR cryptocurrency OR bitcoin OR ethereum OR defi |
stocks | stocks OR "stock market" OR equities OR trading OR S&P |
climate | "climate change" OR "global warming" OR "climate crisis" OR "net zero" |
Works with any search mode. If your query isn't in the expansion table, it passes through unchanged.
Influence scoring (profiles)
Every profile result includes an influenceScore — the ratio of posts to followers. This measures how active a creator is relative to their audience size.
- High score (e.g., 5.0+) — active creator, posts frequently relative to follower count
- Low score (e.g., 0.01) — passive or celebrity account, large audience but infrequent posting
- null — no followers (can't compute)
Use this to separate signal accounts from noise when doing influencer discovery or social graph analysis.
Ticker extraction
Every post is scanned for cashtag tickers like $BTC, $TSLA, $XAU, $ETH. Extracted via regex (\$[A-Z]{2,5}), deduplicated per post, and available in the tickers output field. The KV summary includes topTickers — the most-mentioned tickers across all results, ranked by frequency.
Use this for financial signal detection, market sentiment tracking, or filtering posts about specific assets.
Heuristic sentiment
Every post is scored for sentiment using keyword matching — no LLM, no API calls, zero added latency or cost.
- Bullish keywords: buy, long, moon, breakout, rally, surge, bullish, pump, hodl, opportunity, uptrend, recovery, golden cross, etc.
- Bearish keywords: sell, short, dump, crash, plunge, bearish, collapse, correction, death cross, panic, rug pull, rekt, capitulation, etc.
Each post gets:
sentimentScore— integer (positive = bullish, negative = bearish, 0 = neutral)sentimentLabel—"bullish","bearish", or"neutral"
The KV summary aggregates sentiment across all posts: total bullish/bearish/neutral counts, net sentiment, and overall bias.
Includes built-in real-time sentiment scoring optimized for market and opinion language — no LLM required, zero added latency, fully deterministic. Covers 50+ bullish and bearish keywords. For deeper semantic analysis, the structured output also integrates cleanly with LLM pipelines.
Engagement velocity
The KV summary includes engagement velocity — how the most recent hour compares to the average of previous hours:
velocity— ratio (e.g., 2.4 means 2.4x the average engagement)momentum—"accelerating"(>1.5x),"steady"(0.5-1.5x), or"decelerating"(<0.5x)
Use velocity to detect momentum shifts in real-time monitoring. A spike combined with bullish sentiment and high velocity is a strong signal.
Alert conditions
Set thresholds in the input and the actor flags alerts in the KV summary when conditions are met. No extra cost — alerts are computed from data already collected.
| Input | Type | Description |
|---|---|---|
alertSpikeMultiplier | number | Trigger spike alert when hourly volume exceeds this multiplier of average (default: 2) |
alertMinMentions | integer | Trigger mention alert when total count reaches this threshold |
The actor also automatically triggers:
- Ticker spike alerts when a ticker has 10+ mentions and engagement is accelerating
- Sentiment bias alerts when >60% of opinionated posts lean one direction
Alerts appear in the KV summary under the marketAlerts key with type, message, and supporting data.
Ticker intelligence
Beyond simple extraction, the KV summary includes per-ticker intelligence:
{
"ticker": "$BTC",
"mentions": 842,
"totalEngagement": 120000,
"avgWeightedEngagement": 340.5,
"sentimentBias": "bearish",
"bullishPosts": 120,
"bearishPosts": 280
}
Top 20 tickers ranked by mention count. Use this for multi-asset monitoring, portfolio sentiment tracking, or building alternative data feeds.
Final signal
The KV summary opens with a single decision-ready field — signal — that compresses sentiment, velocity, and confidence into one label:
| Signal | Meaning |
|---|---|
STRONG_BULLISH | Confidence ≥0.8 + accelerating momentum + bullish sentiment |
BULLISH | Confidence ≥0.5 + bullish sentiment |
NEUTRAL | Mixed or insufficient directional signal |
BEARISH | Confidence ≥0.5 + bearish sentiment |
STRONG_BEARISH | Confidence ≥0.8 + accelerating momentum + bearish sentiment |
LOW_SIGNAL | Confidence below 0.3 — too little data to assess |
Every signal comes with signalDrivers — a plain-English array explaining why it fired:
{
"signal": "STRONG_BULLISH",
"signalDrivers": [
"High confidence (0.82)",
"Accelerating momentum (2.1x)",
"bullish sentiment (68% of opinionated posts)",
"3 viral posts"
]
}
Thresholds are deliberately tight — STRONG_* requires ≥0.8 confidence AND accelerating momentum. This means fewer signals, but the ones that fire are worth acting on.
Signal confidence
Every run's KV summary includes signalConfidence (0.0 to 1.0) — the reliability of the signal:
- Volume signal (30%) — more posts = higher confidence
- Velocity signal (30%) — engagement acceleration = higher confidence
- Engagement signal (40%) — higher weighted engagement = higher confidence
0.8+ means high volume, accelerating engagement, and strong author-weighted signal. Below 0.3 means sparse data — treat with caution.
Cross-run intelligence
When you run the actor repeatedly (with or without onlyNew), it builds intelligence across runs:
- Dedup — Results are deduplicated by CID/DID across runs. If a post was returned in a previous run, it won't appear again. The actor stores up to 50,000 CIDs.
- Emerging topics — The actor saves hashtag frequency per run. On subsequent runs, it compares current hashtag counts against the previous run and flags emerging topics with growth percentages (e.g.,
"xau": +240%). Available in the KV summary underemergingTopics. - Query scoring — For expanded or OR queries, the KV summary includes
queryScoring— a breakdown of which query terms actually matched posts and how many hits each got. Terms with 0 hits are logged as warnings.
These features work automatically with no extra configuration. Run the same query twice and the second run is smarter.
Incremental monitoring (only new results)
Enable onlyNew: true to turn Bluesky Social Search into a true monitoring tool. On each run, the actor saves a timestamp. On the next run, it only returns results newer than that timestamp — so you never see the same post twice.
How to set up daily brand monitoring:
- Set
searchTypeto"posts", enter your brand name, setsortByto"latest" - Enable
onlyNew - Schedule the actor to run daily or hourly via Apify Scheduler
- Connect output to Slack, email, or Google Sheets via integrations
Each run only returns new mentions, so your alerts stay clean and actionable.
Analytics (KV store)
Every run saves rich analytics to the KV store SUMMARY key — no extra cost, no extra setup. The analytics are computed from your results automatically.
Post analytics include:
- Top 5 posts by engagement score (with text preview, handle, score, URL)
- Top 10 authors by total engagement across all their posts in the result set
- Top 10 authors by efficiency (highest average engagement per post, minimum 2 posts)
- Top 10 hashtags by frequency
- Language breakdown (how many posts per language)
- Media breakdown (images vs video vs links)
- Content breakdown (original posts vs replies vs reposts)
- Engagement distribution (total, average, median)
- Viral post count
- Time series — posts and engagement bucketed by hour
- Sentiment breakdown — bullish/bearish/neutral counts, net sentiment, overall bias
- Engagement velocity — last hour vs average, momentum status (accelerating/steady/decelerating)
- Signal confidence (0-1) — composite signal reliability metric
- Spike detection — hours with 2x+ average volume flagged automatically
- Ticker intelligence — per-ticker mentions, engagement, sentiment breakdown (top 20)
- Market alerts — triggered conditions (spikes, mention thresholds, ticker spikes, sentiment bias)
- Query scoring — per-term hit counts for OR queries (shows which terms worked)
- Emerging topics — hashtags growing vs previous run (cross-run intelligence)
Profile analytics include:
- Top 10 profiles by follower count
- Top 10 profiles by influence score (most active relative to audience)
- Total followers and posts across all profiles
- Average followers per profile
Access analytics via the Apify API: GET /v2/key-value-stores/{storeId}/records/SUMMARY
Use cases
Brand monitoring on Bluesky
Track mentions of your company, product, or trademark. Schedule daily runs, sort by "latest", and pipe results into Slack or email for alerts. Key outputs: post text, author handle, engagement metrics, bsky.app URL.
Influencer discovery and research
Search profiles by niche keywords to find high-follower accounts. Export follower counts, then use author feed mode to analyze their content strategy and engagement patterns.
Competitive intelligence
Search posts for competitor brand names to monitor launches, campaigns, and public sentiment. Compare engagement patterns across competitors by running parallel searches.
Social graph analysis
Map influence networks by extracting followers and following lists for target handles. Cross-reference common connections to identify network clusters and community leaders.
Academic and discourse research
Export structured datasets with language codes, content labels, and thread depth for corpus analysis on decentralized social platforms.
Bluesky data for AI and LLM pipelines
Feed structured post data into LangChain, LlamaIndex, or custom NLP pipelines for sentiment classification, topic modeling, or content generation. The JSON output maps directly to common AI framework input formats.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
searchType | enum | No | "posts" | posts, profiles, feed, thread, followers, or following |
query | string | For posts/profiles | — | Search keyword. Also accepts post URL or AT URI for thread mode. |
handle | string | For feed/followers/following | — | Bluesky handle (e.g., jay.bsky.team). Omit the @. |
postUrl | string | For thread | — | Bluesky post URL or AT URI |
sortBy | enum | No | "top" | top (relevance) or latest (chronological). Post search only. |
maxResults | integer | No | 100 | No upper limit |
minLikes | integer | No | — | Only return posts with at least this many likes |
minFollowers | integer | No | — | Only return profiles with at least this many followers |
language | string | No | — | Only return posts in this language (2-letter code, e.g., "en") |
preset | enum | No | — | One-click search preset: crypto-pulse, ai-research, tech-news, market-sentiment, climate-watch, viral-today. Overrides query and filters. |
expandQuery | boolean | No | false | Expand short queries with synonyms (e.g., btc → bitcoin OR btc OR $btc) |
alertSpikeMultiplier | number | No | — | Trigger spike alert when hourly volume exceeds this multiplier of average |
alertMinMentions | integer | No | — | Trigger alert when total mentions reach this threshold |
onlyNew | boolean | No | false | Only return results newer than your last run (incremental monitoring) |
Input examples
Post search:
{
"searchType": "posts",
"query": "artificial intelligence",
"sortBy": "latest",
"maxResults": 200
}
Author feed:
{
"searchType": "feed",
"handle": "jay.bsky.team",
"maxResults": 500
}
Thread extraction:
{
"searchType": "thread",
"postUrl": "https://bsky.app/profile/bsky.app/post/3lbfm4g7hsc2c",
"maxResults": 100
}
Follower export:
{
"searchType": "followers",
"handle": "bsky.app",
"maxResults": 1000
}
Brand monitoring (incremental, English only, 50+ likes):
{
"searchType": "posts",
"query": "openai",
"sortBy": "latest",
"maxResults": 500,
"minLikes": 50,
"language": "en",
"onlyNew": true
}
Output example
Post 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.",
"createdAt": "2024-11-20T18:30:00.000Z",
"language": "en",
"hashtags": ["bluesky", "decentralization"],
"mentions": [],
"likeCount": 48520,
"repostCount": 12340,
"replyCount": 3150,
"quoteCount": 1890,
"engagementScore": 82690,
"weightedEngagement": 504415.1,
"sentimentScore": 0,
"sentimentLabel": "neutral",
"isViral": true,
"isReply": false,
"parentPostUri": null,
"hasImages": false,
"hasVideo": false,
"hasLink": true,
"embedUrl": "https://bsky.social/about/blog/11-20-2024-20-million",
"embedTitle": "Bluesky Reaches 20 Million Users",
"isRepost": false,
"tickers": [],
"labels": [],
"blueskyUrl": "https://bsky.app/profile/bsky.app/post/3lbfm4g7hsc2c"
}
Profile result:
{
"type": "profile",
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"displayName": "Bluesky",
"description": "Official account for Bluesky Social. Building a social internet.",
"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,
"influenceScore": 0.001,
"labels": [],
"createdAt": "2023-04-12T00:00:00.000Z",
"blueskyUrl": "https://bsky.app/profile/bsky.app"
}
Output fields
Post fields:
| Field | Type | Description |
|---|---|---|
type | string | Always "post" |
uri | string | AT Protocol URI |
cid | string | Content identifier hash |
author.did | string | Author's DID (permanent identifier) |
author.handle | string | Author's handle (e.g., alice.bsky.social) |
author.displayName | string | Display name |
author.avatar | string/null | Avatar URL |
text | string | Post text |
createdAt | string | ISO 8601 timestamp |
language | string/null | Language code. Null if not set by author. |
hashtags | string[] | From AT Protocol facets. Empty if none. |
mentions | string[] | Mentioned DIDs from facets. Empty if none. |
likeCount | number | Likes |
repostCount | number | Reposts |
replyCount | number | Replies |
quoteCount | number | Quote posts |
engagementScore | number | Weighted engagement: likes + (reposts x 2) + (replies x 3) + (quotes x 4) |
weightedEngagement | number | Engagement weighted by author authority: engagementScore * log10(followers + 1). Filters spam, boosts real signal. |
sentimentScore | number | Heuristic sentiment: positive = bullish, negative = bearish, 0 = neutral |
sentimentLabel | string | "bullish", "bearish", or "neutral" |
isViral | boolean | Whether engagement score reached 500+ |
isReply | boolean | Whether this is a reply |
parentPostUri | string/null | Parent post URI if reply |
hasImages | boolean | Contains image attachments |
hasVideo | boolean | Contains video |
hasLink | boolean | Contains external link embed |
embedUrl | string/null | External link URL |
embedTitle | string/null | External link title |
isRepost | boolean | Whether this is a repost (feed mode) |
tickers | string[] | Cashtags extracted from text (e.g., $BTC, $TSLA). Empty if none. |
labels | string[] | Content moderation labels |
threadDepth | number | Thread position (thread mode only): negative = parent, 0 = root, positive = reply |
blueskyUrl | string | Direct bsky.app URL |
Profile fields:
| Field | Type | Description |
|---|---|---|
type | string | Always "profile" |
did | string | DID (permanent identifier) |
handle | string | Bluesky handle |
displayName | string | Display name |
description | string/null | Bio text |
avatar | string/null | Avatar URL |
banner | string/null | Banner URL |
followersCount | number | Followers |
followsCount | number | Following |
postsCount | number | Total posts |
influenceScore | number/null | Posts-per-follower ratio. High = active creator, low = passive account. |
labels | string[] | Content moderation labels |
createdAt | string/null | Account creation timestamp |
blueskyUrl | string | Direct bsky.app URL |
Pricing
$0.001 per result returned. Pay-per-event — you only pay for data delivered. ~$1 to generate a full market signal from 1,000 posts.
| Results | Cost |
|---|---|
| 100 | $0.10 |
| 500 | $0.50 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 50,000 | $50.00 |
Scheduled runs compound — 10,000 results/day = ~$300/month. Set a spending limit on your Apify account to cap costs.
The actor stops returning results when the limit is reached and shows your total PPE charges in the final status message. Apify's free tier includes $5/month in platform credits.
Typical performance
| Metric | Typical value | Notes |
|---|---|---|
| 100 results | ~5 seconds | Single API page, based on internal testing April 2026 |
| 500 results | ~20 seconds | Varies with API response times |
| 1,000 results | ~30 seconds | Adaptive rate limiting with automatic backoff |
| 10,000 results | ~5 minutes | Increase timeout for large exports |
| Memory | 256 MB | Pure API, no browser rendering |
API usage
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/bluesky-social-search").call(run_input={
"searchType": "posts",
"query": "artificial intelligence",
"sortBy": "latest",
"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("ryanclinton/bluesky-social-search").call({
searchType: "posts",
query: "artificial intelligence",
sortBy: "latest",
maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
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/ryanclinton~bluesky-social-search/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchType":"posts","query":"artificial intelligence","sortBy":"latest","maxResults":100}'
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How it works
Each search type maps to a specific AT Protocol XRPC endpoint:
| Mode | Endpoint |
|---|---|
| Posts | app.bsky.feed.searchPosts |
| Profiles | app.bsky.actor.searchActors |
| Author feed | app.bsky.feed.getAuthorFeed |
| Thread | app.bsky.feed.getPostThread |
| Followers | app.bsky.graph.getFollowers |
| Following | app.bsky.graph.getFollows |
The actor handles cursor-based pagination (up to 100 results per page) with adaptive pacing and automatic retry with exponential backoff on HTTP 429 and 5xx errors (up to 3 attempts). If the API returns repeated failures, pagination stops gracefully and returns the results collected so far — your data is never lost. Raw responses are normalized into consistent schemas — facets are parsed for hashtags and mentions, 4 embed types are detected, and feed items are checked for repost flags.
In thread mode, the actor requests parentHeight: 10 and walks the parent chain recursively (negative depth values), then walks replies (positive depth values). The root post is threadDepth: 0.
Limitations
- Search window depth — AT Protocol search endpoints have a practical index depth. Very old posts may not be reachable via search. For ongoing collection, schedule recurring runs.
- No native date-range filtering — The Bluesky search API does not accept date parameters. Filter the
createdAtfield after export. - No native language filtering — Results may include any language matching the query text. Filter using the
languageoutput field. - Public content only — Unauthenticated endpoints. Private accounts and blocked content are not accessible.
- Rate limiting — Adaptive pacing with automatic backoff on 429 responses. ~1,000 results per 20 seconds under normal conditions.
- Embed scope — Detects images, video, external links, and recordWithMedia. Feed generator and list embeds are not flagged.
- Handle changes — Constructed bsky.app URLs use the handle at search time and may break if the user changes their handle. The
didfield is permanent. - Thread depth — Up to 10 parent levels and reply depth limited by
maxResults.
Integrations
- Zapier — Send Bluesky alerts to Slack, email, or Sheets
- Make — Multi-step workflows routing results to CRMs
- Google Sheets — Auto-sync results to shared spreadsheets
- Apify API — Trigger from Python, JavaScript, or any HTTP client
- Webhooks — Receive results via HTTP POST
- LangChain / LlamaIndex — Feed data into LLM pipelines
Combine with other actors
| Actor | Combination |
|---|---|
| Website Contact Scraper | Extract emails from websites linked in Bluesky post embeds |
| Company Deep Research | Research companies mentioned in Bluesky posts |
| Trustpilot Review Analyzer | Cross-reference Bluesky brand mentions with review sentiment |
FAQ
How is this different from scraping the Bluesky website? This actor queries the official AT Protocol XRPC API — the same data layer that powers the Bluesky app. Structured output from the source, no HTML parsing, no browser overhead, no breakage when the UI changes.
Can I search Bluesky posts by date range?
Not natively. Use "latest" sort and filter createdAt after export. For ongoing date-bounded collection, schedule daily runs.
What is the AT Protocol? The Authenticated Transfer Protocol is the open, decentralized protocol powering Bluesky. It defines how user identities (DIDs), posts, and social interactions work across federated servers. This actor queries its XRPC API layer.
Can I use this for sentiment analysis?
Yes. Every post includes built-in heuristic sentiment scoring (sentimentScore and sentimentLabel: bullish/bearish/neutral) optimized for market and opinion language. The KV summary aggregates sentiment across all results with a net bias and confidence score. For deeper semantic analysis, the structured output also integrates with LLM pipelines like LangChain.
What are DIDs and why do they matter? DIDs (Decentralized Identifiers) are permanent cryptographic account identifiers. Unlike handles, a DID never changes. Both are included in output so you can track accounts across handle changes.
Does it detect reposts?
Yes. In author feed mode, the isRepost field flags reshared content vs original posts.
Is it legal to extract Bluesky data? This actor accesses publicly available data through AT Protocol's public API endpoints. Legality depends on jurisdiction, use case, and compliance with Bluesky's Terms of Service and data protection laws. Consult legal counsel for your situation.
What happens if a user changes their handle?
The blueskyUrl uses the handle at search time and may redirect or break. The did field is permanent and can always resolve the current handle.
Tips
- Use
"latest"sort for monitoring — catches new posts as they appear."top"is better for discovering high-engagement content. - Start with 25–50 results — test your query before scaling to hundreds.
- Omit the
@from handles — usejay.bsky.team, not@jay.bsky.team. - Combine post search with author feed — find interesting authors from post results, then analyze their full posting history.
- Cross-reference followers and following — run both exports to identify mutual connections and network clusters.
- Filter by language after export — use the
languageoutput field in your spreadsheet or pipeline.
Troubleshooting
"Query is required" error — You selected posts or profiles mode but left the query empty.
"Handle is required" error — You selected feed, followers, or following mode but left the handle empty.
Zero results — Query may be too specific, account may have no public posts, or handle may be misspelled. Verify on bsky.app.
Timeout — Large result sets (5,000+) may exceed the default timeout. Increase the timeout in run configuration for big exports.
Spending limit reached — Your Apify spending limit was hit. Increase it in account settings or reduce maxResults.
Responsible use
Bluesky Social Search accesses publicly available data via the AT Protocol API. It does not bypass authentication, CAPTCHAs, or access restricted content. Users must comply with applicable laws, Bluesky's Terms of Service, and data protection regulations (GDPR, CCPA). Do not use extracted data for spam, harassment, or unauthorized advertising.
Support
Found a bug or have a feature request? Open an issue in the Issues tab. For custom solutions, reach out through the Apify platform.
Ready to try Bluesky Social Search — Monitor, Sentiment, Trends & Alerts?
Start for free on Apify. No credit card required.
Open on Apify Store