Bluesky Posts, Profiles & Followers Scraper avatar

Bluesky Posts, Profiles & Followers Scraper

Pricing

from $0.50 / 1,000 post scrapeds

Go to Apify Store
Bluesky Posts, Profiles & Followers Scraper

Bluesky Posts, Profiles & Followers Scraper

Search Bluesky posts by keyword or hashtag, scrape profiles with follower and post counts, author feeds, follower and following lists from the public AT Protocol API. Flat JSON/CSV, no login or proxies. Pay per post ($0.0005) or profile ($0.002).

Pricing

from $0.50 / 1,000 post scrapeds

Rating

0.0

(0)

Developer

Owlabee

Owlabee

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

What it does

This Actor pulls public data out of Bluesky through the official, unauthenticated AT Protocol API (the public.api.bsky.app AppView, with its origin api.bsky.app as fallback for post search) and writes it as flat, analysis-ready records: posts matching keywords or hashtags, full profiles with follower / following / post counts, the posts of specific accounts, and complete follower and following lists. Every record is normalized the same way regardless of mode, so you can drop the dataset straight into a spreadsheet, a BI tool, a CRM or an LLM pipeline. Apify gives you the results as JSON, CSV, Excel, an API endpoint, webhooks, or through the Apify MCP server for AI agents, at no extra cost.

It is built for brand and reputation monitoring, social listening, competitor and influencer research, audience analysis, and journalists or researchers who need Bluesky data without writing AT Protocol code. Turn on Only new since last run and schedule the Actor, and it becomes a monitor that emits only posts, followers or profile changes that appeared since the previous run and can POST them to your webhook.

No login, no API key, no proxies, no browser: it talks to the same public endpoints the Bluesky app uses, politely rate-limited.

How to use

  1. Pick a Mode and enter your Queries, one per line: keywords or hashtags for searchPosts / searchActors, handles (bsky.app), DIDs or profile URLs for profiles, authorFeed, followers and following.
  2. Optionally set Max results, Sort and Since (for post modes), and a Webhook URL. For scheduled monitoring enable Only new since last run.
  3. Click Start. Records appear in the dataset as they are found; download them or connect via API, integrations or MCP.

Input

FieldTypeRequiredDescription
modestringyesauthorFeed (default), profiles, followers, following, searchActors or searchPosts
queriesstring[]yesKeywords / hashtags, or handles / DIDs / profile URLs depending on mode
maxResultsintegernoUpper bound on dataset items across all queries (default 200); searchPosts additionally stops at 100 posts per query, see Limits
sortstringnolatest (default) or top; searchPosts only
sincestringnoISO date or datetime; only posts created on or after it (searchPosts, authorFeed)
onlyNewSinceLastRunbooleannoEmit only records not seen by previous runs (default false)
stateStoreNamestringnoNamed key-value store for the monitor memory (default bluesky-monitor-state)
webhookUrlstringnoPOST target for the run summary and up to 100 records

Output example

Post record (searchPosts, authorFeed):

{
"type": "post",
"query": "apify",
"uri": "at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3l6oveex3ii2l",
"cid": "bafyreihqbw4xqgzvrjj7mcjf4wq6zq4b5j6m3i3f6zkr3vfyhdgq4i2z3q",
"rkey": "3l6oveex3ii2l",
"authorHandle": "bsky.app",
"authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur",
"authorDisplayName": "Bluesky",
"authorAvatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihagr2c...@jpeg",
"text": "We shipped a new Apify integration today! Try the open API: https://docs.bsky.app",
"createdAt": "2026-10-15T18:02:11.482Z",
"indexedAt": "2026-10-15T18:02:12.000Z",
"likeCount": 310,
"repostCount": 40,
"replyCount": 12,
"quoteCount": 5,
"langs": ["en"],
"hasImages": true,
"hasVideo": false,
"embedUrls": ["https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreia@jpeg"],
"externalUrl": null,
"quotedPostUri": null,
"quotedPostUrl": null,
"isReply": false,
"replyParentUri": null,
"replyRootUri": null,
"isRepost": false,
"repostedByHandle": null,
"repostedByDid": null,
"labels": [],
"postUrl": "https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l",
"fetchedAt": "2026-10-16T12:40:32.064Z"
}

Profile record (profiles, searchActors):

{
"type": "profile",
"query": "bsky.app",
"did": "did:plc:z72i7hdynmk6r22z27h6tvur",
"handle": "bsky.app",
"displayName": "Bluesky",
"description": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: support@bsky.app",
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreihagr2c...@jpeg",
"banner": "https://cdn.bsky.app/img/banner/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreichzyov...@jpeg",
"followersCount": 15123456,
"followsCount": 20,
"postsCount": 1234,
"createdAt": "2023-04-12T04:53:57.057Z",
"indexedAt": "2026-10-01T00:00:00.000Z",
"labels": [],
"profileUrl": "https://bsky.app/profile/bsky.app",
"fetchedAt": "2026-10-16T12:41:04.001Z"
}

Follower records (followers, following) have type follower or following, subjectHandle / subjectDid (the account you asked about), and the follower's did, handle, displayName, description, avatar, createdAt, profileUrl. Bluesky's follower lists do not include per-follower counts; run the profiles mode on the handles you care about to enrich them.

Error items look like { "type": "error", "query": "...", "mode": "profiles", "error": "PROFILE_NOT_FOUND", "errorMessage": "..." } (INVALID_HANDLE, PROFILE_NOT_FOUND, SEARCH_FORBIDDEN, RATE_LIMITED, FETCH_FAILED) and are charged at the same rate as a successful record, because the work to discover the problem was done.

Pricing

Pay per event. You only pay for the records the Actor produces; set a maximum cost per run in the run options to cap spend.

EventPriceCharged in
Post scraped$0.0005searchPosts, authorFeed
Profile scraped$0.002profiles, searchActors
Follower scraped$0.0005followers, following
Actor start$0.00005Apify platform event, every run

Examples: 1,000 posts ≈ $0.50; 1,000 full profiles ≈ $2.00; 10,000 followers ≈ $5.00. Error items cost the same as the record they stand in for. With Only new since last run, the first (baseline) run charges for every record it emits; later runs charge only for new records, so a quiet keyword costs you nothing but the Actor start fee.

Limits and fair use

  • Requests are rate-limited to about 2 per second against the public Bluesky AppView, with exponential backoff on 429 / 5xx. One request returns up to 100 posts or followers (25 profiles), so 10,000 followers take roughly one minute.
  • searchPosts is backed by Bluesky's search index; very broad terms are capped by the index itself and top ordering is Bluesky's relevance ranking. Use since and latest for exhaustive recent coverage.
  • Post search is capped at 100 posts per query from datacenter networks. The CDN in front of public.api.bsky.app answers app.bsky.feed.searchPosts with an HTML 403 page from datacenter networks (Apify's included) while every other method is served normally. The Actor recognizes that page and retries the call on the AppView origin api.bsky.app, the same unauthenticated service that Bluesky documents alongside the public host. The origin serves the first page of results (up to 100 posts per query, newest first with latest, best first with top) but refuses cursor pagination without a login, so each query stops there; with since, narrower keywords, several queries, or Only new since last run on a schedule you keep up with the newest matches. Only if both hosts refuse does the run continue with one SEARCH_FORBIDDEN error item per query (charged as one post) instead of failing. The default and daily-test mode is authorFeed.
  • Only public data is accessed: posts and profiles whose authors opted out of logged-out visibility (!no-unauthenticated label) may be partially or entirely absent, exactly as on the public web.
  • Memory: 256 MB is plenty; the default 1024 MB cap is never needed.
  • Monitor memory keeps the most recent 10,000 record keys per query in your state store; delete that store (or change stateStoreName) to reset the baseline.

Other pay-per-event Actors from the same account, all limited-permission and agent-friendly:

FAQ

Does this need proxies, a login or an API key? No. It uses Bluesky's public, unauthenticated XRPC endpoints over plain HTTPS from Apify's standard datacenter infrastructure.

How is cost controlled? Set maxResults and the run's maximum total charge. Each record is charged the moment it is saved, and the Actor stops cleanly when either limit is reached; nothing is charged in bulk at the end.

How does "Only new since last run" work? The Actor keeps, per mode and query, the keys of records it already emitted in the named key-value store stateStoreName. On the next run it pages newest-first, emits only unseen posts / followers / changed profiles, and stops as soon as it reaches already-known records. Profiles are re-emitted only when the handle, name, bio, avatar or any count changed (changedFields tells you what).

Can I search hashtags or exact phrases? Yes: #opensource, "exact phrase", and Bluesky's search operators such as from:handle, lang:en or domain:example.com are passed through to the search index. Each query returns at most its first 100 matches per run (see Limits), so split broad topics into several queries or narrow them with since and operators.

Can I run it on a schedule or call it from an AI agent? Yes. Use Apify Schedules with a webhook, the REST API, or the Apify MCP server. Example prompts: "Find the 50 latest Bluesky posts mentioning our brand since yesterday", "Get follower counts for these 20 Bluesky handles", "List everyone who started following @ourcompany since the last check."

What happens on errors? Bad handles, unknown profiles, a blocked search endpoint (SEARCH_FORBIDDEN) or temporary API failures produce error items with a clear code instead of failing the whole run; genuinely unusable input (empty queries, invalid since) fails fast before any paid work.

The Actor reads only data that Bluesky publishes through its public API; respect Bluesky's terms, the AT Protocol community guidelines and applicable privacy law (GDPR, CCPA) when storing or processing personal data such as handles, names and bios. This Actor is not a consumer reporting agency and its output must not be used for employment, credit, insurance, housing or tenant screening decisions.