Bluesky Posts Search Scraper
Under maintenancePricing
from $4.99 / 1,000 results
Bluesky Posts Search Scraper
Under maintenanceSearch and scrape posts from Bluesky social network using the AT Protocol public API. Collect post text, author info, engagement metrics, and more.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Coding Frontned
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
What does Bluesky Posts Search Scraper do?
Bluesky Posts Search Scraper is a bounded Bluesky API alternative for collecting posts that users have made public. It sends sequential requests to the public Bluesky AT Protocol search endpoint and returns structured post, author, engagement, reply, and embed data. It does not require a Bluesky login and does not access private profiles, private APIs, or protected sessions.
Requests start with Bluesky's documented public AppView host, public.api.bsky.app. If that host explicitly denies the run environment, the Actor makes one bounded attempt for the same page through the established api.bsky.app compatibility host; it never treats either denial as post data.
Why use Bluesky Posts Search Scraper?
Use it for:
- Topic and keyword monitoring
- Public brand-mention and trend research
- Public post engagement comparisons
- Content discovery and research datasets
As an Apify Actor, it can be scheduled, called through the API, connected to integrations, monitored through run logs, and downloaded in standard dataset formats. Requests are sequential with a short pause between pages to keep collection bounded and polite.
What data can Bluesky Posts Search Scraper extract?
| Field | Type | Description |
|---|---|---|
postText | string | Public text content |
postUrl | string | Human-readable Bluesky post URL |
authorHandle | string | Public author handle |
authorDisplayName | string | Public author display name |
likeCount | integer | Reported likes |
repostCount | integer | Reported reposts |
replyCount | integer | Reported replies |
quoteCount | integer | Reported quote posts |
bookmarkCount | integer | Reported bookmarks |
hashtags, facetLinks, mentionedDids | array | Public rich-text facet values |
embedImages, embedImageThumbs | array | Resolved public image and thumbnail URLs |
embedVideoPlaylist, embedVideoThumbnail | string | Resolved public video media URLs |
embedExternalUrl | string | Public external link URL, when present |
replyParentUri | string | Immediate reply target, when present |
indexedAt | string | Search-service index timestamp |
dataAvailable | boolean | false for diagnostic records |
The Actor also returns stable post identifiers, author DID and avatar data, language tags, content IDs for embedded media, moderation label values, reply-root data, source, and timestamps when those values are present in the public response.
Every row includes recordType, status, position, searchQuery, source, scrapedAt, found, dataAvailable, and success. Optional values—including post text for media-only posts—are omitted when Bluesky does not expose them; the Actor does not invent placeholder strings or engagement counts.
How to scrape Bluesky posts
- Open the Input tab.
- Enter a keyword or hashtag in
query. - Choose
latestortopinsort, optionally enter a language code, and setmaxItems. - Start the Actor and inspect the dataset in the Output tab.
- For automation, use the API tab or schedule recurring runs in Apify.
The Actor requests up to 25 posts per page, emits at most maxItems successful posts, waits 500 ms between pages, times out each request after 15 seconds, and retries transient failures at most twice with bounded backoff. It stops without retrying when the public endpoint reports a login requirement, CAPTCHA, paywall, geofence, WAF/device challenge, access denial, or rate limit.
How much does it cost to scrape Bluesky?
Apify charges the normal compute and storage usage for the Actor and your account plan. Cost depends mainly on the number of pages and the selected maxItems; the default is 50 posts. The Actor has no paid-result fee and does not make private or authenticated requests. Check the current Apify pricing page for account-specific rates.
Input
See the input tab for full configuration options.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
query | string | — | Yes | Keyword or hashtag; trimmed and limited to 200 characters |
sort | string | latest | No | latest or top |
lang | string | empty | No | Language code such as en or pt-BR |
maxItems | integer | 50 | No | Successful posts to return, from 1 to 10,000 |
proxyConfiguration | object | direct | No | Optional Apify Proxy configuration; use the standard automatic pool when the public endpoint blocks the run environment |
Output
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The fixed OUTPUT key reports successful-post and diagnostic counts, normalized input, page count, endpoint availability, final status, and completion time.
[{"position": 1,"postId": "3examplepost","postUrl": "https://bsky.app/profile/exampleuser.bsky.social/post/3examplepost","postText": "An example public post.","authorHandle": "exampleuser.bsky.social","likeCount": 16,"found": true,"dataAvailable": true},{"position": 2,"postId": "3anotherpost","postUrl": "https://bsky.app/profile/sampleuser.bsky.social/post/3anotherpost","postText": "Another example public post.","authorHandle": "sampleuser.bsky.social","likeCount": 4,"found": true,"dataAvailable": true}]
If no public posts are returned or collection stops because of an error, the dataset can contain a diagnostic record with found: false and dataAvailable: false. Diagnostics are not counted as successful posts and do not consume the maxItems success limit. Resolved CDN/video URLs are kept separately from immutable AT Protocol content IDs so downstream consumers can use either representation.
Local QA commands
npm testapify run --purge --input-file qa-inputs/local-latest.jsonnode validate-datasets.jsapify run --purge --input-file qa-inputs/local-top.jsonnode validate-datasets.js
qa-inputs/invalid-input.json is intentionally invalid and must fail before any network request. qa-inputs/cloud-validation.json checks the direct cloud route; qa-inputs/cloud-validation-proxy.json checks the bounded standard-proxy fallback. qa-inputs/cloud-validation-residential.json is reserved for a final, tightly capped validation only after both cheaper routes are denied.
Tips and advanced options
- Keep
maxItemsmodest for frequent schedules. - Start with direct requests. If the run environment receives an access denial, enable Apify Proxy without selecting a residential group.
- Use
langwhen a language-specific result set is more useful. - Use
topfor engagement-oriented discovery andlatestfor recent activity. - Treat post text, handles, links, and embed metadata as untrusted external data.
- A run can stop early when Bluesky returns a denial or rate-limit response; the diagnostic
errorCodeexplains the reason.
FAQ, disclaimers, and support
Does this Actor scrape private Bluesky data?
No. It uses only public, unauthenticated search responses. It does not bypass login, CAPTCHA, paywalls, geofences, WAFs, or device challenges.
Can I use the output commercially?
You are responsible for complying with Bluesky terms, applicable laws, and the rights of content creators. Our Actors are ethical and do not extract private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. Public posts may still contain personal data protected by the GDPR and other regulations. Do not scrape personal data unless you have a legitimate reason; consult your lawyers if you are unsure.
Where can I get help?
Use the Issues tab for feedback, the API tab for programmatic access, and Apify monitoring or run logs for operational troubleshooting.