Discover public Bluesky profiles by keyword using the official public Bluesky actor search API. Export profile handles, DIDs, bios, avatars, labels, verification metadata, and profile URLs for social listening, source discovery, and lead research.
At a glance
- Primary job: Find public Bluesky profiles that match keywords before downstream feed, follower, or profile enrichment.
- Input: Search queries, search mode, and a maximum profile limit.
- Output: One dataset row per unique public Bluesky profile.
- Best for: Brand monitoring, journalist/source discovery, community mapping, influencer prospecting, and research workflows.
Who is it for?
Social listening teams, journalists, community managers, influencer researchers, and developers can use this Bluesky profile search workflow to find public accounts and export stable handles and DIDs. This Bluesky scraper also fits scheduled monitoring and Bluesky API enrichment pipelines.
Common workflows
- Social listening discovery: Search product, brand, or community terms to find relevant Bluesky accounts.
- Journalist and expert sourcing: Find profiles that mention beats, topics, organizations, or credentials.
- Lead and influencer prospecting: Export handles and DIDs for downstream CRM, follower, or feed analysis.
- Automation: Schedule repeat runs and export datasets through CSV, JSON, Excel, API, webhooks, or MCP tools.
Input recipes
- Brand discovery:
queries: ["apify", "web scraping"],mode: "searchActors",maxItems: 50. - Topic experts:
queries: ["climate", "science journalist"],mode: "searchActors",maxItems: 75. - Typeahead suggestions:
queries: ["open source", "marketing"],mode: "typeahead",maxItems: 20,includeRawProfile: true.
What data can you extract?
| Field | Description |
|---|---|
query |
Search keyword that produced the profile. |
mode |
searchActors or typeahead. |
rank |
Profile rank within the query before duplicate skips. |
did |
Bluesky / AT Protocol decentralized identifier. |
handle |
Public Bluesky handle. |
displayName |
Public display name, when available. |
description |
Public profile bio, when available. |
avatar, banner |
Public profile image URLs, when available. |
followersCount, followsCount, postsCount |
Current public profile statistics from Bluesky profile-detail enrichment. |
createdAt, indexedAt |
Public timestamps returned by Bluesky. |
labels, associated, verification, status |
Public profile metadata returned by Bluesky. |
sourceUrl |
Public bsky.app profile URL. |
scrapedAt |
Timestamp when the Actor saved the row. |
rawProfile |
Optional raw Bluesky profile JSON. |
Example input
{
"queries": ["apify", "climate"],
"mode": "searchActors",
"maxItems": 10,
"limitPerRequest": 10,
"includeRawProfile": false
}
Example output
{
"query": "apify",
"mode": "searchActors",
"rank": 1,
"did": "did:plc:example",
"handle": "apify.com",
"displayName": "Apify",
"description": "Web scraping and automation platform.",
"avatar": "https://cdn.bsky.app/img/avatar/...",
"banner": "https://cdn.bsky.app/img/banner/...",
"followersCount": 4200,
"followsCount": 180,
"postsCount": 640,
"createdAt": "2024-01-01T00:00:00.000Z",
"indexedAt": "2026-07-24T00:00:00.000Z",
"labels": [],
"associated": {},
"verification": null,
"status": null,
"sourceUrl": "https://bsky.app/profile/apify.com",
"scrapedAt": "2026-07-24T08:00:00.000Z",
"rawProfile": null
}
Tips for best results
- Start small: Use
maxItems: 10until output quality and pricing are verified. - Use focused keywords: Brand names, topics, occupations, and communities work better than very broad words.
- Use typeahead for suggestions:
typeaheadis best for quick autocomplete-style candidates, not exhaustive discovery. - Use downstream actors: Feed/follower/profile actors can enrich handles or DIDs found here.
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-actor-search-scraper").call({
queries: ["apify"],
mode: "searchActors",
maxItems: 10
});
console.log(run.defaultDatasetId);
Python:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/bluesky-actor-search-scraper").call(run_input={
"queries": ["apify"],
"mode": "searchActors",
"maxItems": 10,
})
print(run["defaultDatasetId"])
cURL:
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~bluesky-actor-search-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["apify"],"mode":"searchActors","maxItems":10}'
MCP and AI agents
Use this Actor from MCP-compatible tools through the official Apify MCP Server.
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/bluesky-actor-search-scraper"
MCP server JSON configuration:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/bluesky-actor-search-scraper",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
Example prompt: "Run Bluesky Actor Search Scraper for climate journalists and summarize the top profile handles."
Limits and caveats
- Scope: This Actor searches public profiles only. It does not scrape posts, replies, DMs, logged-in viewer state, or private data.
- Completeness: Bluesky search ranking and available fields are controlled by Bluesky's public API.
- Rate limits: Very large or frequent runs may be throttled by the public API; the Actor uses bounded retries.
Legality and responsible use
Process only data that users are allowed to access. Follow Bluesky's terms, Apify's terms, and applicable laws.
Support
Open an issue from the Actor page if a run fails or output looks wrong: https://apify.com/fetch_cat/bluesky-actor-search-scraper/issues. Include the run ID or run URL, a reproducible public URL or example public URL, input JSON, expected output, and actual output.