Bluesky Posts Search Scraper avatar

Bluesky Posts Search Scraper

Under maintenance

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Bluesky Posts Search Scraper

Bluesky Posts Search Scraper

Under maintenance

Search 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

Coding Frontned

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

8 days ago

Last modified

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?

FieldTypeDescription
postTextstringPublic text content
postUrlstringHuman-readable Bluesky post URL
authorHandlestringPublic author handle
authorDisplayNamestringPublic author display name
likeCountintegerReported likes
repostCountintegerReported reposts
replyCountintegerReported replies
quoteCountintegerReported quote posts
bookmarkCountintegerReported bookmarks
hashtags, facetLinks, mentionedDidsarrayPublic rich-text facet values
embedImages, embedImageThumbsarrayResolved public image and thumbnail URLs
embedVideoPlaylist, embedVideoThumbnailstringResolved public video media URLs
embedExternalUrlstringPublic external link URL, when present
replyParentUristringImmediate reply target, when present
indexedAtstringSearch-service index timestamp
dataAvailablebooleanfalse 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

  1. Open the Input tab.
  2. Enter a keyword or hashtag in query.
  3. Choose latest or top in sort, optionally enter a language code, and set maxItems.
  4. Start the Actor and inspect the dataset in the Output tab.
  5. 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.

FieldTypeDefaultRequiredDescription
querystringYesKeyword or hashtag; trimmed and limited to 200 characters
sortstringlatestNolatest or top
langstringemptyNoLanguage code such as en or pt-BR
maxItemsinteger50NoSuccessful posts to return, from 1 to 10,000
proxyConfigurationobjectdirectNoOptional 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 test
apify run --purge --input-file qa-inputs/local-latest.json
node validate-datasets.js
apify run --purge --input-file qa-inputs/local-top.json
node 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 maxItems modest for frequent schedules.
  • Start with direct requests. If the run environment receives an access denial, enable Apify Proxy without selecting a residential group.
  • Use lang when a language-specific result set is more useful.
  • Use top for engagement-oriented discovery and latest for 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 errorCode explains 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.