Bluesky Keyword Monitor: AT Protocol Post Alerts
Pricing
from $1.00 / 1,000 bluesky post returneds
Bluesky Keyword Monitor: AT Protocol Post Alerts
Bluesky keyword monitor: get Bluesky posts matching a keyword from the last 24 hours, in one language if you like, or only new posts for a keyword since the last run. One row per public post via AT Protocol searchPosts. Export a Bluesky keyword search to Google Sheets, CSV or n8n.
Pricing
from $1.00 / 1,000 bluesky post returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Bluesky Keyword Monitor: Public Post Search on a Schedule
Give it keywords or phrases and it searches public Bluesky posts for each one, returning a row per post with the text, the author, the link and the like, repost and reply counts. Turn on monitoring and each scheduled run returns only the posts that appeared since the previous one.
Who it's for
A developer-relations lead for an open-source project. People ask questions about your library on Bluesky without ever tagging you. A search for the project's name and its common misspellings, run every few hours, shows you the unanswered ones while they are still fresh.
A reporter covering one narrow beat. You follow a regulation, a product recall or a court case. You want every public post that mentions it, newest first, with a link you can cite, collected in a sheet by the end of the day.
A small-brand social manager who moved audience from another network. You want to know when anyone writes your brand name, and whether the post is a reply or a fresh mention, without scrolling a feed.
Why this one
- No account, no API key. The search is anonymous and public.
- Newest first, filtered by time. Posts are requested in latest-first order inside a time window you set, from one hour to thirty days.
- Counts included. Likes, reposts, replies and quotes arrive with each post, so you can sort by reach.
- Monitoring that remembers. Each keyword's last-seen post is stored in your own Apify account, so a scheduled run does not return the same post twice.
What you get
One row per post.
| Field | Meaning |
|---|---|
keyword | The search term that matched. |
postUrl | The bsky.app link to the post. |
text | The post text. |
authorHandle, authorDisplayName, authorDid | Who wrote it. |
createdAt | When the post was written, as an ISO timestamp. |
likeCount, repostCount, replyCount, quoteCount | Engagement at the time of the run. |
isReply | true when the post is a reply to another. |
cid, uri | Bluesky's content id and AT Protocol address, stable identifiers for the post. |
isNew, firstSeenAt | Monitoring flags. They are empty when monitoring is off. |
Every row also carries postCount, the number of posts the keyword produced in that run.
Why search runs on api.bsky.app
Bluesky serves the same search from two public hosts, and they do not behave alike. On 2026-10-08 we sent the identical request, a search for the word "bluesky" with a limit of one, to both:
| Host | Result |
|---|---|
public.api.bsky.app | HTTP 403 |
api.bsky.app | HTTP 200 with posts |
This actor therefore calls https://api.bsky.app/xrpc/app.bsky.feed.searchPosts and nothing else. Two practical things follow. It needs no credentials, which is why no login field exists. And if Bluesky ever restricts that host, the symptom would be a failed-request row, which is not billed, instead of posts.
The search is requested 100 posts at a time, up to 20 pages, and stops at maxResults, which defaults to 100 per keyword and cannot exceed 1,000.
Pricing
- Bluesky post returned: $2 per 1,000 posts
Plus a $0.002 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
Empty results are not billed. A keyword that produces no posts still returns a single row with found: true and postCount: 0, but that row is not charged. A monitored run in which nothing is new is not charged either; you pay only the start fee. This was a billing bug in earlier builds (an empty keyword was charged one post, $0.002), fixed and confirmed with a local run on 2026-10-08.
How to use
- In the Apify Console. Open the actor page and click Start — the
keywordsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~bluesky-keyword-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"keywords":["atprotocol"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"keywords": ["atprotocol"]}
One keyword or search phrase per line. Accepted formats: atprotocol, "open source", apify.
Other settings:
sinceHoursis the look-back window for the first search, from 1 to 720 hours; the default is 24.languageis a two-letter code such asenordethat limits results to that language.maxResultsis the cap per keyword, 100 by default.deltaModeswitches on monitoring.deltaNamenames the watchlist.includeKeywordskeeps only the rows that mention one of your words, andexcludeKeywordsdrops any row that mentions one. In a monitored run the lists are applied before the watch records a post, so a post they hide is not remembered and appears as new if you loosen the lists later.testRunruns only the first five keywords, andonlyFoundhides rows for keywords with no result.
Sample output
| query | found | status | postCount | keyword | postUrl | text | authorHandle | authorDisplayName | authorDid | createdAt | cid | uri | likeCount | repostCount | replyCount | quoteCount | isReply | isNew | firstSeenAt | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| atprotocol | true | OK | atprotocol | 1970-01-01T00:00:00.000Z |
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~bluesky-keyword-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"keywords":["atprotocol"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~bluesky-keyword-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"keywords":["atprotocol"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~bluesky-keyword-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"keywords":["{{keyword}}"]}, mapping the row's keyword into the keywords array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Bluesky Keyword Monitor | Apify" — the agent will find and run this actor.
Tips
- Always set
deltaNamefor a real watchlist. If you leave it empty, the monitoring record is keyed on a hash of your whole keyword list. Add or remove one keyword and the key changes, which restarts the baseline for every keyword. - Monitoring is more than the flag. Setting
deltaNamealone also records posts, but every post is still returned and billed withisNewmarking the new ones. SetdeltaModeto return only the new ones. - The first monitored run uses the time window. It returns posts from the last
sinceHourshours. Later runs ask Bluesky only for posts after the newest one already recorded. - Quote exact phrases. A multi-word term such as "open source" is passed to Bluesky as written; how Bluesky matches it is Bluesky's behaviour.
- Filter noise with
excludeKeywords. Add words like "giveaway" to drop the posts you never want to pay for.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (bluesky-keyword-monitor) | $0.002 per post returned, $0.002 per run | A dataset of posts you read or pipe wherever you like, with a remembered baseline per keyword | It does not push messages to a chat app, and a quiet run costs only the start fee |
Bluesky Mentions Monitor (bluesky-mentions-monitor) | $0.002 per post, the same rate | Keyword alerts delivered to Slack, Discord or Telegram, per its own page | If you want alerts in a chat channel, use it. This actor is for a spreadsheet, a database or your own workflow. |
FAQ
Can it see private or followers-only posts?
No. It searches the public index only.
Why did the first run return old posts?
The first search covers the look-back window, 24 hours by default. Lower sinceHours to narrow it.
Do likes and reposts update later?
No. The counts are a snapshot taken when the run fetched the post.
Are replies included?
Yes, and isReply tells you which rows are replies.
Related actors
- Bluesky Mentions Monitor sends new-post alerts to Slack, Discord or Telegram.