Bluesky Scraper — Profiles, User Feeds & User Search
Pricing
from $2.00 / 1,000 item scrapeds
Bluesky Scraper — Profiles, User Feeds & User Search
Export public Bluesky API profiles, user search results and account feeds including reposts to JSON or CSV. Get source IDs, bios or post text, links, available counters and image URLs. No login. No keyword post search or video downloads.
Pricing
from $2.00 / 1,000 item scrapeds
Rating
0.0
(0)
Developer
Tugelbay Konabayev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
11 days ago
Last modified
Categories
Share
Bluesky Scraper uses the public Bluesky API to export profile snapshots, user search results and posts appearing in specified account feeds, including reposts. Each run produces an Apify dataset you can export as JSON or CSV. Choose one mode per run: profiles, account feeds or user discovery. No login is required.
Keyword post search (searchPosts) is unavailable in this release. Existing
tasks using that mode must be changed explicitly; they will receive an error
before any source request rather than a substituted result.
Extract public profile snapshots, author feeds and user discovery results using AT Protocol HTTP APIs. No browser or proxy is used for these public modes. The Actor does not provide follower lists, historical profile changes, sentiment analysis or a completeness guarantee for the whole network.
Why use this Actor?
Use this Actor for public profile enrichment, collecting posts from chosen account feeds, or finding accounts by name or handle. It handles bounded pagination, deduplication and export. Each run is a snapshot; the Actor does not track changes, maintain a history or continuously listen for new posts.
Data fields and modes
| Mode | Required input | One output row | What to expect |
|---|---|---|---|
getProfiles | handles | One profile per returned unique DID | Handle, biography, profile links and available profile counters. No follower list. |
getUserFeed | handles | One post per returned unique post URI | Posts appearing in those account feeds, including reposts. The output author is the original post author, which may differ from the requested handle. |
searchUsers | query | One profile per returned unique DID | Accounts found by the public user-search endpoint. It does not search post text or automatically fetch full profile details. |
User-search results can be less detailed than profile lookup. In the verified
sample, followersCount, followsCount, postsCount and banner were null for
all three search results. For available profile counters, pass the returned
handles to a separate getProfiles run; those stored profiles are separate
chargeable results.
Missing required inputs and unknown modes fail before source requests. They are never replaced with an unrelated successful demo. A completely empty object uses the documented small default: getProfiles for jay.bsky.team.
How to use
- Choose one of the three modes below.
- Enter handles for profiles/feeds, or a query for user search; set maxItems.
- Run the Actor, inspect Results, then export JSON or CSV.
Examples
Public profiles:
{"mode":"getProfiles","handles":["jay.bsky.team","bsky.app"],"maxItems":2}
Public author feed:
{"mode":"getUserFeed","handles":["bsky.app"],"maxItems":10,"feedFilter":"posts_no_replies"}
Public user discovery:
{"mode":"searchUsers","query":"science","maxItems":10}
No account credentials are needed or sent to Bluesky. This Actor does not perform keyword post search, full-network streaming or historical replay.
Input and limits
maxItems: integer 1–10000; maximum unique stored rows for the whole run, not a minimum or a per-handle allocation. Handles are processed in input order; an earlier feed can fill the limit before later handles are requested.handles: list of handles or DIDs. Duplicate input handles are removed.query: required nonempty name or handle forsearchUsers.feedFilter: source filter for getUserFeed: posts_and_author_threads, posts_no_replies or posts_with_media. It does not exclude all reposts or download media files; the source decides which feed records match.- Free and paid accounts use the same runtime paths. The run's Apify spending, memory and timeout limits still apply.
Repeated post URIs or profile DIDs are stored only once across the run. Pagination stops with a clear error on non-advancing cursors or its finite page budget. Results can be fewer than requested because of source exhaustion, deduplication or spending limits. A valid empty source result can produce a successful zero-row run. A spending limit permitting no rows stops before requesting the source. A source HTTP403, HTTP429, authentication error or network error is a failure, not a successful empty dataset; no source refusal is retried. Already delivered records from earlier handles remain in the dataset if a later handle fails.
Output: exactly what is in the dataset
A profile row has 16 keys and a post row has 24 keys in this version. They are
separate shapes: profile rows do not contain post fields, and post rows do not
contain profile counters. The output is flat JSON except for the imageUrls
and labels arrays. CSV column selection may leave fields blank for the other
record type; use JSON when preserving types, nulls and arrays matters.
The default Results table shows recordType, name, content, url and
createdAt. For profiles this means profile name, biography, profile URL and
account creation date. For posts it means original author's name, post text,
post URL and post creation date. The Posts and Profiles views are alternate
column sets, not additional extraction modes or separate datasets. Choose the
view matching your run; the wrong view can show empty columns.
Profile fields: getProfiles and searchUsers
| Fields | Meaning and missing-value behavior |
|---|---|
recordType | Always profile for both modes. |
did, handle | Source account identifiers. Duplicate DIDs are stored once. |
displayName, description | Source display name and biography; null if absent. |
name, content | Display name with handle fallback; biography copied from description. |
url, profileUrl | Public profile link, constructed from the handle. |
avatar, banner | Source image URLs, not downloaded files; null if absent. |
followersCount, followsCount, postsCount | Source counts when supplied. Missing counts are null, never inferred or substituted with zero. User search may omit them. |
createdAt, indexedAt | Source account-creation and indexing timestamps; null if absent. Neither is an Actor collection timestamp. |
Post fields: getUserFeed
| Fields | Meaning and missing-value behavior |
|---|---|
recordType | Always post, including a post encountered as a repost. No feed row type. |
uri, cid | Source post URI and content identifier. Duplicate URIs are stored once. |
text, content | Same source post text. If absent, the parser returns an empty string. |
authorDid, authorHandle, authorDisplayName, authorAvatar | Original author's source details; optional fields can be null. The requested feed owner and repost event are not separate output fields. |
name | Original author's display name, falling back to their handle. |
url, postUrl | Public URL of the original post, constructed from the handle and post URI. |
createdAt | Original post timestamp, not repost time or extraction time. |
likeCount, replyCount, repostCount, quoteCount | Source engagement counters at retrieval; null when absent. No engagement history or list of reacting users. |
language | First source language code only; null when absent. Not inferred from text. |
hasImages, imageUrls | True when the parser finds image-embed URLs. Thumbnail URLs are preferred, with full-size URLs as fallback; otherwise false and null. No image files are downloaded. |
embedUrl, embedTitle, embedDescription | External-card fields when available; for supported quotes, embedUrl may instead be an at:// record URI. No full quoted-post object is returned. |
labels | List of source label values; an empty list means no values were returned, not a safety assessment. |
Video URLs/files, image alt text, every linked URL in post text, reply threads,
repost attribution/time and full quoted-post details are not extracted. A post
selected by the source's media filter can therefore have hasImages: false
when its media is video or another unsupported embed.
Real output examples
The following are complete single rows from the three verified candidate runs
on 2026-09-15, not invented example values or current-counter promises. Source
text, URLs and counters can change. A dataset export contains an array of rows.
The feed example was returned for bsky.app but has a different original author;
this is why an account feed must not be described as authored posts only.
getProfiles: bsky.app profile
{"recordType": "profile","name": "Bluesky","content": "official Bluesky account (check username👆)\n\nBugs, feature requests, feedback: support@bsky.app","url": "https://bsky.app/profile/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/bafkreihwihm6kpd6zuwhhlro75p5qks5qtrcu55jp3gddbfjsieiv7wuka","banner": "https://cdn.bsky.app/img/banner/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreichzyovokfzmymz36p5jibbjrhsur6n7hjnzxrpbt5jaydp2szvna","followersCount": 34905872,"followsCount": 15,"postsCount": 863,"createdAt": "2023-04-12T04:53:57.057Z","profileUrl": "https://bsky.app/profile/bsky.app","indexedAt": "2025-10-27T21:05:26.152Z"}
getUserFeed: a post returned in the bsky.app feed
{"recordType": "post","name": "The A.V. Club","content": "Less than 4 hours until the #Emmys kick off! You can keep up with all the commentary, winners, joy—and, let's face it, disappointment—via our Emmys Watch feed right here on @bsky.app. Pin it now so you don't miss a thing!\n\nbsky.app/profile/avcl...","url": "https://bsky.app/profile/avclub.com/post/3mviutosqmk2t","uri": "at://did:plc:kwxpje5qog6wwndagwbssatp/app.bsky.feed.post/3mviutosqmk2t","cid": "bafyreigyzxfb3tynf6hus4cshhzcrwr7sht4vfp2l5phbbfephvn7bcd7a","text": "Less than 4 hours until the #Emmys kick off! You can keep up with all the commentary, winners, joy—and, let's face it, disappointment—via our Emmys Watch feed right here on @bsky.app. Pin it now so you don't miss a thing!\n\nbsky.app/profile/avcl...","createdAt": "2026-09-14T19:47:12.655Z","authorHandle": "avclub.com","authorDisplayName": "The A.V. Club","authorDid": "did:plc:kwxpje5qog6wwndagwbssatp","authorAvatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:kwxpje5qog6wwndagwbssatp/bafkreietpdfkwurg74xbzzu3inipcco5635adp4o2ew7bioiahgmqutvbi","likeCount": 327,"replyCount": 23,"repostCount": 27,"quoteCount": 3,"language": "en","hasImages": true,"imageUrls": ["https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:kwxpje5qog6wwndagwbssatp/bafkreicwxzp6lnqvuetiytyeanq3wynihsneq4qqdvv7bzhkrmw4nv36oy"],"embedUrl": null,"embedTitle": null,"embedDescription": null,"labels": [],"postUrl": "https://bsky.app/profile/avclub.com/post/3mviutosqmk2t"}
searchUsers: one result for science
{"recordType": "profile","name": "Science Friday","content": "Entertaining & educational conversations about science, tech, + more. Hosted by Ira Flatow and Flora Lichtman. From WNYCStudios.","url": "https://bsky.app/profile/scifri.bsky.social","did": "did:plc:rjtifgmgwnacwa24lqp4tpsy","handle": "scifri.bsky.social","displayName": "Science Friday","description": "Entertaining & educational conversations about science, tech, + more. Hosted by Ira Flatow and Flora Lichtman. From WNYCStudios.","avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:rjtifgmgwnacwa24lqp4tpsy/bafkreibgimqm3y3yxf4lbwscyg3opr2rcnp3qh4ulnubwlv73suqmwimoi","banner": null,"followersCount": null,"followsCount": null,"postsCount": null,"createdAt": "2023-06-28T20:01:41.209Z","profileUrl": "https://bsky.app/profile/scifri.bsky.social","indexedAt": "2025-11-05T17:01:53.652Z"}
Pricing and operating cost
Prices verified on 2026-09-15: $0.003 per stored result on Free, $0.0027 on Bronze, $0.0024 on Silver, and $0.002 on Gold/Platinum/Diamond. For example, 1,000 results cost $3 in result charges on Free. Read the Store pricing panel for the current rate and Apify platform usage details before a large run. There is no Actor-start event. The existing dataset-item event charges for stored results once; a failed run can still contain chargeable earlier results. Source requests use the public API without a paid proxy or an external LLM.
Comparison with the direct Bluesky API
| Need | This Actor | Direct public API |
|---|---|---|
| Profiles, author feeds, user discovery | Three input modes and one export workflow | Call the corresponding public endpoints |
| Pagination and export | Bounded pagination; Apify dataset JSON/CSV export | Implement pagination and storage yourself |
| Cost | Pay per stored result plus applicable platform usage | Public endpoint access; maintain your own integration |
| Keyword post search or full-network archive | Not supported | Separate access and implementation must be qualified |
Validation evidence
On 2026-09-15, candidate 1.1.6 passed all three bounded cloud controls: two profiles, five author-feed posts and three user-search results. All 10 records passed the output schema. Source comparison classified 200 field positions with zero unexplained mismatches; two counters had changed between retrievals. CSV preserved all 10 rows and the four overview fields. These are owner test results, not a customer success-rate or completeness claim.
Limitations and responsible use
Profiles and counters are current snapshots; feeds contain the records the source returns at request time, including reposts when present. They are not a complete historical archive. User discovery does not guarantee every matching account or supply counters absent from the source. Automated checks cover input validation, delivery limits, unknown counters, bounded pagination and explicit upstream failures. No universal availability or commercial success rate is promised.
Profile indexedAt records the source index timestamp when supplied; createdAt
is the source creation time, not a guarantee of when the Actor last checked it.
Retain source URLs and attribution, and use public data in accordance with
Bluesky terms and applicable law. This Actor is independent of Bluesky.
Official references: API routing and public profile endpoint example.
FAQ
Do I need a Bluesky login?
No. All three supported modes use public endpoints and accept no credentials.
Can I search posts by keyword?
No. Use searchUsers to discover accounts, or getUserFeed for specified handles. Existing searchPosts tasks receive an explicit error.
Why are some counters null or fewer results returned?
Null means the source omitted a field. Fewer rows can mean the source was exhausted; an HTTP failure is reported as a failure rather than an empty success.
Support
Open an issue on this Actor with the run URL, expected behavior and a minimal input example. Do not include passwords or access tokens.