# Bluesky Posts Search - Keyword & Hashtag Posts, No Login (`actor-forge/bluesky-posts-search`) Actor

Search Bluesky posts by keyword, phrase or hashtag without an account or API key: text, link, author handle, time, likes, replies, reposts, language and linked URL. Filter by language, author and time window; monitor mode returns only new posts. $0.30 per 1,000 posts.

- **URL**: https://apify.com/actor-forge/bluesky-posts-search.md
- **Developed by:** [ActorForge](https://apify.com/actor-forge) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 posts

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bluesky Posts Search - Keyword & Hashtag Posts, No Login

Search Bluesky posts by keyword, phrase or hashtag without an account or API key: text, link, author handle, time, likes, replies, reposts, language and linked URL. Filter by language, author and time window; monitor mode returns only new posts. $0.30 per 1,000 posts.

**Search Bluesky posts by keyword, phrase or hashtag, with no Bluesky account, app password or API key.** Give it one or more search queries (a brand, a product, a topic, a #hashtag) and it returns matching **public Bluesky posts**, newest first or Bluesky's top-ranked: post link, **post text** (up to 1,000 characters), the **public author handle**, time posted, **likes, replies and reposts (including quotes)**, the post's language and any **linked URL**. Filter by **language**, **author handle** and **time window** (last hour to last year), exclude noise words, or drop replies. Switch on **monitor mode** for scheduled runs and each run returns only posts you have not seen yet: a cheap **Bluesky monitoring and social listening** feed for brand tracking, PR, community and devrel teams, research datasets, Slack alerts via Make, n8n or Zapier, and **AI agents**. It uses Bluesky's public AppView search API (api.bsky.app), whose robots.txt explicitly allows crawling the public API. Only public posts and public handles are returned: no follower lists, profiles or emails, and accounts that opted out of logged-out visibility are skipped. **$0.30 per 1,000 posts**, with no start fee and no compute bill on top. Need Hacker News, GitHub, Lemmy and Mastodon too? See Brand Mentions Monitor below.

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| createdAt | authorHandle | text | likeCount | replyCount | repostCount | language | matchedKeyword |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 2026-10-23T09:39:24.023Z | silentstars.dev | 🙌 Community pick iota — Open-source five-language dashboard… | 3 | 0 | 1 | en | typescript |
| 2026-10-23T10:33:57.692Z | adnanguney55.bsky.social | Grafik tasarım devi Canva, OpenAI ve Google gibi devlere rakip… | 0 | 0 | 0 | tr | openai |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `post` | $0.0003 | per Bluesky post row | 1,000 posts about your brand = $0.30 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at 256 MB = $0.00005 |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `keywords` | array | yes | — | Words, phrases or hashtags to search Bluesky for, e.g. "openai", "#buildinpublic" or a brand name. Each query is a Bluesky full-text search; results for all queries are merged and de-duplicated. |
| `maxPosts` | integer | no | `100` | Stop after this many posts in total (shared fairly between queries, newest first). Each post is one charged row. |
| `sinceHours` | integer | no | `168` | Only mentions created in the last N hours: 24 = one day, 168 = one week, up to 8,760 (one year). |
| `blueskySort` | string | no | `"latest"` | Latest: newest posts first. Top: Bluesky's own ranking of popular posts in the time window. |
| `blueskyLanguage` | string | no | — | Only posts tagged with this language, as an ISO code like en, de, ja or pt. Empty = all languages. |
| `blueskyAuthor` | string | no | — | Only posts by this handle, e.g. bsky.app or yourbrand.com. |
| `excludeKeywords` | array | no | — | Drop posts whose text contains any of these words or phrases (whole words, case-insensitive). |
| `includeComments` | boolean | no | `true` | Also return replies. Off = top-level posts only. |
| `newSinceLastRun` | boolean | no | `false` | For scheduled runs: skip posts already delivered by an earlier run with the same queries, so you only get (and pay for) new ones. Only hashed post IDs are kept, in a key-value store named dev-community-mentions-state in your account. |

### Limits & honest notes

- Data: Bluesky's public AppView API (app.bsky.feed.searchPosts on api.bsky.app), used without login. Its robots.txt says "Crawling the public parts of the API is allowed" and asks for no more than a handful of concurrent requests; this actor sends one at a time and backs off on HTTP 429. Not affiliated with Bluesky.
- Search is Bluesky's own full-text search: phrase and hashtag queries work as on bsky.app. Bluesky limits deep pagination, so a very broad query over a long window may return fewer posts than maxPosts; narrow the window or add queries.
- Privacy: only public posts, their links and public handles are returned; no follower lists, profile details or emails. Posts by accounts that opted out of logged-out visibility are skipped. Monitor mode stores only hashed post IDs. Please respect deletions when you store or republish posts.
- Bluesky has switched keyless search off before; if it refuses requests the run says so in a free status row and does not fail.
- Respects your run budget: set a maximum total charge and the run stops cleanly at the cap, with nothing charged twice. A run with no matches returns one free status row explaining why.

### Related ActorForge actors

- [Brand Mentions Monitor](https://apify.com/actor-forge/dev-community-mentions) — Bluesky plus Hacker News, GitHub, Lemmy, Mastodon and DEV in one run
- [News Search](https://apify.com/actor-forge/news-search) — the same keywords in worldwide news

### Changelog

- **2026-10-23** — Initial release: Bluesky keyword/hashtag post search with language, author and time filters, replies toggle, monitor mode, free status rows.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

## `keywords` (type: `array`):

Words, phrases or hashtags to search Bluesky for, e.g. "openai", "#buildinpublic" or a brand name. Each query is a Bluesky full-text search; results for all queries are merged and de-duplicated.

## `maxPosts` (type: `integer`):

Stop after this many posts in total (shared fairly between queries, newest first). Each post is one charged row.

## `sinceHours` (type: `integer`):

Only mentions created in the last N hours: 24 = one day, 168 = one week, up to 8,760 (one year).

## `blueskySort` (type: `string`):

Latest: newest posts first. Top: Bluesky's own ranking of popular posts in the time window.

## `blueskyLanguage` (type: `string`):

Only posts tagged with this language, as an ISO code like en, de, ja or pt. Empty = all languages.

## `blueskyAuthor` (type: `string`):

Only posts by this handle, e.g. bsky.app or yourbrand.com.

## `excludeKeywords` (type: `array`):

Drop posts whose text contains any of these words or phrases (whole words, case-insensitive).

## `includeComments` (type: `boolean`):

Also return replies. Off = top-level posts only.

## `newSinceLastRun` (type: `boolean`):

For scheduled runs: skip posts already delivered by an earlier run with the same queries, so you only get (and pay for) new ones. Only hashed post IDs are kept, in a key-value store named dev-community-mentions-state in your account.

## Actor input object example

```json
{
  "keywords": [
    "openai"
  ],
  "maxPosts": 10,
  "sinceHours": 168,
  "blueskySort": "latest",
  "includeComments": true,
  "newSinceLastRun": false
}
```

# Actor output Schema

## `posts` (type: `string`):

One row per Bluesky post: link, text, author handle, time, likes, replies, reposts, language and matched query.

## `summary` (type: `string`):

Mentions delivered per source, per-source status notes, API requests and billing.

# 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 = {
    "keywords": [
        "openai"
    ],
    "maxPosts": 10,
    "sinceHours": 168
};

// Run the Actor and wait for it to finish
const run = await client.actor("actor-forge/bluesky-posts-search").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 = {
    "keywords": ["openai"],
    "maxPosts": 10,
    "sinceHours": 168,
}

# Run the Actor and wait for it to finish
run = client.actor("actor-forge/bluesky-posts-search").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 '{
  "keywords": [
    "openai"
  ],
  "maxPosts": 10,
  "sinceHours": 168
}' |
apify call actor-forge/bluesky-posts-search --silent --output-dataset

```

## MCP server setup

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

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/Gez2naejSqr9vQIAr/builds/ZQJky8GQLiAAf8OM8/openapi.json
