Bluesky Profile Feed Scraper avatar

Bluesky Profile Feed Scraper

Pricing

from $0.03 / 1,000 result extracteds

Go to Apify Store
Bluesky Profile Feed Scraper

Bluesky Profile Feed Scraper

Extract public Bluesky profile metadata and recent posts from handles or DIDs. Export author feeds, engagement counts, timestamps, and URLs.

Pricing

from $0.03 / 1,000 result extracteds

Rating

0.0

(0)

Developer

Hanna Nosova

Hanna Nosova

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Extract public Bluesky profile metadata and recent public author-feed posts from handles or DIDs.

What does Bluesky Profile Feed Scraper do?

Bluesky Profile Feed Scraper collects public account details and recent public posts from Bluesky.

Use it when you need a clean dataset of profile fields, post text, engagement counts, timestamps, labels, embeds, and canonical Bluesky URLs.

It accepts handles such as bsky.app and DIDs such as did:plc:z72i7hdynmk6r22z27h6tvur.

No Bluesky login is required for public profiles and public author feeds.

Who is it for?

Marketing teams can monitor brand accounts and creator activity.

Social researchers can collect public post samples for trend analysis.

Developer relations teams can export public updates from ecosystem accounts.

Journalists can archive public posts from official organizations.

Data teams can feed profile and post records into warehouses, dashboards, or enrichment pipelines.

Why use this actor?

🦋 Handle and DID input support.

🦋 Profile metadata and posts in one dataset.

🦋 Cursor pagination for recent author feeds.

🦋 Optional reply and repost filters.

🦋 Public-data workflow without account credentials.

🦋 Lightweight HTTP collection for fast runs.

Data returned

FieldDescription
recordTypeprofile or post
inputActorHandle or DID from your input
actorDidProfile DID
actorHandleCurrent profile handle
profileDisplayNameDisplay name when available
profileDescriptionProfile bio
profileAvatarAvatar URL
followersCountPublic follower count
followsCountPublic following count
postsCountPublic post count
uriAT Protocol post URI
cidPost content ID
urlBrowser URL for profile or post
textPost text
createdAtPost creation timestamp
indexedAtBluesky indexing timestamp
replyCountReply count
repostCountRepost count
likeCountLike count
quoteCountQuote count
bookmarkCountBookmark count when returned
authorHandlePost author handle
authorDidPost author DID
isReplyWhether the post is a reply
isRepostWhether the feed item is a repost
replyParentUriParent reply URI
replyRootUriRoot thread URI
embedEmbedded media/link object
labelsPublic labels returned by Bluesky

How much does it cost to scrape Bluesky profile feeds?

The actor uses pay-per-event pricing.

A small start event is charged once per run.

Each saved profile or post is charged as one result.

The formula-derived BRONZE price is about $0.026 per 1,000 saved records before tier discounts.

Volume tiers reduce the per-record price for higher Apify plans.

Input

{
"actors": ["bsky.app"],
"maxPostsPerActor": 25,
"includeReplies": false,
"includeReposts": false
}

Input fields

actors

List of public Bluesky handles or DIDs.

Examples:

  • bsky.app
  • apify.com
  • did:plc:z72i7hdynmk6r22z27h6tvur

maxPostsPerActor

Maximum number of posts to save for each account after filters are applied.

Set it to 0 if you only need profile metadata.

includeReplies

Set to true to include replies.

Leave it false for a cleaner top-level-post dataset.

includeReposts

Set to true to include reposted feed items.

Leave it false to focus on original account posts.

requestDelayMs

Optional delay between feed pages.

Increase it for very large jobs if you want a gentler request pace.

Output example

{
"recordType": "post",
"inputActor": "bsky.app",
"actorDid": "did:plc:z72i7hdynmk6r22z27h6tvur",
"actorHandle": "bsky.app",
"profileDisplayName": "Bluesky",
"url": "https://bsky.app/profile/bsky.app/post/example",
"text": "Public post text",
"createdAt": "2026-06-25T19:03:39.125Z",
"replyCount": 10,
"repostCount": 20,
"likeCount": 100,
"authorHandle": "bsky.app",
"authorDid": "did:plc:z72i7hdynmk6r22z27h6tvur",
"isReply": false,
"isRepost": false
}

How to scrape Bluesky profiles

  1. Open the actor.

  2. Add one or more handles or DIDs.

  3. Choose how many posts to collect per account.

  4. Decide whether replies or reposts should be included.

  5. Start the run.

  6. Export the dataset as JSON, CSV, Excel, XML, or RSS from Apify.

Tips for better results

Use handles for readability and DIDs when you need stable account identifiers.

Keep the first test run small.

Use includeReplies: false when you want only account-originated announcements.

Use includeReposts: true when you want the full author feed context.

For monitoring workflows, run the actor on a schedule and deduplicate by uri.

Common workflows

🦋 Export posts from official accounts.

🦋 Monitor product announcements.

🦋 Build a creator-account watchlist.

🦋 Enrich CRM records with public Bluesky profile metrics.

🦋 Archive public posts for research review.

Integrations

Send results to Google Sheets for lightweight reporting.

Use webhooks to notify Slack when a scheduled run finishes.

Load JSON output into BigQuery, Snowflake, or Postgres.

Connect the actor to n8n or Make for social-monitoring workflows.

Use Apify datasets as the source for downstream AI summarization.

API usage

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/bluesky-profile-feed-scraper').call({
actors: ['bsky.app'],
maxPostsPerActor: 25,
});
console.log(run.defaultDatasetId);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/bluesky-profile-feed-scraper').call(run_input={
'actors': ['bsky.app'],
'maxPostsPerActor': 25,
})
print(run['defaultDatasetId'])

cURL

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~bluesky-profile-feed-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"actors":["bsky.app"],"maxPostsPerActor":25}'

MCP usage

You can use this actor from MCP-compatible tools through Apify MCP.

Claude Code setup:

$claude mcp add apify https://mcp.apify.com/?tools=fetch_cat/bluesky-profile-feed-scraper

Claude Desktop JSON example:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=fetch_cat/bluesky-profile-feed-scraper"
}
}
}

Example prompts:

  • "Run the Bluesky Profile Feed Scraper for bsky.app and summarize the last 20 posts."
  • "Collect profile metrics for these Bluesky handles and return a table."
  • "Find which recent posts from this account had the highest engagement."

Scheduling

Schedule daily or hourly runs for monitoring public accounts.

Use low limits for frequent runs.

Use a larger limit for initial backfills.

Deduplicate downstream by uri for posts and actorDid for profiles.

Limits

Only public Bluesky data is returned.

Private or unavailable accounts cannot be collected.

Deleted posts may disappear from future runs.

Large account lists take longer because each profile has its own paginated feed.

The actor skips invalid accounts when at least one valid account is provided.

Legality and responsible use

This actor collects publicly available data.

You are responsible for using the results lawfully and respecting applicable privacy, copyright, platform, and data-protection rules.

Do not use scraped data for spam, harassment, impersonation, or prohibited profiling.

If you store personal data, apply appropriate retention and deletion policies.

Troubleshooting

Why did a handle return no records?

The handle may be invalid, renamed, deleted, or temporarily unavailable.

Try the current handle in a browser or use the account DID.

Why are replies missing?

Replies are excluded by default.

Set includeReplies to true to collect replies.

Why are reposts missing?

Reposts are excluded by default.

Set includeReposts to true to collect repost feed items.

Why is the post count lower than requested?

Filters are applied after reading author-feed pages.

If an account mostly posts replies or reposts and those are excluded, fewer records may be saved.

FAQ

Does this require a Bluesky account?

No. It works with public profile and author-feed data.

Can I scrape multiple accounts?

Yes. Add multiple handles or DIDs to the actors array.

Can I get only profile metadata?

Yes. Set maxPostsPerActor to 0.

Can I monitor accounts over time?

Yes. Schedule the actor and deduplicate posts by uri.

Does it return images and embeds?

It returns the public embed object when Bluesky includes it in the feed response.

Changelog

0.1

Initial version with profile extraction, author-feed pagination, reply filtering, repost filtering, handle input, and DID input.

Support

If a run fails, include the run ID, input, and expected account handles when asking for help.

Small reproducible examples are the fastest way to diagnose invalid handles, missing records, or changed upstream behavior.