Bluesky Profile Feed Scraper

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

Data fields

FieldTypeDescription
recordTypestringWhether this row describes a Bluesky profile or a Bluesky post.
inputActorstringHandle or DID supplied in the actor input.
actorDidstringDecentralized identifier of the requested Bluesky profile.
actorHandlestringCurrent Bluesky handle of the requested profile.
profileDisplayNamestringPublic display name of the requested profile.
profileDescriptionstringPublic profile bio or description.
profileAvatarstringPublic avatar image URL when available.
followersCountintegerPublic follower count returned by Bluesky.

Input preview

actorsHandles or DIDs *
maxPostsPerActorMaximum posts per account
includeRepliesInclude replies
includeRepostsInclude reposts
requestDelayMsDelay between feed pages (ms)

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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

At a glance

  • Input: Public Bluesky handles such as bsky.app or DIDs such as did:plc:z72i7hdynmk6r22z27h6tvur.
  • Output: Profile rows and optional post rows with public text, URLs, timestamps, engagement counts, reply/repost flags, embeds, and labels.
  • Best for: Social listening, account monitoring, public post archives, reporting datasets, and AI summarization inputs.
  • Pricing unit: A start event per run plus one result event for each saved profile or post row.
  • Login required: No. The Actor reads public Bluesky profile and author-feed data.

What can it 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: Monitor brand accounts and creator activity.
  • Social researchers: Collect public post samples for trend analysis.
  • Developer relations teams: Export public updates from ecosystem accounts.
  • Journalists: Archive public posts from official organizations.
  • Data teams: Feed profile and post records into warehouses, dashboards, or enrichment pipelines.

Why use this actor?

  • Handle and DID support: Use readable handles or stable decentralized identifiers.
  • Profile and post rows together: Save account metadata and recent author-feed posts in one dataset.
  • Pagination support: Collect more than the first page of recent author-feed posts.
  • Reply and repost controls: Include or exclude replies and reposts depending on the workflow.
  • Public-data workflow: Run without account credentials.
  • Lightweight collection: Uses public HTTP API requests rather than a browser.

Example input

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

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: Use DIDs when you need stable account identifiers.
  • Start small: Keep the first test run to one account and a low post limit.
  • Clean announcement feed: Use includeReplies: false when you want only account-originated announcements.
  • Full feed context: Use includeReposts: true when reposts matter to the analysis.
  • Monitor safely: Run on a schedule and deduplicate downstream by uri.

Common workflows

  • Official account exports: Export recent posts from public organization accounts.
  • Product monitoring: Track public announcements over time.
  • Creator watchlists: Build small account lists for social reporting.
  • Profile enrichment: Add public Bluesky profile metrics to CRM or research records.
  • Research archives: Save public posts for review, summarization, or compliance workflows.

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 and AI agents

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

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

  • Public data only: Only public Bluesky data is returned.
  • Unavailable accounts are skipped: Private, renamed, deleted, or temporarily unavailable accounts cannot be collected.
  • Deleted posts can disappear: Future runs may no longer return posts removed upstream.
  • Large lists take longer: Each profile has its own paginated feed.
  • Partial success is possible: 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.

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.

Common questions

Questions and answers reused from the canonical actor README.

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.