# Bluesky Posts + Profiles Scraper (`navy_currant/bluesky-posts-profiles-scraper`) Actor

Extract posts and profiles from Bluesky (bsky.app) via the official public AT Protocol API. Search by keyword, hashtag, or handle. No credentials required — public data only.

- **URL**: https://apify.com/navy\_currant/bluesky-posts-profiles-scraper.md
- **Developed by:** [Ishaan](https://apify.com/navy_currant) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 0 monthly users, 79.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Posts + Profiles Scraper

Extract posts and profiles from **Bluesky** (bsky.app) using the official **AT Protocol public API** — no account, no credentials, no proxy spend required.

### What it does

- **Search posts** by keyword, hashtag, or phrase — with optional date range, language filter, and `latest`/`top` sort
- **Search profiles** by keyword — find accounts discussing a topic
- **Bulk profile lookup** — fetch structured data for a list of known @handles
- **Unified output** — posts and profiles in one dataset with consistent field names

### Why use this actor

| Competitor actor | Problem | This actor |
|---|---|---|
| lexis-solutions/bluesky-users-scraper (91 users) | Profiles only, no posts | Posts + profiles unified |
| aurumworks/bluesky-scraper | Deprecated | Active maintenance |
| Others | Missing date filter | `since` + `until` supported |

Bluesky reached **41M users in 2026** (+302% YoY). It is the fastest-growing alternative social network and increasingly important for brand monitoring, academic research, and AI data pipelines.

### Output fields

#### Posts

| Field | Type | Description |
|---|---|---|
| `uri` | string | AT Protocol post URI |
| `url` | string | bsky.app permalink |
| `text` | string | Post body text |
| `created_at` | string | ISO 8601 creation timestamp |
| `author_handle` | string | @handle of the author |
| `author_display_name` | string | Display name |
| `author_did` | string | Decentralized identifier |
| `like_count` | integer | Number of likes |
| `reply_count` | integer | Number of replies |
| `repost_count` | integer | Number of reposts |
| `quote_count` | integer | Number of quote posts |
| `has_images` | boolean | Whether post contains images |
| `image_urls` | array | Full-size image URLs |
| `language` | string | BCP-47 language code |
| `tags` | array | Hashtag strings |

#### Profiles

| Field | Type | Description |
|---|---|---|
| `did` | string | Decentralized identifier |
| `handle` | string | @handle |
| `url` | string | bsky.app profile link |
| `display_name` | string | Display name |
| `description` | string | Bio text |
| `avatar_url` | string | Avatar image URL |
| `followers_count` | integer | Follower count |
| `follows_count` | integer | Following count |
| `posts_count` | integer | Total posts |

### Usage example

```json
{
  "mode": "posts",
  "searchTerms": ["AI tools", "#buildinpublic"],
  "maxResultsPerTerm": 1000,
  "sortPosts": "latest",
  "language": "en",
  "since": "2024-01-01T00:00:00Z"
}
```

### Pricing

**Pay per event:** $0.003 per result (post or profile).

Example: 10,000 posts ≈ **$30**.

### Technical notes

- Uses `api.bsky.app` — the Bluesky AppView public endpoint (the `public.api.bsky.app` host 403s on post search as of 2026-06)
- Zero proxy cost (AT Protocol is designed for logged-out public access)
- Polite rate limiting (~6 req/sec)
- Automatically stops when the user's spending limit is reached
- Charge limit is respected per result — no overrun

### Common use cases

- **Brand monitoring** — track mentions of your product or company on Bluesky
- **Academic research** — collect public discourse data for NLP analysis
- **RAG pipelines** — feed fresh Bluesky content into retrieval-augmented AI systems
- **Competitive intelligence** — monitor hashtags and topics in your industry
- **Influencer discovery** — find and profile accounts in a niche
- **Sentiment analysis** — classify public opinion on trending topics

### Data compliance

This actor accesses only **public, logged-out data** through Bluesky's official public API. No login credentials are used. Suitable for research and business use under Bluesky's standard terms of service for public data.

# Actor input Schema

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

What to scrape: posts only, profiles only, or both.

## `searchTerms` (type: `array`):

Keywords, hashtags, or phrases to search. Each term runs as a separate query.

## `handles` (type: `array`):

List of @handles or DIDs to fetch profiles for directly (bypasses keyword search).

## `maxResultsPerTerm` (type: `integer`):

Maximum number of results to return per search term. Higher values increase cost and run time. Note: Bluesky's keyless API caps POST search at ~100 results per term (profiles search supports the full range).

## `sortPosts` (type: `string`):

Sort order for post results. 'latest' returns newest first; 'top' returns most-liked first.

## `language` (type: `string`):

BCP-47 language code to filter posts (e.g. 'en', 'es', 'ja'). Leave blank for all languages.

## `since` (type: `string`):

Return only posts created after this ISO 8601 timestamp (e.g. 2024-01-01T00:00:00Z).

## `until` (type: `string`):

Return only posts created before this ISO 8601 timestamp (e.g. 2024-12-31T23:59:59Z).

## Actor input object example

```json
{
  "mode": "posts",
  "searchTerms": [
    "AI tools",
    "#buildinpublic"
  ],
  "handles": [],
  "maxResultsPerTerm": 500,
  "sortPosts": "latest"
}
```

# 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 = {
    "searchTerms": [
        "AI tools",
        "#buildinpublic"
    ],
    "handles": [],
    "language": "",
    "since": "",
    "until": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("navy_currant/bluesky-posts-profiles-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 = {
    "searchTerms": [
        "AI tools",
        "#buildinpublic",
    ],
    "handles": [],
    "language": "",
    "since": "",
    "until": "",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "AI tools",
    "#buildinpublic"
  ],
  "handles": [],
  "language": "",
  "since": "",
  "until": ""
}' |
apify call navy_currant/bluesky-posts-profiles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=navy_currant/bluesky-posts-profiles-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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