Bluesky Scraper — Posts, Graphs & AT Protocol avatar

Bluesky Scraper — Posts, Graphs & AT Protocol

Pricing

from $1.00 / 1,000 profile results

Go to Apify Store
Bluesky Scraper — Posts, Graphs & AT Protocol

Bluesky Scraper — Posts, Graphs & AT Protocol

Scrape public Bluesky profiles, posts, threads, search, followers, likes, reposts, lists, feeds, trends, and AT Protocol repository records with stable DID and AT URI provenance.

Pricing

from $1.00 / 1,000 profile results

Rating

0.0

(0)

Developer

ScrapingMonkey

ScrapingMonkey

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

23 days ago

Last modified

Share

Bluesky Scraper - Profiles, Posts, Search, Followers and Feeds

Collect public Bluesky profiles, posts, threads, search results, interactions, social graph data, lists, feeds, trends, and AT Protocol repository records.

  • Extract profile identity, bio, verification data, audience counts, avatars, and banners
  • Collect author feeds, individual posts, complete threads, parents, replies, media, links, and engagement counts
  • Search public posts or accounts with available sorting, language, and date filters
  • Export likes, reposts, quotes, followers, follows, list members, and suggested accounts
  • Discover public lists, custom feeds, popular feeds, and current trend records
  • Read public AT Protocol repository collections directly from each actor's discovered PDS
  • No Bluesky account, app password, cookies, browser, or user-supplied proxy is required; requests use the built-in Apify Residential Proxy
  • Export results to JSON, CSV, Excel, XML, RSS, or access them through the Apify API

What can you do with this Actor?

Mode / actionInputOutputBest for
profilesHandles, DIDs, or profile URLsprofile rowsProfile metrics and creator research
authorFeedsHandles, DIDs, or profile URLsPaginated post rowsPublishing analysis and monitoring
postsAT URIs or public post URLsComplete post rowsBatch post enrichment
threadsAT URIs or public post URLsRoot, parent, and reply post rowsConversation and reply analysis
postInteractionsAT URIs or public post URLs plus interaction typesinteraction rowsLikes, reposts, and quote relationships
searchPostsSearch terms and optional filtersMatching post rowsTopic research and social listening
searchActorsSearch termsMatching profile rowsAccount discovery
followers / followsHandles, DIDs, or profile URLsConnected profile rowsPublic audience and network analysis
lists / listItemsActors or public list AT URIslist or member profile rowsCurated network research
actorFeeds / popularFeedsActors or no specific targetPublic feed rowsFeed discovery and cataloging
customFeedPublic feed-generator AT URIsFeed post rowsCustom-feed content analysis
trendsNo target beyond the selected modePublic trend rowsTopic and trend tracking
suggestedFollowsHandles, DIDs, or profile URLsSuggested profile rowsAccount discovery and graph expansion
repoRecordsActors and public AT Protocol collectionsrepoRecord rows from each actor's PDSProtocol research and public record export
autoMixed public profile and post URLsprofile or post rows selected from each URLBatch processing mixed known targets

Choose one mode per run. Multiple actors, posts, lists, feeds, or search terms can be processed in one run, and maxItems applies separately to each input target or collection.

Quick start

  1. Open the Actor and click Try for free.
  2. Keep Author Feeds selected or choose another public Bluesky workflow.
  3. Enter handles, DIDs, URLs, AT URIs, or search terms and set the result limit.
  4. Click Start.
  5. Preview the single Results table or download it in your preferred format.

The default input collects recent public posts from bsky.app and is ready to run.

Input examples

Profiles and counts

{
"mode": "profiles",
"actors": [
"bsky.app",
"jay.bsky.team"
],
"country": "US"
}

Recent author posts

{
"mode": "authorFeeds",
"actors": [
"bsky.app"
],
"maxItems": 100,
"feedFilter": "posts_with_replies",
"country": "US"
}

Search posts

{
"mode": "searchPosts",
"searchTerms": [
"open source AI"
],
"searchSort": "latest",
"maxItems": 100,
"country": "US"
}

Thread and replies

{
"mode": "threads",
"postUris": [
"https://bsky.app/profile/bsky.app/post/POST_RKEY"
],
"threadDepth": 20,
"country": "US"
}

Followers

{
"mode": "followers",
"actors": [
"bsky.app"
],
"maxItems": 500,
"country": "US"
}

Public repository

{
"mode": "repoRecords",
"actors": [
"bsky.app"
],
"collections": [
"app.bsky.feed.post"
],
"maxItems": 100,
"country": "US"
}

Post details

{
"mode": "posts",
"postUris": [
"https://bsky.app/profile/bsky.app/post/POST_RKEY"
],
"country": "US"
}

Likes, reposts, and quotes

{
"mode": "postInteractions",
"postUris": [
"https://bsky.app/profile/bsky.app/post/POST_RKEY"
],
"interactionTypes": [
"likes",
"reposts",
"quotes"
],
"maxItems": 500,
"country": "US"
}

Search actors

{
"mode": "searchActors",
"searchTerms": [
"open source"
],
"maxItems": 100,
"country": "US"
}

Accounts followed by an actor

{
"mode": "follows",
"actors": [
"bsky.app"
],
"maxItems": 500,
"country": "US"
}

Lists created by an actor

{
"mode": "lists",
"actors": [
"bsky.app"
],
"maxItems": 100,
"country": "US"
}

Members of a public list

{
"mode": "listItems",
"listUris": [
"at://did:plc:EXAMPLE/app.bsky.graph.list/LIST_RKEY"
],
"maxItems": 500,
"country": "US"
}

Feed generators created by an actor

{
"mode": "actorFeeds",
"actors": [
"bsky.app"
],
"maxItems": 100,
"country": "US"
}

Posts from a custom feed

{
"mode": "customFeed",
"feedUris": [
"at://did:plc:EXAMPLE/app.bsky.feed.generator/FEED_RKEY"
],
"maxItems": 100,
"country": "US"
}
{
"mode": "popularFeeds",
"maxItems": 100,
"country": "US"
}
{
"mode": "trends",
"maxItems": 100,
"country": "US"
}

Suggested follows for an actor

{
"mode": "suggestedFollows",
"actors": [
"bsky.app"
],
"maxItems": 100,
"country": "US"
}

Auto-detect mixed public URLs

{
"mode": "auto",
"startUrls": [
"https://bsky.app/profile/bsky.app",
"https://bsky.app/profile/bsky.app/post/POST_RKEY"
],
"country": "US"
}

The examples cover every supported mode. One dataset row represents a profile, post, interaction, list, feed, trend, or repository record and always uses the same 63-field top-level contract.

Complete output examples

Every result row contains exactly 63 top-level fields. The same complete key set makes mixed result types predictable in JSON exports and keeps every field visible in the single Results view.

Complete profile row — 63 top-level fields

{
"recordType": "profile",
"sourceMode": "profiles",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete post row — 63 top-level fields

{
"recordType": "post",
"sourceMode": "authorFeeds",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete interaction row — 63 top-level fields

{
"recordType": "interaction",
"sourceMode": "postInteractions",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete list row — 63 top-level fields

{
"recordType": "list",
"sourceMode": "lists",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete feed row — 63 top-level fields

{
"recordType": "feed",
"sourceMode": "actorFeeds",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete trend row — 63 top-level fields

{
"recordType": "trend",
"sourceMode": "trends",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

Complete repoRecord row — 63 top-level fields

{
"recordType": "repoRecord",
"sourceMode": "repoRecords",
"sourceTarget": "example-target",
"sourceUrl": "https://example.com/public-result",
"sourceEndpoints": [],
"did": "example-id",
"handle": null,
"displayName": "Example public record",
"description": "Example public content",
"profileUrl": "https://example.com/public-result",
"avatarUrl": "https://cdn.example.com/image.jpg",
"bannerUrl": "https://cdn.example.com/image.jpg",
"followersCount": 0,
"followsCount": 0,
"postsCount": 0,
"indexedAt": "2026-08-13T12:00:00Z",
"createdAt": "2026-08-13T12:00:00Z",
"labels": [],
"verification": {},
"uri": "example-id",
"cid": "example-id",
"postUrl": "https://example.com/public-result",
"text": "Example public content",
"languages": [],
"replyCount": 0,
"repostCount": 0,
"likeCount": 0,
"quoteCount": 0,
"author": {},
"embed": {},
"facets": [],
"reply": {},
"threadRootUri": null,
"threadDepth": 0,
"interactionType": null,
"targetUri": null,
"edgeActor": {},
"searchTerm": null,
"listUri": null,
"listName": "Example public record",
"listPurpose": null,
"listAvatar": "https://cdn.example.com/image.jpg",
"feedUri": null,
"feedName": "Example public record",
"feedDescription": null,
"feedCreator": {},
"trendTopic": null,
"trendDisplayName": null,
"trendDescription": null,
"trendLink": "https://example.com/public-result",
"trendStatus": null,
"trendPostCount": 0,
"repoDid": null,
"collection": null,
"recordKey": "example-id",
"pds": "https://example.com/public-result",
"recordValue": {},
"isPartial": false,
"monitorStatus": null,
"changedFields": [],
"previousCapturedAt": "2026-08-13T12:00:00Z",
"capturedAt": "2026-08-13T12:00:00Z",
"raw": {}
}

What data can you extract?

CategoryFields
Source and capturerecordType, sourceMode, sourceTarget, sourceUrl, sourceEndpoints, capturedAt
Profile identitydid, handle, displayName, description, profileUrl, avatarUrl, bannerUrl, indexedAt, createdAt, labels, verification
Profile metricsfollowersCount, followsCount, postsCount
Posts and threadsuri, cid, postUrl, text, languages, replyCount, repostCount, likeCount, quoteCount, author, embed, facets, reply, threadRootUri, threadDepth
Social interactionsinteractionType, targetUri, edgeActor
Search provenancesearchTerm
ListslistUri, listName, listPurpose, listAvatar
FeedsfeedUri, feedName, feedDescription, feedCreator
TrendstrendTopic, trendDisplayName, trendDescription, trendLink, trendStatus, trendPostCount
Repository recordsrepoDid, collection, recordKey, pds, recordValue
Monitoring and diagnosticsisPartial, monitorStatus, changedFields, previousCapturedAt, raw

Nested fields such as labels, verification, author, embed, facets, reply, edgeActor, feedCreator, recordValue, and optional raw retain the public AT Protocol object structure. Their nested keys and union variants are source-controlled and can change; the 63 top-level keys above are fixed by the Actor.

Input parameters

ParameterTypeRequiredDefaultDescription
modestringNo"authorFeeds"Select one of the 18 public Bluesky or AT Protocol workflows listed above.
actorsstring[]In actor-based modes["bsky.app"]Bluesky handles, DIDs, or profile URLs.
postUrisstring[]In post modes[]AT URIs or public bsky.app post URLs.
listUrisstring[]In listItems[]Public at:// list URIs.
feedUrisstring[]In customFeed[]Public at:// feed-generator URIs.
searchTermsstring[]In search modes[]Queries for public post or actor search.
startUrlsstring[]In auto[]Mixed public profile or post URLs.
maxItemsintegerNo100Maximum retained records per target or collection, from 1 to 100,000.
maxPagesintegerNo20Maximum XRPC cursor pages per endpoint, from 1 to 1,000.
searchSortstringNo"latest"latest or top for public post search.
languagestringNo""Optional BCP 47 language filter for post search.
sincestringNo""Optional ISO date/timestamp lower bound for post search.
untilstringNo""Optional ISO date/timestamp upper bound for post search.
feedFilterstringNo"posts_with_replies"posts_with_replies, posts_no_replies, posts_with_media, or posts_and_author_threads.
threadDepthintegerNo20Requested child depth for threads, from 0 to 1,000.
parentHeightintegerNo20Requested parent height for threads, from 0 to 1,000.
interactionTypesstring[]No["likes", "reposts", "quotes"]Public relationship types extracted by postInteractions.
collectionsstring[]In repoRecords["app.bsky.feed.post"]Public AT Protocol collections requested from each actor's PDS.
maxConcurrencyintegerNo10Concurrent public targets, from 1 to 50.
countrystringNo"US"Two-letter ISO country used for the internal residential proxy region.
includeRawbooleanNofalseInclude the redacted public source object; increases dataset size.
monitorModestringNo"off"off, onlyNew, or newAndChanged.
monitorKeystringWith monitoring"default"Stable comparison-state namespace for recurring runs.
maxSessionRotationsintegerNo3Fresh residential sessions tried after blocks, from 1 to 6.
requestTimeoutSecsintegerNo45Per-request timeout in seconds, from 15 to 120.

Pay-per-event result types

EventCharged when
profile-resultOne profile row is accepted by the Dataset.
post-resultOne post row is accepted by the Dataset.
interaction-resultOne interaction row is accepted by the Dataset.
list-resultOne list row is accepted by the Dataset.
feed-resultOne feed row is accepted by the Dataset.
trend-resultOne trend row is accepted by the Dataset.
repo-record-resultOne repoRecord row is accepted by the Dataset.

The Actor does not emit a paid error event. Failed targets are counted by category in RUN_SUMMARY; successful targets continue. Actual event prices are shown on the Actor's Pricing tab.

Use cases

Social listening and content research

Search public posts, collect author feeds, and analyze text, embeds, replies, reposts, likes, quotes, and thread structure.

Creator and network intelligence

Enrich profiles and export public follower, following, list, and interaction relationships for graph or audience analysis.

Feed and trend discovery

Catalog public custom feeds, popular feeds, suggested accounts, and current trend records.

AT Protocol research

Export public repository records with DID, collection, record key, PDS, CID, and complete public record values.

Data and automation pipelines

Send normalized rows to Google Sheets, Airtable, Make, Zapier, n8n, Airbyte, webhooks, or a data warehouse.

Performance and cost

Direct HTTP generally uses substantially less memory and bandwidth than launching a browser, but source response size, retries, optional enrichment, raw objects, and pagination determine actual cost. Start with a small limit, inspect the Dataset and RUN_SUMMARY, then scale. Lower concurrency is usually more reliable on stricter public sites.

API usage

Replace YOUR_USERNAME with the publishing Apify username after publication:

curl -X POST \
"https://api.apify.com/v2/acts/YOUR_USERNAME~bluesky-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "authorFeeds",
"actors": ["bsky.app"],
"maxItems": 100,
"country": "US"
}'

The request body is the same JSON used in Apify Console. Read results from the run's default Dataset or use the output link that opens view=overview.

Best for / not for

Best for: public profiles and posts, threads, interactions, search, public graph data, lists, feeds, trends, and AT Protocol repository exports.

Not for: notifications, bookmarks, chats, private data, account writes, moderation actions, or endpoints that require an authenticated Bluesky session.

Limits and good to know

Only anonymous public AppView, PLC, and PDS endpoints are used. Authenticated notifications, private data, writes, moderation actions, chat, and endpoints that reject anonymous traffic are outside scope. A row can be marked isPartial when a host stops later cursor pages.

A missing public value is returned as null or an empty array. One failed input does not create a frightening error row in Results. If every input fails, the run fails after writing diagnostic counts to RUN_SUMMARY.

Frequently asked questions

What input should I provide?

Depending on the mode, provide handles, DIDs, profile URLs, AT URIs, public post URLs, list or feed AT URIs, search terms, or public repository collection names.

How many results can I extract?

maxItems accepts 1-100,000 per input target or collection and maxPages accepts 1-1,000. Public endpoint limits, cursor exhaustion, moderation, and host availability can reduce the result count.

Can I process multiple inputs?

Yes. All target fields are arrays, and independent targets continue when one target or endpoint fails.

Can I schedule recurring runs?

Yes. Use Apify schedules and webhooks. For delta output, set monitorMode and reuse a stable monitorKey across runs.

Does this Actor open a browser?

No. Runtime extraction uses direct HTTP only and contains no Playwright, Selenium, Chromium, or browser installation.

Do I need an account or cookies?

No. The supported modes use public pages and anonymous endpoints. Cookies or authorization values from research captures are never embedded in the release.

Do I need to configure a proxy?

No. On Apify, the Actor creates a Residential Proxy configuration internally and does not expose proxy settings in Input. Local developers may privately point the documented test-only environment variable at a proxy file; that variable is not an Actor input and is ignored on the platform.

Why are some fields empty?

The single Results view covers every result type. Fields that do not apply to a row remain empty, while the complete key set is preserved in JSON.

Responsible use

Collect only public Bluesky data you are permitted to process. Respect applicable law, privacy rights, platform terms, rate limits, and intellectual-property rights. This Actor is not affiliated with or endorsed by Bluesky.

Support

For a reproducible issue, include the Apify run ID, mode, a non-sensitive public target, expected result, and actual result. Never send account credentials, cookies, access tokens, proxy passwords, or private content.

Local development

For local read-only smoke tests only, BLUESKY_TEST_PROXY_FILE may point to a private file containing one login:password@host:port proxy per line. The file is never read on Apify and must not be committed.