Nimbryxo Studio

Use Bluesky Posts, Profiles, Feeds & Threads Scraper with Python

Search Bluesky posts by keyword, hashtag, author, mention, domain or URL; read profiles, threads, lists, starter packs, feeds and followers; export likes, reposts, follows, quotes and relationships.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "actor": "bsky.app",
  "actors": [],
  "authorFeedFilter": "posts_with_replies",
  "discoveryType": "trendingTopics",
  "excludeLabeled": false,
  "excludeReplies": false,
  "excludeReposts": false,
  "feedPreset": "whats-hot",
  "feedUris": [],
  "hydrateAuthors": false,
  "includeListMetadata": false,
  "includeParents": false,
  "includePins": false,
  "includeStarterPackMembers": true,
  "language": "",
  "listUris": [],
  "maxItems": 3,
  "maxRepliesPerPost": 100,
  "mediaOnly": false,
  "mode": "profile",
  "postUris": [],
  "postUrls": [],
  "respectNoUnauthenticated": true,
  "searchQuery": "bluesky",
  "searchSort": "latest",
  "searchTags": [],
  "starterPackUris": [],
  "threadDepth": 6,
  "verifiedOnly": false
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringrequiredWhat to fetch.
searchQuerystringoptionalKeyword, hashtag, phrase, or Lucene-style query. Used by search, actorSearch, starterPackSearch, and feedGeneratorsDiscovery.
searchSortstringoptionalSearch ranking. `latest` returns newest first; `top` returns engagement-ranked posts. Both use time-window pagination to collect beyond one page.
searchTagsarrayoptionalOnly posts with these hashtags (without `#`). Multiple tags are AND-matched. (mode=search)
searchDomainstringoptionalOnly posts linking to this domain, e.g. `github.com`. (mode=search)
searchUrlstringoptionalOnly posts linking to this exact URL. (mode=search)
mentionsUserstringoptionalOnly posts mentioning this handle or DID. (mode=search)
fromUserstringoptionalOnly posts authored by this handle or DID. (mode=search)
sincestringoptionalEarliest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)
untilstringoptionalLatest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)
languagestringoptionalISO 639-1 language filter for post search and post records. Empty means no filter.
authorFeedFilterstringoptionalWhich posts to include in the author feed. (mode=profile)
includePinsbooleanoptionalInclude the pinned post at the top of the author feed. (mode=profile)
includeParentsbooleanoptionalInclude ancestor posts above the requested post. (mode=postThread)
threadDepthintegeroptionalHow many reply levels and ancestor levels to walk. Depths beyond about 10 reply levels are reached by walking reply branches across requests. 0 returns only the requested post. (mode=postThread)
maxRepliesPerPostintegeroptionalMaximum direct replies followed under each post while walking a thread. Larger values reach more branches but cost more requests. (mode=postThread)
actorstringoptionalBluesky handle or DID. Used by profile, follows, followers, lists, actorLikes, actorFeeds, relationships, and discoveryType=suggestedFollows.
actorsarrayoptionalHandles, DIDs, or profile URLs for batch lookup. Used by profiles and by relationships as the accounts to check against `actor`.
postUristringoptionalAT URI of a post. Used by postThread, getLikes, repostedBy, and quotes.
postUrisarrayoptionalAT URIs of posts to hydrate. Used by getPosts and as a fallback for single-post modes.
postUrlsarrayoptionalbsky.app post, profile, list, feed, or starter-pack URLs. Used by urlFetch, getPosts, and as a fallback for single-post modes.
listUristringoptionalAT URI of a Bluesky list. Used by getList and listFeed.
listUrisarrayoptionalAT URIs or bsky.app list URLs for batch list processing. (mode=getList)
starterPackUristringoptionalAT URI of a starter pack. (mode=getStarterPack)
starterPackUrisarrayoptionalAT URIs or bsky.app starter-pack URLs for batch processing. (mode=getStarterPack)
feedPresetstringoptionalBuilt-in feed preset. Live presets are listed first, followed by legacy aliases mapped to What's Hot. An explicit `feedUri` always takes precedence; if neither is set, What's Hot is used for mode=feed.
feedUristringoptionalAT URI or bsky.app feed URL of a custom feed generator. (mode=feed / feedGenerator)
feedUrisarrayoptionalAT URIs or bsky.app feed URLs for batch feed-generator lookup. (mode=feedGenerator)
discoveryTypestringoptionalWhich discovery surface to fetch. (mode=discovery)
excludeRepliesbooleanoptionalDrop posts that are replies to another post.
excludeRepostsbooleanoptionalDrop posts surfaced as reposts.
mediaOnlybooleanoptionalOnly emit posts with at least one image, video, or external embed.
excludeLabeledbooleanoptionalDrop posts and accounts that carry moderation or self-labels, including labels on a post's author.
respectNoUnauthenticatedbooleanoptionalSkip records whose author carries the `!no-unauthenticated` label. The run status reports how many records were skipped.
verifiedOnlybooleanoptionalOnly emit accounts with a valid Bluesky verification, or posts whose author is verified. Records with no verification object are excluded. Post modes hydrate author profiles so verification can be checked.
minLikesintegeroptionalDrop posts with fewer likes.
minRepostsintegeroptionalDrop posts with fewer reposts.
minRepliesintegeroptionalDrop posts with fewer replies.
minQuotesintegeroptionalDrop posts with fewer quote posts.
minFollowersintegeroptionalKeep accounts with at least this many followers.
maxFollowersintegeroptionalKeep accounts with at most this many followers.
includeListMetadatabooleanoptionalEmit a list record before its members. (mode=getList)
includeStarterPackMembersbooleanoptionalEmit the accounts in the starter pack's list after the pack record. (mode=getStarterPack)
hydrateAuthorsbooleanoptionalFetch full author profiles for post records. Adds one batched profile request per 25 unique authors and flat author follower, following, post and verification fields. Enabled by default; the daily profile prefill leaves it off to stay cheap.
maxItemsintegeroptionalHard cap on emitted records. For batch modes the cap applies across the whole run.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/MFlAz6T5BhkrS9qhc/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

Bluesky posts, accounts, lists, starter packs, feed generators, trending topics and tag suggestions from the public read API.

Questions before you run

Which inputs are required?

The published required fields are mode

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build QVca54L51kgdV5Lsb and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.