Substack Newsletter Sponsorship Prospect Finder
Substack publications ranked for sponsorship: subscriber count, paid-tier size, plan prices, posting cadence and engagement per 1,000 subscribers.
datagrit › Data › Bluesky Community Finder: Starter Packs & Feeds
DataFind Bluesky starter packs, custom feeds and curated lists by topic, with join counts, feed likes and full member lists with follower counts.
Bluesky Community Finder builds a catalog of the communities on Bluesky: starter packs, custom feeds and curated lists. Search by topic or point it at specific accounts, and every starter pack, feed or list comes back as one clean row with its creator, dates, size and popularity. Starter packs carry all-time and weekly join counts and the member count. Feeds carry likes and, if you ask for it, a live check of whether the feed is still online and valid. Lists carry their purpose (curate, moderation or reference) and member count. Turn on members and every pack or list is followed by one row per account, with followers, follows, posts and verification status. It reads Bluesky's public API, needs no login or API key, and exports to JSON, CSV or Excel.
You pay per result row: each starter pack, feed, list or member returned is one result, and the price per result is set on the Actor page and shown before you run it. The free example with empty input is not charged. There are no charges for rows that were filtered out or skipped as already seen, and a search that finds nothing returns a single status row with found: false that is not billed. Set a maximum charge per run in the Apify console to cap spending; the Actor stops cleanly when it is reached.
journalists or science) or account handles such as bsky.app. Starter packs and feeds can be searched by topic. Lists cannot be searched by topic, so use handles for them.If you leave search terms and handles empty, the Actor runs a small free example (up to 10 results, not charged) so you can see the output before you configure anything; the status message says so.
A filter that does not apply to the chosen type is listed in the status message instead of failing silently.
With Include members, each starter pack or list is followed by up to your chosen number of member rows. Add follower counts to members looks up followers, follows, posts and verification for every member. Member rows are separate results and are billed like any other row; the limit on communities does not cap them, so set the maximum members per community to match your budget.
Member lists unavailable), and the run fails only when none can be read; the same applies to listing fields such as join, like and member counts and to member records in an unexpected shape.Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
type | string | What the row is: starterPack, feed, list or member. On the status row it is the type you searched for. | starterPack |
query | string | The search term or handle this row came from. Member rows carry the query of their starter pack or list. | journalists |
uri | string | Permanent AT Protocol address of the starter pack, feed or list. Null on member rows and the status row. | at://did:plc:ab12cd34ef56/app.bsky.graph.starterpack/3kabcdefgh2 |
url | string | Link to the starter pack, feed, list or member profile on bsky.app. Null on the status row. | https://bsky.app/starter-pack/example.bsky.social/3kabcdefgh2 |
name | string | Name of the starter pack, feed or list. Null on member rows and the status row. | Bluesky for Journalists |
description | string | Description written by the creator, or for a member the profile bio. Null when empty. | Journalists worth following on Bluesky. |
creatorHandle | string | Handle of the account that created the community. Null on member rows and the status row. | example.bsky.social |
creatorDisplayName | string | Display name of the creator. Null when the creator has none. | Example Creator |
creatorDid | string | Permanent identifier of the creator account. Null on member rows and the status row. | did:plc:ab12cd34ef56 |
createdAt | string | Starter packs only: when the creator made the pack (ISO 8601). Null for feeds, lists and members. | 2024-06-25T05:30:27.442Z |
updatedAt | string | Starter packs only: last edit by the creator (ISO 8601). Null when never edited. | 2024-07-01T10:00:00.000Z |
indexedAt | string | When Bluesky indexed the community (ISO 8601). Null for members. | 2024-06-25T05:30:28.000Z |
joinedAllTimeCount | integer | Starter packs only: how many people joined through the pack, all time. Null for feeds and lists. | 37 |
joinedWeekCount | integer | Starter packs only: joins in the last 7 days. Null for feeds and lists. | 2 |
memberCount | integer | Starter packs and lists: number of accounts in it. Null for feeds and members. | 150 |
feedCount | integer | Starter packs only: how many custom feeds the pack recommends. Null for feeds, lists and members. | 3 |
feedUris | array | Starter packs only: AT URIs of the feeds the pack recommends. Null for feeds, lists and members. | ["at://did:plc:ab12cd34ef56/app.bsky.feed.generator/news"] |
likeCount | integer | Feeds only: number of likes. Null for starter packs and lists. | 23983 |
acceptsInteractions | boolean | Feeds only: whether the feed takes like and reply signals from users. Null for starter packs and lists. | true |
contentMode | string | Feeds only: unspecified (posts) or video. Null when Bluesky does not say. | unspecified |
serviceDid | string | Feeds only: identifier of the server that generates the feed. Null for other types. | did:web:feed.example.com |
isOnline | boolean | Feeds only, when Check feed health is on: whether the feed server answers. Null when health was not checked. | true |
isValid | boolean | Feeds only, when Check feed health is on: whether the feed returns valid posts. Null when health was not checked. | true |
purpose | string | Lists only: curate, mod or reference. Null for other types. | curate |
communityType | string | Members only: starterPack or list the member belongs to. Null on community rows. | starterPack |
communityUri | string | Members only: AT URI of the starter pack or list. Null on community rows. | at://did:plc:ab12cd34ef56/app.bsky.graph.starterpack/3kabcdefgh2 |
communityName | string | Members only: name of the starter pack or list. Null on community rows. | Bluesky for Journalists |
did | string | Members only: permanent identifier of the account. Null on community rows. | did:plc:zz99yy88xx77 |
handle | string | Members only: handle of the account. Null on community rows. | reporter.bsky.social |
displayName | string | Members only: display name. Null when the account has none. | Example Reporter |
accountCreatedAt | string | Members only: when the account was created (ISO 8601). Null when unknown. | 2023-05-01T12:00:00.000Z |
followersCount | integer | Members only: follower count. Null when Add follower counts is off or the account was deactivated. | 1200 |
followsCount | integer | Members only: how many accounts the member follows. Null when stats are off or unavailable. | 340 |
postsCount | integer | Members only: number of posts. Null when stats are off or unavailable. | 5600 |
isVerified | boolean | Members only: whether Bluesky verified the account. Null when stats are off or unavailable. | false |
avatar | string | Members only: profile picture URL. Null when the account has none. | https://cdn.bsky.app/img/avatar/plain/did:plc:zz99yy88xx77/abc@jpeg |
scrapedAt | string | ISO 8601 timestamp of extraction. | 2026-10-01T08:00:00.000Z |
found | boolean | False only on the single status row emitted when a search term or handle returns nothing. | true |
{
"type": "starterPack",
"query": "journalists",
"uri": "at://did:plc:ab12cd34ef56/app.bsky.graph.starterpack/3kabcdefgh2",
"url": "https://bsky.app/starter-pack/example.bsky.social/3kabcdefgh2",
"name": "Bluesky for Journalists",
"description": "Journalists worth following on Bluesky.",
"creatorHandle": "example.bsky.social",
"creatorDisplayName": "Example Creator",
"creatorDid": "did:plc:ab12cd34ef56",
"createdAt": "2024-06-25T05:30:27.442Z",
"updatedAt": "2024-07-01T10:00:00.000Z",
"indexedAt": "2024-06-25T05:30:28.000Z",
"joinedAllTimeCount": 37,
"joinedWeekCount": 2,
"memberCount": 150,
"feedCount": 3,
"feedUris": [
"at://did:plc:ab12cd34ef56/app.bsky.feed.generator/news"
],
"likeCount": 23983,
"acceptsInteractions": true,
"contentMode": "unspecified",
"serviceDid": "did:web:feed.example.com",
"isOnline": true,
"isValid": true,
"purpose": "curate",
"communityType": "starterPack",
"communityUri": "at://did:plc:ab12cd34ef56/app.bsky.graph.starterpack/3kabcdefgh2",
"communityName": "Bluesky for Journalists",
"did": "did:plc:zz99yy88xx77",
"handle": "reporter.bsky.social",
"displayName": "Example Reporter",
"accountCreatedAt": "2023-05-01T12:00:00.000Z",
"followersCount": 1200,
"followsCount": 340,
"postsCount": 5600,
"isVerified": false,
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:zz99yy88xx77/abc@jpeg",
"scrapedAt": "2026-10-01T08:00:00.000Z",
"found": true
}
| Field | Name | Type | What it does |
|---|---|---|---|
mode | What to find | string | Starter packs: curated follow-packs you can search by topic. Feeds: custom feed generators you can search by topic. Lists: curated, moderation or reference lists published by the accounts in Handles. |
queries | Search terms | array | Topics to search, for example journalists, science or birds. Each term is searched separately. Works for starter packs and feeds. Lists cannot be searched by topic: use Handles. Leave Search terms and Handles empty to get a free example of up to 10 results. |
handles | Account handles | array | Bluesky handles, for example bsky.app, or profile URLs such as https://bsky.app/profile/bsky.app. Returns the starter packs, feeds or lists that these accounts created, depending on the mode. |
maxItems | Maximum communities | integer | Stop after this many starter packs, feeds or lists in total across all search terms and handles. Member rows are not counted here; they come on top when Include members is on. |
textContains | Name or description contains | array | Keep only results whose name or description contains at least one of these words (case-insensitive). |
minJoinedAllTime | Minimum joins (starter packs only) | integer | Starter packs only: keep packs that at least this many people joined through, all time. Ignored for feeds and lists. |
minMembers | Minimum members (starter packs and lists) | integer | Starter packs and lists only: keep communities with at least this many accounts. Ignored for feeds. |
minLikes | Minimum likes (feeds only) | integer | Feeds only: keep feeds with at least this many likes. Ignored for starter packs and lists. |
publishedAfter | Created after | string | Keep communities created or first indexed on or after this date, for example 2025-06-01. Starter packs use their creation date; feeds and lists use the date Bluesky indexed them. |
listPurpose | List type (lists only) | string | Lists only: curate lists group accounts worth following, mod lists are moderation lists, reference lists are general collections. Ignored for starter packs and feeds. |
checkFeedHealth | Check feed health (feeds only) | boolean | Feeds only: ask Bluesky whether each feed is online and valid, one extra request per feed. Without it, isOnline and isValid stay null. |
onlyOnlineFeeds | Only feeds that are online (feeds only) | boolean | Feeds only: drop feeds that are offline or invalid. Turns on the health check automatically. |
includeMembers | Include members | boolean | Starter packs and lists only: add one row per member account after each community. Each member row is a separate billed result. |
maxMembersPerCommunity | Maximum members per community | integer | Cap on member rows per starter pack or list when Include members is on. |
includeMemberStats | Add follower counts to members | boolean | When Include members is on, look up followers, follows, posts and verification for every member (one request per 25 members). |
onlyNewSinceLastRun | Only communities not seen before | boolean | Skip starter packs, feeds and lists already returned by an earlier run with the same search terms, handles and filters. Only delivered results are remembered. |
proxyConfiguration | Proxy configuration | object | Optional proxy. Bluesky's public API needs none; leave disabled unless you have a reason. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
curl -X POST "https://api.apify.com/v2/acts/datagrit~bluesky-community-finder/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"starterPacks","queries":["journalists","science"],"maxItems":30}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/bluesky-community-finder').call({
"mode": "starterPacks",
"queries": [
"journalists",
"science"
],
"maxItems": 30
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/bluesky-community-finder").call(run_input={
"mode": "starterPacks",
"queries": [
"journalists",
"science"
],
"maxItems": 30
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
No. It uses the public API without login.
Bluesky has no search for lists. Give the handles of the accounts whose lists you want.
Schedule the Actor with the same input and switch on "Only communities not seen before".
Open an issue on the Actor page with the input you used and the run link.
Substack publications ranked for sponsorship: subscriber count, paid-tier size, plan prices, posting cadence and engagement per 1,000 subscribers.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
French company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.
Named officers, directors and key employees with pay, hours and titles from IRS e-filed 990, 990-EZ and 990-PF returns.