Bluesky Starter Pack Scraper avatar

Bluesky Starter Pack Scraper

Pricing

Pay per event

Go to Apify Store
Bluesky Starter Pack Scraper

Bluesky Starter Pack Scraper

Export full member lists from any Bluesky Starter Pack. No login needed. AT Protocol public API returns pack metadata and member profiles with follower counts.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Categories

Share


🎯 What this scrapes

Bluesky Starter Packs are curated community lists that drove 43% of all follows during Bluesky's 2024 growth surge (EurekAlert, 2024). This Actor scrapes the public AT Protocol AppView API (https://public.api.bsky.app/xrpc/) to export every member of any starter pack — one pack by URI, or every pack owned by a creator handle.

Target endpoints:

  • app.bsky.graph.getStarterPack — single pack metadata and embedded list URI
  • app.bsky.graph.getActorStarterPacks — all packs published by a creator, with cursor pagination
  • app.bsky.graph.getList — member profiles with follower and post counts

No authentication required. The AT Protocol is an open protocol designed for interoperability.

🔥 Features

  • No login, no API key — unauthenticated public AT Protocol API only.
  • Two modes — scrape a single pack by URI/URL, or bulk-export every pack owned by a creator handle.
  • Denormalized output — every row contains pack metadata and member profile in one flat record. No joins needed for analytics tools.
  • Bluesky web URLs accepted — paste https://bsky.app/starter-pack/handle/rkey directly; the Actor normalizes it to AT URI form.
  • Follower counts includedmember_followers_count, member_following_count, member_posts_count on every row.
  • Member cap per pack — configurable limit (1–5,000) so local test runs stay cheap.
  • PPE pricing — you pay only for rows emitted, not for idle compute.

💡 Use cases

  • Academic research — map community topology and influencer networks on Bluesky. Starter packs are the primary community formation mechanism on the platform.
  • B2B growth marketing — identify niche audiences (e.g. "AI researchers on Bluesky") and build targeted outreach lists.
  • Social graph analysis — compare follower counts and post activity across a curated peer group.
  • Competitive intelligence — track which accounts are recommended by influential pack curators in your industry.
  • Journalism and OSINT — document community formation around a topic or event.

⚙️ How to use it

Single-pack mode — paste the pack URI or web URL:

{
"starterPackUri": "at://did:plc:z72i7hdynmk6r22z3wouymf/app.bsky.graph.starterpack/ohX7HZkOlFj",
"maxMembersPerPack": 500,
"proxyConfiguration": {"useApifyProxy": false}
}

Or use a Bluesky web URL directly:

{
"starterPackUri": "https://bsky.app/starter-pack/alice.bsky.social/abc123rkey",
"maxMembersPerPack": 500
}

Creator mode — scrape every pack owned by a Bluesky handle:

{
"creatorHandle": "pfrazee.com",
"maxPacks": 10,
"maxMembersPerPack": 200
}

Exactly one of starterPackUri or creatorHandle must be set — providing both or neither returns a validation error before any network call is made.

📥 Input

FieldTypeRequiredDefaultDescription
starterPackUristringone-ofAT URI (at://...) or Bluesky web URL (https://bsky.app/starter-pack/...) of a single pack to scrape. Mutually exclusive with creatorHandle.
creatorHandlestringone-ofBluesky handle (e.g. pfrazee.com) or DID of a creator. The Actor exports every pack owned by that user. Mutually exclusive with starterPackUri.
maxPacksintegerno10Max packs to process in creator mode (1–100). Ignored in single-pack mode.
maxMembersPerPackintegerno500Max member rows emitted per pack (1–5,000). Pagination stops when limit is reached.
proxyConfigurationobjectnodisabledApify Proxy configuration. The AT Protocol API does not block datacenter IPs — leave disabled unless behind a restrictive ISP.

📤 Output

One row per pack member. Pack metadata is denormalized into every row so a single CSV or JSON export is self-contained.

FieldTypeNullableDescription
pack_uristringnoAT URI of the starter pack
pack_namestringnoDisplay title of the pack
pack_descriptionstringyesPack description, if set
pack_creator_handlestringnoBluesky handle of the pack creator
member_didstringnoDecentralized identifier of the member
member_handlestringnoBluesky handle of the member
member_display_namestringyesDisplay name (may be blank)
member_followers_countintegeryesFollower count
member_following_countintegeryesFollowing count
member_posts_countintegeryesPost count
member_indexed_atstringyesISO 8601 datetime the member was indexed
scraped_atstringnoISO 8601 UTC datetime this row was written

Example record:

{
"pack_uri": "at://did:plc:abc123/app.bsky.graph.starterpack/xyz789",
"pack_name": "AI Researchers on Bluesky",
"pack_description": "Curated list of ML/AI researchers who migrated from Twitter.",
"pack_creator_handle": "alice.bsky.social",
"member_did": "did:plc:def456",
"member_handle": "bob.bsky.social",
"member_display_name": "Bob Smith",
"member_followers_count": 1204,
"member_following_count": 380,
"member_posts_count": 841,
"member_indexed_at": "2024-11-14T09:22:01.000Z",
"scraped_at": "2026-05-16T12:00:00.000Z"
}

💰 Pricing

This Actor uses Pay-Per-Event (PPE) pricing — you pay only for what you use, not for idle compute time.

EventPriceWhen
Actor start$0.05Once per run at boot
Member row emitted$0.002Per row written to the dataset

Effective cost: ~$2.05 per 1,000 members scraped ($0.05 start + $0.002 × 1,000 rows).

At 5,000 members (maximum per pack): ~$10.05.

🚧 Limitations

  • No keyword search — the AT Protocol lexicon defines app.bsky.graph.searchStarterPacks but the public AppView returns HTTP 404 (XRPCNotSupported) for it. Discovery by keyword is not available on the public API tier. Use creatorHandle to enumerate packs by a known creator instead.
  • Public packs only — private or invite-only starter packs are not visible to the unauthenticated AT Protocol API.
  • No historical data — the AT Protocol does not expose member join/leave history. This Actor captures current membership only.
  • No post content — member post threads are out of scope. Use a companion Bluesky feed Actor for post data.
  • No contact enrichment — email addresses and off-platform contact data are not available via the AT Protocol.
  • Member count cap — the maxMembersPerPack field (default 500, max 5,000) is a client-side guard. Pagination stops when the limit is reached.
  • Dataset retention — Apify's default storage expires after 7 days on the FREE plan. Export your results or use a named dataset for longer retention.
  • Rate limiting — the AT Protocol public AppView is designed for open access and does not publish rate limits. The Actor retries on 429/503 with exponential backoff (max 5 attempts, cap 30s).

❓ FAQ

Do I need a Bluesky account to use this? No. The AT Protocol public AppView API (https://public.api.bsky.app/xrpc/) is fully unauthenticated. No login, no API key, no OAuth.

Can I scrape multiple packs in one run? Yes — use creator mode (creatorHandle) to export every pack published by a Bluesky user, up to 100 packs per run.

How do I find a pack's AT URI? Paste the Bluesky web URL (https://bsky.app/starter-pack/<handle>/<rkey>) directly into the starterPackUri field. The Actor normalizes it to AT URI form automatically.

Why are some follower counts null? The AT Protocol API returns profile viewer stats (followersCount, followsCount, postsCount) inline in list member objects. If a profile is new or the API omits these fields, the Actor emits the row with those fields set to null rather than dropping the row.

Is scraping Bluesky starter packs compliant with the Terms of Service? Yes. The AT Protocol is an open protocol explicitly designed for interoperability and data portability. Bluesky has publicly proposed a scraping standard for AI training datasets (Slashdot, 2025). The public AppView API is the official mechanism for unauthenticated access.

What happens if I provide both starterPackUri and creatorHandle? The Actor raises a validation error before making any network call and exits with a non-zero status and a clear error message.

💬 Your feedback

Found a bug, a broken pack URI, or a missing field? Open an issue or contact DevilScrapes at https://apify.com/DevilScrapes. Feature requests and star ratings on the Apify Store are always welcome.