# Bluesky Actor Search Scraper (`fetch_cat/bluesky-actor-search-scraper`) Actor

Search public Bluesky profiles by keyword and export handles, DIDs, bios, avatars, labels, verification metadata, and profile URLs.

- **URL**: https://apify.com/fetch\_cat/bluesky-actor-search-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.14 / 1,000 profile saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bluesky Actor Search Scraper

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` | Avatar image URL, when available. |
| `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. |

### Input configuration

| Setting | JSON key | Use it for | Example |
| --- | --- | --- | --- |
| Search queries | `queries` | Keywords to search for in public Bluesky profiles. | `["apify", "climate"]` |
| Search mode | `mode` | Full actor search or typeahead suggestions. | `"searchActors"` |
| Maximum profiles | `maxItems` | Cap saved rows and control spend. | `10` |
| Profiles per request | `limitPerRequest` | API page size, 1-100. | `10` |
| Include raw profile JSON | `includeRawProfile` | Keep Bluesky's raw profile object for advanced use. | `false` |

### Example input

```json
{
  "queries": ["apify", "climate"],
  "mode": "searchActors",
  "maxItems": 10,
  "limitPerRequest": 10,
  "includeRawProfile": false
}
```

### Example output

```json
{
  "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/...",
  "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
}
```

### Pricing

The **Run start** event is charged once when a valid run begins. The **Profile saved** event is charged for each unique public profile written to the dataset; duplicates and failed queries are not charged as profiles. See the [live Pricing tab](https://apify.com/fetch_cat/bluesky-actor-search-scraper/pricing) for current rates and plan-tier discounts.

### Tips for best results

- **Start small**: Use `maxItems: 10` until 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**: `typeahead` is 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:

```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:

```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:

```bash
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.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/bluesky-actor-search-scraper"
```

MCP server JSON configuration:

```json
{
  "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.

### Related actors

- [Bluesky Profile Feed Scraper](https://apify.com/fetch_cat/bluesky-profile-feed-scraper)
- [Bluesky Followers Scraper](https://apify.com/fetch_cat/bluesky-followers-scraper)
- [Instagram Search Scraper](https://apify.com/fetch_cat/instagram-search-scraper)
- [LinkedIn Profile Search Scraper](https://apify.com/fetch_cat/linkedin-profile-search-scraper)
- [Pinterest Search Scraper](https://apify.com/fetch_cat/pinterest-search-scraper)

### FAQ

#### What data can I export with Bluesky actor search?

You can export public profile handles, DIDs, display names, descriptions, avatars, labels, verification metadata, profile URLs, and optional raw profile data. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

#### Can I run Bluesky Actor Search Scraper through an API, schedule, or MCP client?

Yes. Run it through the Apify API or SDK, schedule recurring searches in Console, or connect it to an MCP-compatible AI client using the setup above.

#### How much does a run cost?

Runs charge once at startup and per unique profile saved. Check the live Pricing tab for current rates and plan-tier discounts.

#### Why are some fields empty?

Bluesky profiles are sparse and the public API does not expose every field for every account. The Actor leaves unavailable fields empty instead of guessing.

### 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.

# Actor input Schema

## `queries` (type: `array`):

Keywords to search for in public Bluesky profiles, such as brands, topics, organizations, or communities.

## `mode` (type: `string`):

Use full actor search for paginated discovery, or typeahead for autocomplete-style profile suggestions.

## `maxItems` (type: `integer`):

Maximum number of unique profile records to save across all queries.

## `limitPerRequest` (type: `integer`):

Number of profiles requested per Bluesky API page. Bluesky allows 1-100.

## `includeRawProfile` (type: `boolean`):

Include the raw Bluesky profile object for debugging or advanced downstream use.

## Actor input object example

```json
{
  "queries": [
    "apify",
    "climate"
  ],
  "mode": "searchActors",
  "maxItems": 10,
  "limitPerRequest": 10,
  "includeRawProfile": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "apify",
        "climate"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/bluesky-actor-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": [
        "apify",
        "climate",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/bluesky-actor-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "apify",
    "climate"
  ]
}' |
apify call fetch_cat/bluesky-actor-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/bluesky-actor-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PWMkWrJmvmI5IhemO/builds/s6PaeYF0M3RvKGHOh/openapi.json
