Bluesky Scraper — Profiles, User Feeds & User Search avatar

Bluesky Scraper — Profiles, User Feeds & User Search

Pricing

from $2.00 / 1,000 item scrapeds

Go to Apify Store
Bluesky Scraper — Profiles, User Feeds & User Search

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

Tugelbay Konabayev

Maintained by Community

Actor 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

ModeRequired inputOne output rowWhat to expect
getProfileshandlesOne profile per returned unique DIDHandle, biography, profile links and available profile counters. No follower list.
getUserFeedhandlesOne post per returned unique post URIPosts appearing in those account feeds, including reposts. The output author is the original post author, which may differ from the requested handle.
searchUsersqueryOne profile per returned unique DIDAccounts 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

  1. Choose one of the three modes below.
  2. Enter handles for profiles/feeds, or a query for user search; set maxItems.
  3. 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 for searchUsers.
  • 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

FieldsMeaning and missing-value behavior
recordTypeAlways profile for both modes.
did, handleSource account identifiers. Duplicate DIDs are stored once.
displayName, descriptionSource display name and biography; null if absent.
name, contentDisplay name with handle fallback; biography copied from description.
url, profileUrlPublic profile link, constructed from the handle.
avatar, bannerSource image URLs, not downloaded files; null if absent.
followersCount, followsCount, postsCountSource counts when supplied. Missing counts are null, never inferred or substituted with zero. User search may omit them.
createdAt, indexedAtSource account-creation and indexing timestamps; null if absent. Neither is an Actor collection timestamp.

Post fields: getUserFeed

FieldsMeaning and missing-value behavior
recordTypeAlways post, including a post encountered as a repost. No feed row type.
uri, cidSource post URI and content identifier. Duplicate URIs are stored once.
text, contentSame source post text. If absent, the parser returns an empty string.
authorDid, authorHandle, authorDisplayName, authorAvatarOriginal author's source details; optional fields can be null. The requested feed owner and repost event are not separate output fields.
nameOriginal author's display name, falling back to their handle.
url, postUrlPublic URL of the original post, constructed from the handle and post URI.
createdAtOriginal post timestamp, not repost time or extraction time.
likeCount, replyCount, repostCount, quoteCountSource engagement counters at retrieval; null when absent. No engagement history or list of reacting users.
languageFirst source language code only; null when absent. Not inferred from text.
hasImages, imageUrlsTrue 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, embedDescriptionExternal-card fields when available; for supported quotes, embedUrl may instead be an at:// record URI. No full quoted-post object is returned.
labelsList 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

NeedThis ActorDirect public API
Profiles, author feeds, user discoveryThree input modes and one export workflowCall the corresponding public endpoints
Pagination and exportBounded pagination; Apify dataset JSON/CSV exportImplement pagination and storage yourself
CostPay per stored result plus applicable platform usagePublic endpoint access; maintain your own integration
Keyword post search or full-network archiveNot supportedSeparate 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.