{
  "data": {
    "id": "QVca54L51kgdV5Lsb",
    "actId": "MFlAz6T5BhkrS9qhc",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-06T10:26:40.217Z",
    "finishedAt": "2026-11-06T10:26:44.210Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3918,
      "runTimeSecs": 3.918,
      "computeUnits": 0.004353333333333333,
      "imageSizeBytes": 319302144
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Bluesky Posts, Profiles, Feeds & Threads Scraper Input\",\n  \"description\": \"Search Bluesky posts with keyword, hashtag, author, mention, domain and URL filters; read profiles, author feeds, full reply branches, custom feeds, lists, starter packs, likes, reposts, quotes, actor liked posts and public relationships; and discover trending topics, feeds and starter packs. All data is public and needs no login, cookies or API key.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"profile\",\n        \"profiles\",\n        \"actorSearch\",\n        \"feed\",\n        \"postThread\",\n        \"urlFetch\",\n        \"getPosts\",\n        \"follows\",\n        \"followers\",\n        \"getLikes\",\n        \"repostedBy\",\n        \"quotes\",\n        \"actorLikes\",\n        \"getList\",\n        \"listFeed\",\n        \"lists\",\n        \"actorFeeds\",\n        \"getStarterPack\",\n        \"starterPackSearch\",\n        \"feedGenerator\",\n        \"feedGeneratorsDiscovery\",\n        \"relationships\",\n        \"discovery\"\n      ],\n      \"enumTitles\": [\n        \"Search posts - keyword, hashtag, author, mention, domain or URL\",\n        \"Profile - metadata plus recent posts\",\n        \"Profiles - batch lookup by handle or DID\",\n        \"Account search - find users by keyword\",\n        \"Feed - custom feed or built-in preset\",\n        \"Post thread - post, full reply branches, optional parents\",\n        \"URL fetch - expand bsky.app post, profile, list, feed or starter-pack URLs\",\n        \"Get posts - batch-hydrate AT URIs or post URLs\",\n        \"Follows - accounts a user follows\",\n        \"Followers - accounts following a user\",\n        \"Likes - accounts that liked a post\",\n        \"Reposts - accounts that reposted a post\",\n        \"Quotes - posts quoting a post\",\n        \"Actor likes - posts an account liked, via its public PDS\",\n        \"List members - one or more lists, optional list metadata\",\n        \"List feed - posts in a list\",\n        \"Lists - lists created by an account\",\n        \"Actor feeds - feed generators created by an account\",\n        \"Starter packs - pack details and members\",\n        \"Starter-pack search - find starter packs by keyword\",\n        \"Feed generator - details for one or more feeds\",\n        \"Feed discovery - popular feed generators\",\n        \"Relationships - public follow/block checks for supplied accounts\",\n        \"Discovery - trending topics, suggested feeds, starter packs, tags, follows\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"profile\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query\",\n      \"type\": \"string\",\n      \"description\": \"Keyword, hashtag, phrase, or Lucene-style query. Used by search, actorSearch, starterPackSearch, and feedGeneratorsDiscovery.\",\n      \"editor\": \"textfield\",\n      \"default\": \"bluesky\",\n      \"prefill\": \"bluesky\"\n    },\n    \"searchSort\": {\n      \"title\": \"Search sort\",\n      \"type\": \"string\",\n      \"description\": \"Search ranking. `latest` returns newest first; `top` returns engagement-ranked posts. Both use time-window pagination to collect beyond one page.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"top\",\n        \"latest\"\n      ],\n      \"enumTitles\": [\n        \"Top - engagement-ranked\",\n        \"Latest - newest first (supports deeper collection)\"\n      ],\n      \"default\": \"latest\",\n      \"prefill\": \"latest\"\n    },\n    \"searchTags\": {\n      \"title\": \"Search hashtags\",\n      \"type\": \"array\",\n      \"description\": \"Only posts with these hashtags (without `#`). Multiple tags are AND-matched. (mode=search)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"searchDomain\": {\n      \"title\": \"Search domain\",\n      \"type\": \"string\",\n      \"description\": \"Only posts linking to this domain, e.g. `github.com`. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"searchUrl\": {\n      \"title\": \"Search URL\",\n      \"type\": \"string\",\n      \"description\": \"Only posts linking to this exact URL. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"mentionsUser\": {\n      \"title\": \"Mentioning user\",\n      \"type\": \"string\",\n      \"description\": \"Only posts mentioning this handle or DID. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"fromUser\": {\n      \"title\": \"From user\",\n      \"type\": \"string\",\n      \"description\": \"Only posts authored by this handle or DID. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"since\": {\n      \"title\": \"Since\",\n      \"type\": \"string\",\n      \"description\": \"Earliest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"until\": {\n      \"title\": \"Until\",\n      \"type\": \"string\",\n      \"description\": \"Latest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)\",\n      \"editor\": \"textfield\"\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"ISO 639-1 language filter for post search and post records. Empty means no filter.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"ab\",\n        \"aa\",\n        \"af\",\n        \"ak\",\n        \"sq\",\n        \"am\",\n        \"ar\",\n        \"an\",\n        \"hy\",\n        \"as\",\n        \"av\",\n        \"ae\",\n        \"ay\",\n        \"az\",\n        \"bm\",\n        \"ba\",\n        \"eu\",\n        \"be\",\n        \"bn\",\n        \"bi\",\n        \"bs\",\n        \"br\",\n        \"bg\",\n        \"my\",\n        \"ca\",\n        \"ch\",\n        \"ce\",\n        \"ny\",\n        \"zh\",\n        \"cu\",\n        \"cv\",\n        \"kw\",\n        \"co\",\n        \"cr\",\n        \"hr\",\n        \"cs\",\n        \"da\",\n        \"dv\",\n        \"nl\",\n        \"dz\",\n        \"en\",\n        \"eo\",\n        \"et\",\n        \"ee\",\n        \"fo\",\n        \"fj\",\n        \"fi\",\n        \"fr\",\n        \"ff\",\n        \"gl\",\n        \"lg\",\n        \"ka\",\n        \"de\",\n        \"gn\",\n        \"gu\",\n        \"ht\",\n        \"ha\",\n        \"he\",\n        \"hz\",\n        \"hi\",\n        \"ho\",\n        \"hu\",\n        \"is\",\n        \"io\",\n        \"ig\",\n        \"id\",\n        \"ia\",\n        \"ie\",\n        \"iu\",\n        \"ik\",\n        \"ga\",\n        \"it\",\n        \"ja\",\n        \"jv\",\n        \"kl\",\n        \"kn\",\n        \"kr\",\n        \"ks\",\n        \"kk\",\n        \"km\",\n        \"ki\",\n        \"rw\",\n        \"ky\",\n        \"kv\",\n        \"kg\",\n        \"ko\",\n        \"kj\",\n        \"ku\",\n        \"lo\",\n        \"la\",\n        \"lv\",\n        \"li\",\n        \"ln\",\n        \"lt\",\n        \"lu\",\n        \"lb\",\n        \"mk\",\n        \"mg\",\n        \"ms\",\n        \"ml\",\n        \"mt\",\n        \"gv\",\n        \"mi\",\n        \"mr\",\n        \"mh\",\n        \"el\",\n        \"mn\",\n        \"na\",\n        \"nv\",\n        \"ng\",\n        \"ne\",\n        \"nd\",\n        \"se\",\n        \"no\",\n        \"nb\",\n        \"nn\",\n        \"oc\",\n        \"oj\",\n        \"or\",\n        \"om\",\n        \"os\",\n        \"pi\",\n        \"pa\",\n        \"fa\",\n        \"pl\",\n        \"pt\",\n        \"ps\",\n        \"qu\",\n        \"ro\",\n        \"rm\",\n        \"rn\",\n        \"ru\",\n        \"sm\",\n        \"sg\",\n        \"sa\",\n        \"sc\",\n        \"gd\",\n        \"sr\",\n        \"sh\",\n        \"sn\",\n        \"ii\",\n        \"sd\",\n        \"si\",\n        \"sk\",\n        \"sl\",\n        \"so\",\n        \"nr\",\n        \"st\",\n        \"es\",\n        \"su\",\n        \"sw\",\n        \"ss\",\n        \"sv\",\n        \"tl\",\n        \"ty\",\n        \"tg\",\n        \"ta\",\n        \"tt\",\n        \"te\",\n        \"th\",\n        \"bo\",\n        \"ti\",\n        \"to\",\n        \"ts\",\n        \"tn\",\n        \"tr\",\n        \"tk\",\n        \"tw\",\n        \"ug\",\n        \"uk\",\n        \"ur\",\n        \"uz\",\n        \"ve\",\n        \"vi\",\n        \"vo\",\n        \"wa\",\n        \"cy\",\n        \"fy\",\n        \"wo\",\n        \"xh\",\n        \"yi\",\n        \"yo\",\n        \"za\",\n        \"zu\"\n      ],\n      \"enumTitles\": [\n        \"(no filter)\",\n        \"Abkhazian\",\n        \"Afar\",\n        \"Afrikaans\",\n        \"Akan\",\n        \"Albanian\",\n        \"Amharic\",\n        \"Arabic\",\n        \"Aragonese\",\n        \"Armenian\",\n        \"Assamese\",\n        \"Avaric\",\n        \"Avestan\",\n        \"Aymara\",\n        \"Azerbaijani\",\n        \"Bambara\",\n        \"Bashkir\",\n        \"Basque\",\n        \"Belarusian\",\n        \"Bengali\",\n        \"Bislama\",\n        \"Bosnian\",\n        \"Breton\",\n        \"Bulgarian\",\n        \"Burmese\",\n        \"Catalan\",\n        \"Chamorro\",\n        \"Chechen\",\n        \"Chichewa\",\n        \"Chinese\",\n        \"Church Slavic\",\n        \"Chuvash\",\n        \"Cornish\",\n        \"Corsican\",\n        \"Cree\",\n        \"Croatian\",\n        \"Czech\",\n        \"Danish\",\n        \"Divehi\",\n        \"Dutch\",\n        \"Dzongkha\",\n        \"English\",\n        \"Esperanto\",\n        \"Estonian\",\n        \"Ewe\",\n        \"Faroese\",\n        \"Fijian\",\n        \"Finnish\",\n        \"French\",\n        \"Fulah\",\n        \"Galician\",\n        \"Ganda\",\n        \"Georgian\",\n        \"German\",\n        \"Guarani\",\n        \"Gujarati\",\n        \"Haitian\",\n        \"Hausa\",\n        \"Hebrew\",\n        \"Herero\",\n        \"Hindi\",\n        \"Hiri Motu\",\n        \"Hungarian\",\n        \"Icelandic\",\n        \"Ido\",\n        \"Igbo\",\n        \"Indonesian\",\n        \"Interlingua (International Auxiliary Language Association)\",\n        \"Interlingue\",\n        \"Inuktitut\",\n        \"Inupiaq\",\n        \"Irish\",\n        \"Italian\",\n        \"Japanese\",\n        \"Javanese\",\n        \"Kalaallisut\",\n        \"Kannada\",\n        \"Kanuri\",\n        \"Kashmiri\",\n        \"Kazakh\",\n        \"Khmer\",\n        \"Kikuyu\",\n        \"Kinyarwanda\",\n        \"Kirghiz\",\n        \"Komi\",\n        \"Kongo\",\n        \"Korean\",\n        \"Kuanyama\",\n        \"Kurdish\",\n        \"Lao\",\n        \"Latin\",\n        \"Latvian\",\n        \"Limburgan\",\n        \"Lingala\",\n        \"Lithuanian\",\n        \"Luba-Katanga\",\n        \"Luxembourgish\",\n        \"Macedonian\",\n        \"Malagasy\",\n        \"Malay (macrolanguage)\",\n        \"Malayalam\",\n        \"Maltese\",\n        \"Manx\",\n        \"Maori\",\n        \"Marathi\",\n        \"Marshallese\",\n        \"Modern Greek (1453-)\",\n        \"Mongolian\",\n        \"Nauru\",\n        \"Navajo\",\n        \"Ndonga\",\n        \"Nepali (macrolanguage)\",\n        \"North Ndebele\",\n        \"Northern Sami\",\n        \"Norwegian\",\n        \"Norwegian Bokmål\",\n        \"Norwegian Nynorsk\",\n        \"Occitan (post 1500)\",\n        \"Ojibwa\",\n        \"Oriya (macrolanguage)\",\n        \"Oromo\",\n        \"Ossetian\",\n        \"Pali\",\n        \"Panjabi\",\n        \"Persian\",\n        \"Polish\",\n        \"Portuguese\",\n        \"Pushto\",\n        \"Quechua\",\n        \"Romanian\",\n        \"Romansh\",\n        \"Rundi\",\n        \"Russian\",\n        \"Samoan\",\n        \"Sango\",\n        \"Sanskrit\",\n        \"Sardinian\",\n        \"Scottish Gaelic\",\n        \"Serbian\",\n        \"Serbo-Croatian\",\n        \"Shona\",\n        \"Sichuan Yi\",\n        \"Sindhi\",\n        \"Sinhala\",\n        \"Slovak\",\n        \"Slovenian\",\n        \"Somali\",\n        \"South Ndebele\",\n        \"Southern Sotho\",\n        \"Spanish\",\n        \"Sundanese\",\n        \"Swahili (macrolanguage)\",\n        \"Swati\",\n        \"Swedish\",\n        \"Tagalog\",\n        \"Tahitian\",\n        \"Tajik\",\n        \"Tamil\",\n        \"Tatar\",\n        \"Telugu\",\n        \"Thai\",\n        \"Tibetan\",\n        \"Tigrinya\",\n        \"Tonga (Tonga Islands)\",\n        \"Tsonga\",\n        \"Tswana\",\n        \"Turkish\",\n        \"Turkmen\",\n        \"Twi\",\n        \"Uighur\",\n        \"Ukrainian\",\n        \"Urdu\",\n        \"Uzbek\",\n        \"Venda\",\n        \"Vietnamese\",\n        \"Volapük\",\n        \"Walloon\",\n        \"Welsh\",\n        \"Western Frisian\",\n        \"Wolof\",\n        \"Xhosa\",\n        \"Yiddish\",\n        \"Yoruba\",\n        \"Zhuang\",\n        \"Zulu\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"authorFeedFilter\": {\n      \"title\": \"Author feed filter\",\n      \"type\": \"string\",\n      \"description\": \"Which posts to include in the author feed. (mode=profile)\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"posts_with_replies\",\n        \"posts_no_replies\",\n        \"posts_with_media\",\n        \"posts_and_author_threads\"\n      ],\n      \"enumTitles\": [\n        \"Posts with replies\",\n        \"Original posts only\",\n        \"Posts with media\",\n        \"Posts and author threads\"\n      ],\n      \"default\": \"posts_with_replies\",\n      \"prefill\": \"posts_with_replies\"\n    },\n    \"includePins\": {\n      \"title\": \"Include pinned post\",\n      \"type\": \"boolean\",\n      \"description\": \"Include the pinned post at the top of the author feed. (mode=profile)\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeParents\": {\n      \"title\": \"Include parent posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Include ancestor posts above the requested post. (mode=postThread)\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"threadDepth\": {\n      \"title\": \"Thread depth\",\n      \"type\": \"integer\",\n      \"description\": \"How 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)\",\n      \"minimum\": 0,\n      \"maximum\": 1000,\n      \"default\": 6,\n      \"prefill\": 6\n    },\n    \"maxRepliesPerPost\": {\n      \"title\": \"Max replies per post\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum direct replies followed under each post while walking a thread. Larger values reach more branches but cost more requests. (mode=postThread)\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 100,\n      \"prefill\": 100\n    },\n    \"actor\": {\n      \"title\": \"Handle or DID\",\n      \"type\": \"string\",\n      \"description\": \"Bluesky handle or DID. Used by profile, follows, followers, lists, actorLikes, actorFeeds, relationships, and discoveryType=suggestedFollows.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"bsky.app\"\n    },\n    \"actors\": {\n      \"title\": \"Handles or DIDs\",\n      \"type\": \"array\",\n      \"description\": \"Handles, DIDs, or profile URLs for batch lookup. Used by profiles and by relationships as the accounts to check against `actor`.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"postUri\": {\n      \"title\": \"Post AT URI\",\n      \"type\": \"string\",\n      \"description\": \"AT URI of a post. Used by postThread, getLikes, repostedBy, and quotes.\",\n      \"editor\": \"textfield\"\n    },\n    \"postUris\": {\n      \"title\": \"Post AT URIs\",\n      \"type\": \"array\",\n      \"description\": \"AT URIs of posts to hydrate. Used by getPosts and as a fallback for single-post modes.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"postUrls\": {\n      \"title\": \"Bluesky URLs\",\n      \"type\": \"array\",\n      \"description\": \"bsky.app post, profile, list, feed, or starter-pack URLs. Used by urlFetch, getPosts, and as a fallback for single-post modes.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"listUri\": {\n      \"title\": \"List AT URI\",\n      \"type\": \"string\",\n      \"description\": \"AT URI of a Bluesky list. Used by getList and listFeed.\",\n      \"editor\": \"textfield\"\n    },\n    \"listUris\": {\n      \"title\": \"List AT URIs\",\n      \"type\": \"array\",\n      \"description\": \"AT URIs or bsky.app list URLs for batch list processing. (mode=getList)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"starterPackUri\": {\n      \"title\": \"Starter pack AT URI\",\n      \"type\": \"string\",\n      \"description\": \"AT URI of a starter pack. (mode=getStarterPack)\",\n      \"editor\": \"textfield\"\n    },\n    \"starterPackUris\": {\n      \"title\": \"Starter pack AT URIs\",\n      \"type\": \"array\",\n      \"description\": \"AT URIs or bsky.app starter-pack URLs for batch processing. (mode=getStarterPack)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"feedPreset\": {\n      \"title\": \"Feed preset\",\n      \"type\": \"string\",\n      \"description\": \"Built-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.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"whats-hot\",\n        \"bsky-team\",\n        \"hot-classic\",\n        \"discover\",\n        \"mutuals\",\n        \"popular-with-friends\",\n        \"for-you\",\n        \"news\",\n        \"trending-videos\",\n        \"quiet-posters\"\n      ],\n      \"enumTitles\": [\n        \"What's Hot\",\n        \"Bluesky Team\",\n        \"Hot Classic\",\n        \"Legacy: Discover (uses What's Hot)\",\n        \"Legacy: Mutuals (uses What's Hot)\",\n        \"Legacy: Popular With Friends (uses What's Hot)\",\n        \"Legacy: For You (uses What's Hot)\",\n        \"Legacy: News (uses What's Hot)\",\n        \"Legacy: Trending Videos (uses What's Hot)\",\n        \"Legacy: Quiet Posters (uses What's Hot)\"\n      ],\n      \"prefill\": \"whats-hot\"\n    },\n    \"feedUri\": {\n      \"title\": \"Feed AT URI\",\n      \"type\": \"string\",\n      \"description\": \"AT URI or bsky.app feed URL of a custom feed generator. (mode=feed / feedGenerator)\",\n      \"editor\": \"textfield\"\n    },\n    \"feedUris\": {\n      \"title\": \"Feed AT URIs\",\n      \"type\": \"array\",\n      \"description\": \"AT URIs or bsky.app feed URLs for batch feed-generator lookup. (mode=feedGenerator)\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"discoveryType\": {\n      \"title\": \"Discovery type\",\n      \"type\": \"string\",\n      \"description\": \"Which discovery surface to fetch. (mode=discovery)\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"trendingTopics\",\n        \"suggestedFeeds\",\n        \"suggestedStarterPacks\",\n        \"taggedSuggestions\",\n        \"suggestedFollows\"\n      ],\n      \"enumTitles\": [\n        \"Trending topics\",\n        \"Suggested feeds\",\n        \"Suggested starter packs\",\n        \"Tagged suggestions\",\n        \"Suggested follows\"\n      ],\n      \"default\": \"trendingTopics\",\n      \"prefill\": \"trendingTopics\"\n    },\n    \"excludeReplies\": {\n      \"title\": \"Exclude replies\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts that are replies to another post.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeReposts\": {\n      \"title\": \"Exclude reposts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts surfaced as reposts.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"mediaOnly\": {\n      \"title\": \"Media only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only emit posts with at least one image, video, or external embed.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"excludeLabeled\": {\n      \"title\": \"Exclude labeled\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop posts and accounts that carry moderation or self-labels, including labels on a post's author.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"respectNoUnauthenticated\": {\n      \"title\": \"Respect no-unauthenticated accounts\",\n      \"type\": \"boolean\",\n      \"description\": \"Skip records whose author carries the `!no-unauthenticated` label. The run status reports how many records were skipped.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"verifiedOnly\": {\n      \"title\": \"Verified only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only 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.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"minLikes\": {\n      \"title\": \"Minimum likes\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer likes.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minReposts\": {\n      \"title\": \"Minimum reposts\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer reposts.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minReplies\": {\n      \"title\": \"Minimum replies\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer replies.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minQuotes\": {\n      \"title\": \"Minimum quotes\",\n      \"type\": \"integer\",\n      \"description\": \"Drop posts with fewer quote posts.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000\n    },\n    \"minFollowers\": {\n      \"title\": \"Minimum followers\",\n      \"type\": \"integer\",\n      \"description\": \"Keep accounts with at least this many followers.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"maxFollowers\": {\n      \"title\": \"Maximum followers\",\n      \"type\": \"integer\",\n      \"description\": \"Keep accounts with at most this many followers.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"includeListMetadata\": {\n      \"title\": \"Include list metadata\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit a list record before its members. (mode=getList)\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeStarterPackMembers\": {\n      \"title\": \"Include starter-pack members\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit the accounts in the starter pack's list after the pack record. (mode=getStarterPack)\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"hydrateAuthors\": {\n      \"title\": \"Hydrate post authors\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch 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.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on emitted records. For batch modes the cap applies across the whole run.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 40,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Bluesky Posts, Profiles, Feeds & Threads Scraper\r\n\r\nScrape **Bluesky** public data without a login, cookies or an API key. Search posts by keyword, hashtag, author, mention, domain or URL; read profiles, author feeds, full thread reply branches, lists, starter packs, custom feeds, likes, reposts, quotes, actor liked posts and public relationships; and discover trending topics and suggested communities. Every record has flat top-level fields with a few natural nested objects, absolute URLs, ISO dates and omit-empty output.\r\n\r\n## What this actor does\r\n\r\n- **24 modes** across posts, accounts, threads, lists, starter packs, feed generators, relationships and discovery.\r\n- **Post search with the full public filter surface**: keyword, hashtag, author, mention, domain, URL, date range, language and top/latest ranking.\r\n- **Search beyond the first page**: both `searchSort=latest` and `searchSort=top` walk backwards through time windows. Latest is newest-first; Top preserves engagement ranking within each window. Cursor paging is not used because Bluesky rejects anonymous cursors.\r\n- **Full thread reply trees**: `threadDepth` walks deeper than the ~10-level per-request limit by fetching truncated reply branches separately. `maxRepliesPerPost` bounds fan-out and `threadTruncated` marks records whose children were cut short.\r\n- **Actor likes without credentials**: `mode=actorLikes` reads the account's public like records from its personal data server and hydrates the liked posts, with `likedAt` and like-record fields.\r\n- **More public surfaces**: `mode=actorFeeds` lists an account's feed generators, `mode=starterPackSearch` searches starter packs, and `mode=relationships` checks public follow/block relationships for supplied accounts.\r\n- **Rich records**: engagement counts, languages, mentions, hashtags, links, domains, images, video, external embeds, quoted posts, reposts, reply roots, labels, self-labels, verification, live status, pinned posts, profile counts and flat author follower counts.\r\n- **Privacy-aware**: accounts marked `!no-unauthenticated` are skipped by default, and the run status reports how many records were skipped.\r\n- **Batch-friendly**: multiple profiles, posts, lists, starter packs, feeds and URLs per run, with automatic de-duplication.\r\n- **No credentials required.** Every mode reads public data. If Bluesky temporarily blocks a search request from the actor's network, the actor retries it automatically and reports a clear status if it still fails.\r\n\r\n## Output per record\r\n\r\nEvery record carries `recordType`, `sourceUrl` and `scrapedAt`. Empty values are omitted at every depth, so the dataset never contains nulls or empty placeholders.\r\n\r\n### Post records (`recordType=post`)\r\n\r\n- `uri` - canonical AT URI\r\n- `cid` - content identifier\r\n- `id` - same as `uri`\r\n- `url` - public `bsky.app` post URL\r\n- `sourceUrl` - same as `url`\r\n- `text` - post text\r\n- `createdAt`, `indexedAt` - ISO 8601 timestamps\r\n- `language` - first declared language\r\n- `languages[]` - all declared languages\r\n- `replyCount`, `repostCount`, `likeCount`, `quoteCount`, `bookmarkCount`\r\n- `isReply` - true when the post replies to another post\r\n- `inReplyToUri`, `inReplyToCid` - parent post\r\n- `rootUri`, `rootCid` - thread root\r\n- `isRepost` - true when surfaced as a repost\r\n- `repostedBy` - handle that reposted it\r\n- `repostUri`, `repostCid`, `repostedAt` - repost metadata\r\n- `isQuote` - true when the post quotes another post\r\n- `threadTruncated` - true on a thread record whose direct replies were cut by `maxRepliesPerPost`, `maxItems` or a public-API gap (`mode=postThread`)\r\n- `likedAt`, `likedBy`, `likedByDid`, `likeUri`, `likeCid` - like-record metadata added by `mode=actorLikes`\r\n- `quotedPost` - `{uri, cid, text, createdAt, indexedAt, authorHandle, authorDid, authorDisplayName, authorAvatar, url, likeCount, repostCount, replyCount, quoteCount, labels, labelValues, mediaAttachments}`\r\n- `mentions[]` - mentioned DIDs\r\n- `tags[]` - hashtags, lowercase\r\n- `urls[]` - external links\r\n- `domains[]` - hostnames from `urls[]`\r\n- `mediaAttachments[]` - `{type, url, previewUrl, description, width, height, presentation, title}` for images, video and external embeds\r\n- `hasMedia`, `mediaTypes[]`\r\n- `labels[]` - `{val, src, uri, cid, cts, ver}`\r\n- `labelValues[]` - label values only\r\n- `selfLabels[]` - author-applied labels\r\n- `author` - `{did, handle, displayName, avatar, createdAt, profileUrl, labels, labelValues, verification, status}`; with `hydrateAuthors=true` (the default) it also includes `description`, `banner`, `followersCount`, `followsCount`, `postsCount`, `indexedAt`, `pinnedPostUri`, `pinnedPostCid`. The hydrated profile's `handle` and `did` replace stale values, and `url`, `sourceUrl` and `authorHandle` are recomputed\r\n- `authorFollowersCount`, `authorFollowsCount`, `authorPostsCount`, `authorVerified` - flat author stats added when `hydrateAuthors=true`\r\n- `authorHandle` - convenience field\r\n- `hitsTotal`, `searchHitsTotal` - search-result totals when Bluesky returns them (the value is capped/rounded by the source, so treat it as an estimate)\r\n\r\n### Account records (`recordType=account`, `like`, `listMember`, `repost` or `starterPackMember`)\r\n\r\n- `did`, `id`, `handle`, `displayName`, `description`, `pronouns`\r\n- `avatar`, `banner`\r\n- `followersCount`, `followsCount`, `postsCount`\r\n- `createdAt`, `indexedAt`\r\n- `url`, `sourceUrl` - public profile URL\r\n- `labels[]`, `labelValues[]`\r\n- `verification` - `{verifiedStatus, trustedVerifierStatus, verifications[]}`\r\n- `associated` - `{listsCount, feedGeneratorsCount, starterPacksCount, isLabeler, chatAllowIncoming, chatAllowGroupInvites, activitySubscription}`\r\n- `status` - `{type, createdAt, durationMinutes, expiresAt, isActive, embed}`\r\n- `pinnedPostUri`, `pinnedPostCid`\r\n- `relation` - `profile`, `searchMatch`, `follower`, `following`, `liked`, `reposted`, `listMember`, `starterPackMember`, `suggestedFollow` or `relationship`\r\n- `likedAt`, `likedPostUri` - for `mode=getLikes`\r\n- `repostedPostUri` - for `mode=repostedBy`\r\n- `listUri`, `listName` - for list members\r\n- `starterPackUri` - for starter-pack members\r\n- `relationshipActor`, `isFollowing`, `isFollowedBy`, `isMutualFollow` - for `mode=relationships`\r\n- `following`, `followedBy`, `blocking`, `blockedBy` - public relationship record URIs when present\r\n\r\n### List records (`recordType=list`)\r\n\r\n- `uri`, `cid`, `id`, `name`, `purpose`, `description`\r\n- `listItemCount`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `url`, `sourceUrl` - public list URL\r\n\r\n### Starter-pack records (`recordType=starterPack`)\r\n\r\n- `uri`, `cid`, `id`, `name`, `description`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `listUri`, `listName`, `listItemCount`\r\n- `joinedAllTimeCount`, `joinedWeekCount`\r\n- `createdAt`, `updatedAt`\r\n- `feeds[]` - `{uri, displayName, description, avatar, creatorHandle}`\r\n- `listItemsSample[]` - sample account summaries\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `url`, `sourceUrl` - public starter-pack URL\r\n\r\n### Feed-generator records (`recordType=feedGenerator`)\r\n\r\n- `uri`, `cid`, `id`, `did`\r\n- `displayName`, `description`, `avatar`\r\n- `likeCount`, `acceptsInteractions`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `isOnline`, `isValid` - when fetched with `mode=feedGenerator`\r\n- `url`, `sourceUrl` - public feed URL\r\n\r\n### Discovery records\r\n\r\n- `recordType=trendingTopic`: `topic`, `displayName`, `description`, `link`, `url`, `sourceUrl`, `rank`\r\n- `recordType=taggedSuggestion`: `tag`, `subjectType`, `subject`, `url`, `sourceUrl`\r\n\r\nWhen a discovery item has no public target URL, `url` and `sourceUrl` fall back to the Bluesky home page so every record still has a source link.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | Enum | `search` | `search` / `profile` / `profiles` / `actorSearch` / `feed` / `postThread` / `urlFetch` / `getPosts` / `follows` / `followers` / `getLikes` / `repostedBy` / `quotes` / `actorLikes` / `getList` / `listFeed` / `lists` / `actorFeeds` / `getStarterPack` / `starterPackSearch` / `feedGenerator` / `feedGeneratorsDiscovery` / `relationships` / `discovery` |\r\n| `searchQuery` | String | `bluesky` | Keyword, hashtag, phrase or Lucene-style query. Used by `search`, `actorSearch`, `starterPackSearch` and `feedGeneratorsDiscovery` |\r\n| `searchSort` | Enum | `latest` | `latest` (newest first; supports deeper collection) or `top` (engagement-ranked, capped at about 100 posts) |\r\n| `searchTags` | Array | `[]` | Hashtags without `#`; multiple tags are AND-matched (`mode=search`) |\r\n| `searchDomain` | String | – | Only posts linking to this domain (`mode=search`) |\r\n| `searchUrl` | String | – | Only posts linking to this exact URL (`mode=search`) |\r\n| `mentionsUser` | String | – | Only posts mentioning this handle or DID (`mode=search`) |\r\n| `fromUser` | String | – | Only posts authored by this handle or DID (`mode=search`) |\r\n| `since` | String | – | Earliest post date (`YYYY-MM-DD` or ISO datetime); a bare date starts at 00:00 UTC (`mode=search`) |\r\n| `until` | String | – | Latest post date (`YYYY-MM-DD` or ISO datetime); a bare date includes the whole day through 23:59:59.999999 UTC (`mode=search`) |\r\n| `language` | Enum | – | ISO 639-1 language filter; empty means no filter |\r\n| `authorFeedFilter` | Enum | `posts_with_replies` | `posts_with_replies` / `posts_no_replies` / `posts_with_media` / `posts_and_author_threads` (`mode=profile`) |\r\n| `includePins` | Boolean | `false` | Include the pinned post at the top of the author feed (`mode=profile`) |\r\n| `includeParents` | Boolean | `false` | Include ancestor posts above the requested post (`mode=postThread`) |\r\n| `threadDepth` | Integer | `6` | Reply and ancestor levels to walk, 0-1000. Depths beyond about 10 reply levels are reached by walking branches across requests (`mode=postThread`) |\r\n| `maxRepliesPerPost` | Integer | `100` | Maximum direct replies followed under each post while walking a thread, 1-1000 (`mode=postThread`) |\r\n| `actor` | String | – | Handle or DID. Used by `profile`, `follows`, `followers`, `lists`, `actorLikes`, `actorFeeds`, `relationships` and `discoveryType=suggestedFollows` |\r\n| `actors` | Array | `[]` | Handles, DIDs or profile URLs for `mode=profiles`; the accounts to check against `actor` for `mode=relationships` |\r\n| `postUri` | String | – | AT URI of a post. Used by `postThread`, `getLikes`, `repostedBy` and `quotes` |\r\n| `postUris` | Array | `[]` | AT URIs to hydrate (`mode=getPosts`; fallback for single-post modes) |\r\n| `postUrls` | Array | `[]` | bsky.app post URLs for `getPosts`; post, profile, list, feed or starter-pack URLs for `urlFetch`; fallback for single-post modes |\r\n| `listUri` | String | – | AT URI of a list (`mode=getList`, `mode=listFeed`) |\r\n| `listUris` | Array | `[]` | AT URIs or list URLs for batch list processing (`mode=getList`) |\r\n| `starterPackUri` | String | – | AT URI of a starter pack (`mode=getStarterPack`) |\r\n| `starterPackUris` | Array | `[]` | AT URIs or starter-pack URLs for batch processing (`mode=getStarterPack`) |\r\n| `feedPreset` | Enum | - | `whats-hot` / `bsky-team` / `hot-classic`; an explicit `feedUri` always wins. Legacy names (`discover`, `mutuals`, `popular-with-friends`, `for-you`, `news`, `trending-videos`, `quiet-posters`) are accepted and mapped to What's Hot. If neither is set, `mode=feed` uses What's Hot |\r\n| `feedUri` | String | – | AT URI or bsky.app feed URL (`mode=feed`, `mode=feedGenerator`) |\r\n| `feedUris` | Array | `[]` | AT URIs or feed URLs for batch lookup (`mode=feedGenerator`) |\r\n| `discoveryType` | Enum | `trendingTopics` | `trendingTopics` / `suggestedFeeds` / `suggestedStarterPacks` / `taggedSuggestions` / `suggestedFollows` (`mode=discovery`) |\r\n| `excludeReplies` | Boolean | `false` | Drop posts that are replies |\r\n| `excludeReposts` | Boolean | `false` | Drop reposts |\r\n| `mediaOnly` | Boolean | `false` | Only posts with at least one image, video or external embed |\r\n| `excludeLabeled` | Boolean | `false` | Drop posts and accounts that carry moderation or self-labels, including labels on a post's author |\r\n| `respectNoUnauthenticated` | Boolean | `true` | Skip records whose author carries `!no-unauthenticated`; the run status reports the skipped count |\r\n| `verifiedOnly` | Boolean | `false` | Only verified accounts, or posts whose author is verified. Records with no verification object are excluded; post modes hydrate author profiles to check |\r\n| `minLikes` | Integer | – | Drop posts below this like count, 0-10,000,000 |\r\n| `minReposts` | Integer | – | Drop posts below this repost count, 0-10,000,000 |\r\n| `minReplies` | Integer | – | Drop posts below this reply count, 0-10,000,000 |\r\n| `minQuotes` | Integer | – | Drop posts below this quote count, 0-10,000,000 |\r\n| `minFollowers` | Integer | – | Keep accounts with at least this many followers, 0-1,000,000,000 |\r\n| `maxFollowers` | Integer | – | Keep accounts with at most this many followers, 0-1,000,000,000 |\r\n| `includeListMetadata` | Boolean | `false` | Emit a list record before its members (`mode=getList`) |\r\n| `includeStarterPackMembers` | Boolean | `true` | Emit the pack's member accounts (`mode=getStarterPack`) |\r\n| `hydrateAuthors` | Boolean | `true` | Fetch full author profiles for post records in batches of 25 and add flat author follower, following, post and verification fields. Automatically enabled when `verifiedOnly=true`; the daily profile prefill leaves it off to stay cheap |\r\n| `maxItems` | Integer | `40` | Hard cap on emitted records, 1-5000. Source exhaustion or Bluesky caps may return fewer; the run status reports a shortfall |\r\n\r\nLegacy saved tasks that specify `mode=getActorLikes` are mapped to `actorLikes` with a status message. That mode reads the account's public like records from its personal data server and hydrates the liked posts; no login or app password is used.\r\n\r\n### Example: brand monitoring with filters\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQuery\": \"bluesky\",\r\n  \"searchSort\": \"latest\",\r\n  \"searchTags\": [\"opensource\"],\r\n  \"language\": \"en\",\r\n  \"minLikes\": 10,\r\n  \"maxItems\": 300\r\n}\r\n```\r\n\r\n### Example: a user's profile and recent media posts\r\n\r\n```json\r\n{\r\n  \"mode\": \"profile\",\r\n  \"actor\": \"bsky.app\",\r\n  \"authorFeedFilter\": \"posts_with_media\",\r\n  \"includePins\": true,\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n### Example: a thread with parents and replies\r\n\r\n```json\r\n{\r\n  \"mode\": \"postThread\",\r\n  \"postUri\": \"at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3l6oveex3ii2l\",\r\n  \"includeParents\": true,\r\n  \"threadDepth\": 30,\r\n  \"maxRepliesPerPost\": 100,\r\n  \"maxItems\": 200\r\n}\r\n```\r\n\r\n### Example: posts an account liked\r\n\r\n```json\r\n{\r\n  \"mode\": \"actorLikes\",\r\n  \"actor\": \"bsky.app\",\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: audience export with follower counts\r\n\r\n```json\r\n{\r\n  \"mode\": \"followers\",\r\n  \"actor\": \"jay.bsky.team\",\r\n  \"minFollowers\": 100,\r\n  \"maxItems\": 500\r\n}\r\n```\r\n\r\n### Example: discover trending topics\r\n\r\n```json\r\n{\r\n  \"mode\": \"discovery\",\r\n  \"discoveryType\": \"trendingTopics\",\r\n  \"maxItems\": 20\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Social listening and brand monitoring** - track keywords, hashtags, mentions, domains and authors with date and engagement filters.\r\n- **Influencer and KOL research** - combine account search with follower ranges, verification and profile counts.\r\n- **Audience and lead export** - export followers, follows, likers, reposters, list members and starter-pack members with handles, bios and counts.\r\n- **Conversation analysis** - capture a post, its ancestors and replies up to `threadDepth` for sentiment or narrative research.\r\n- **Content and LLM datasets** - collect post text, languages, hashtags, links, media metadata and engagement counts.\r\n- **Community mapping** - explore lists, list feeds, starter packs, custom feeds and trending topics.\r\n\r\n## FAQ\r\n\r\n**Do I need a Bluesky account or login?**\r\nNo. Every mode reads public data. No cookies or API keys are needed. If Bluesky temporarily blocks a search request from the actor's network, the actor retries it automatically through an Apify connection and reports a clear status if it still fails. No proxy setup is required.\r\n\r\n**How far back can a keyword search go?**\r\n`searchSort=latest` walks backwards through time windows and can return far more than the 100-post relevance cap. `searchSort=top` is relevance-ranked and limited to about 100 posts per query. Time-window search is approximate: pages can overlap, so results are de-duplicated by post URI, and a narrow or wide date range changes how predictable the volume is. When Bluesky returns a search hit total it is exposed as `hitsTotal`/`searchHitsTotal`, but the source caps and rounds that number.\r\n\r\n**Why do some posts have no text?**\r\nBluesky allows media-only posts. The actor omits empty `text` and keeps the media metadata.\r\n\r\n**Why are some fields missing from an account?**\r\nBasic account views do not always include a bio, banner, follower counts or a pinned post. The actor hydrates accounts in batches so those fields are present whenever Bluesky publishes them. Labels, verification and live status are conditional by nature.\r\n\r\n**Why are some accounts missing from results?**\r\nSome accounts opt out of unauthenticated access and carry the `!no-unauthenticated` label. They are skipped by default and counted in the run status. Set `respectNoUnauthenticated=false` to include them when Bluesky returns them.\r\n\r\n**Why does a follower export contain fewer rows than the profile's follower count?**\r\nProfile counts are cached totals; deactivated or unindexed accounts can make them larger than the returned list. `!no-unauthenticated` accounts are filtered by this actor by default. The export is complete for what the public API exposes after that policy.\r\n\r\n**How are reposts and quote posts handled?**\r\nA repost is one record with `isRepost=true`, `repostedBy` and the original post's content. A quote post is one record with the quoter's text and a nested `quotedPost` object containing the quoted post's text, author, URL, counts and media.\r\n\r\n**What is the difference between `mode=search` and `mode=actorSearch`?**\r\n`search` finds posts. `actorSearch` finds accounts by handle, display name or bio.\r\n\r\n**What is a feed, and which presets are available?**\r\nA feed is a curated post stream produced by a feed generator. The built-in presets are What's Hot, Bluesky Team and Hot Classic. Paste any other generator's AT URI or bsky.app feed URL into `feedUri`. An explicit `feedUri` always takes precedence over `feedPreset`; legacy preset names are mapped to What's Hot.\r\n\r\n**Does `feedPreset` override my custom `feedUri`?**\r\nNo. `feedUri`/`feedUris` win whenever they are supplied. `feedPreset` is only used when no feed URI is given, and `mode=feedGenerator` never adds an unrequested feed.\r\n\r\n**How does `verifiedOnly` work?**\r\nIt keeps only accounts with a valid Bluesky verification and posts whose author is verified. Records with no verification object are excluded. Post modes hydrate author profiles so verification can be checked, which adds batched profile requests and may return fewer posts than an unfiltered search.\r\n\r\n**How do actor likes work without a login?**\r\n`mode=actorLikes` resolves the account's personal data server from its public DID document, lists the public `app.bsky.feed.like` records stored there, and hydrates each liked post. No credentials are used. Likes whose posts were deleted, or accounts whose DID document does not expose a public data server, return no rows for that part. `mode=getLikes` is the opposite direction: it lists the accounts that liked a given post.\r\n\r\n**How deep can a thread go?**\r\n`threadDepth` can be set up to 1000. The public thread endpoint returns about 10 reply levels per request, so the actor detects reply branches that still have children and fetches those branches separately. `maxRepliesPerPost` caps how many direct replies are followed under each post; when a branch is cut, the affected post carries `threadTruncated=true` and the run status explains why.\r\n\r\n**What is `mode=relationships`?**\r\nIt checks public follow and block relationships between `actor` and each account in `actors` (up to batches of 30). Each account record gets `isFollowing`, `isFollowedBy`, `isMutualFollow` and the public relationship record URIs. It is not a replacement for a logged-in viewer's personalised \"known followers\" list, which needs an account context.\r\n\r\n**Why did I get fewer records than `maxItems`?**\r\nFilters can exclude many candidates, Bluesky can exhaust the source, and some search modes have source caps. The run status message reports the shortfall; it does not silently pretend the result is complete.\r\n\r\n**Can I export followers of a very large account?**\r\nYes, up to `maxItems`. Bluesky returns followers in cursor-paged batches; the actor keeps walking short pages until the cap or the end of the list.\r\n\r\n**How current is the data?**\r\nLive. Every run reads Bluesky at request time, so schedule the actor hourly or daily for ongoing refreshes.\r\n\r\n**Is this affiliated with Bluesky?**\r\nNo. This is an independent actor that reads public Bluesky data.\r\n\r\n## Limitations\r\n\r\n- **Top search uses time windows.** `searchSort=top` is engagement-ranked; the actor walks older time windows to collect more than one page, preserving ranking within each window. Results are deduplicated by post URI.\r\n- **Time-window search is approximate.** The `latest` walk can return posts outside the exact window, can overlap between windows, and is de-duplicated by post URI. The `until` boundary uses the newer of a post's `createdAt` and `indexedAt`, and a date-only `until` includes the whole UTC day.\r\n- **Search hit totals are estimates.** When Bluesky returns `hitsTotal`/`searchHitsTotal`, the source caps and rounds the number; it is not an exact result count.\r\n- **Search can be temporarily blocked.** If Bluesky returns HTTP 403 even after the automatic Apify retry, the run stops with a clear status message. Try again later or use `mode=profile`, `mode=feed` or a direct post/list feed.\r\n- **Search coverage is not exhaustive.** Bluesky's search index is recency-weighted and does not include every post.\r\n- **Thread walking is bounded on purpose.** Each request returns about 10 reply levels, so deeper replies are fetched branch by branch. The walk stops at `threadDepth`, `maxRepliesPerPost`, `maxItems` or the per-run branch budget; affected records carry `threadTruncated=true`. Deleted, blocked, hidden or rate-limited branches still create gaps.\r\n- **Actor likes depend on the public data server.** The like records are read from the account's personal data server rather than the public feed service. If that server is unreachable, does not appear in the DID document, or no longer stores the like record, those likes cannot be returned. Deleted posts are skipped even when their like record remains.\r\n- **Personalised known followers need a login.** The public relationship check in `mode=relationships` can tell you whether supplied accounts follow or block a target, but a viewer-specific \"followers you know\" list requires an authenticated account context, which this actor does not use.\r\n- **Starter-pack typeahead is not a separate mode.** `mode=starterPackSearch` uses the public starter-pack search endpoint, which covers keyword search and paging; a viewer-boosted typeahead ordering is not exposed without an account context.\r\n- **Hidden accounts are skipped by default.** Accounts that carry `!no-unauthenticated` are filtered out unless `respectNoUnauthenticated=false`, and the status message reports how many records were skipped.\r\n- **Follower counts can exceed exported rows.** Profile totals are cached by Bluesky and include accounts that are deactivated or no longer indexed. `!no-unauthenticated` accounts are returned by the API and then filtered by this actor by default, so `followersCount` can exceed the exported rows. Set `respectNoUnauthenticated=false` to include them.\r\n- **Private data is out of scope.** Direct messages, private accounts, notifications and muted/blocked relationships are not available.\r\n- **Some fields are conditional.** Labels, verification, live status, pinned posts, banners and media are present only when the source has them.\r\n- **Custom feeds depend on third-party generators.** If a generator is offline, its feed returns no posts.\r\n- **Follower lists can be very large.** Use `maxItems` to bound a run.\r\n- **`maxItems` is capped at 5,000 per run.** Larger requests are clamped by the input schema.\r\n- **Filtered account modes keep walking cursor pages until the cap or source exhaustion.** If Bluesky has no more matches, the run reports a shortfall in its status message.\r\n- **`verifiedOnly` can return far fewer records.** Most post authors do not publish a verification object, so verified-only post searches are intentionally narrow.\r\n- **`mode=feedGenerator` returns only the feeds you request.** It does not append a default What's Hot record.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "bluesky-posts-profiles-feeds-and-threads-scraper",
      "title": "Bluesky Posts, Profiles, Feeds & Threads Scraper",
      "description": "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.",
      "version": "1.2",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Bluesky Posts, Profiles, Feeds & Threads Scraper\r\n\r\nScrape **Bluesky** public data without a login, cookies or an API key. Search posts by keyword, hashtag, author, mention, domain or URL; read profiles, author feeds, full thread reply branches, lists, starter packs, custom feeds, likes, reposts, quotes, actor liked posts and public relationships; and discover trending topics and suggested communities. Every record has flat top-level fields with a few natural nested objects, absolute URLs, ISO dates and omit-empty output.\r\n\r\n## What this actor does\r\n\r\n- **24 modes** across posts, accounts, threads, lists, starter packs, feed generators, relationships and discovery.\r\n- **Post search with the full public filter surface**: keyword, hashtag, author, mention, domain, URL, date range, language and top/latest ranking.\r\n- **Search beyond the first page**: both `searchSort=latest` and `searchSort=top` walk backwards through time windows. Latest is newest-first; Top preserves engagement ranking within each window. Cursor paging is not used because Bluesky rejects anonymous cursors.\r\n- **Full thread reply trees**: `threadDepth` walks deeper than the ~10-level per-request limit by fetching truncated reply branches separately. `maxRepliesPerPost` bounds fan-out and `threadTruncated` marks records whose children were cut short.\r\n- **Actor likes without credentials**: `mode=actorLikes` reads the account's public like records from its personal data server and hydrates the liked posts, with `likedAt` and like-record fields.\r\n- **More public surfaces**: `mode=actorFeeds` lists an account's feed generators, `mode=starterPackSearch` searches starter packs, and `mode=relationships` checks public follow/block relationships for supplied accounts.\r\n- **Rich records**: engagement counts, languages, mentions, hashtags, links, domains, images, video, external embeds, quoted posts, reposts, reply roots, labels, self-labels, verification, live status, pinned posts, profile counts and flat author follower counts.\r\n- **Privacy-aware**: accounts marked `!no-unauthenticated` are skipped by default, and the run status reports how many records were skipped.\r\n- **Batch-friendly**: multiple profiles, posts, lists, starter packs, feeds and URLs per run, with automatic de-duplication.\r\n- **No credentials required.** Every mode reads public data. If Bluesky temporarily blocks a search request from the actor's network, the actor retries it automatically and reports a clear status if it still fails.\r\n\r\n## Output per record\r\n\r\nEvery record carries `recordType`, `sourceUrl` and `scrapedAt`. Empty values are omitted at every depth, so the dataset never contains nulls or empty placeholders.\r\n\r\n### Post records (`recordType=post`)\r\n\r\n- `uri` - canonical AT URI\r\n- `cid` - content identifier\r\n- `id` - same as `uri`\r\n- `url` - public `bsky.app` post URL\r\n- `sourceUrl` - same as `url`\r\n- `text` - post text\r\n- `createdAt`, `indexedAt` - ISO 8601 timestamps\r\n- `language` - first declared language\r\n- `languages[]` - all declared languages\r\n- `replyCount`, `repostCount`, `likeCount`, `quoteCount`, `bookmarkCount`\r\n- `isReply` - true when the post replies to another post\r\n- `inReplyToUri`, `inReplyToCid` - parent post\r\n- `rootUri`, `rootCid` - thread root\r\n- `isRepost` - true when surfaced as a repost\r\n- `repostedBy` - handle that reposted it\r\n- `repostUri`, `repostCid`, `repostedAt` - repost metadata\r\n- `isQuote` - true when the post quotes another post\r\n- `threadTruncated` - true on a thread record whose direct replies were cut by `maxRepliesPerPost`, `maxItems` or a public-API gap (`mode=postThread`)\r\n- `likedAt`, `likedBy`, `likedByDid`, `likeUri`, `likeCid` - like-record metadata added by `mode=actorLikes`\r\n- `quotedPost` - `{uri, cid, text, createdAt, indexedAt, authorHandle, authorDid, authorDisplayName, authorAvatar, url, likeCount, repostCount, replyCount, quoteCount, labels, labelValues, mediaAttachments}`\r\n- `mentions[]` - mentioned DIDs\r\n- `tags[]` - hashtags, lowercase\r\n- `urls[]` - external links\r\n- `domains[]` - hostnames from `urls[]`\r\n- `mediaAttachments[]` - `{type, url, previewUrl, description, width, height, presentation, title}` for images, video and external embeds\r\n- `hasMedia`, `mediaTypes[]`\r\n- `labels[]` - `{val, src, uri, cid, cts, ver}`\r\n- `labelValues[]` - label values only\r\n- `selfLabels[]` - author-applied labels\r\n- `author` - `{did, handle, displayName, avatar, createdAt, profileUrl, labels, labelValues, verification, status}`; with `hydrateAuthors=true` (the default) it also includes `description`, `banner`, `followersCount`, `followsCount`, `postsCount`, `indexedAt`, `pinnedPostUri`, `pinnedPostCid`. The hydrated profile's `handle` and `did` replace stale values, and `url`, `sourceUrl` and `authorHandle` are recomputed\r\n- `authorFollowersCount`, `authorFollowsCount`, `authorPostsCount`, `authorVerified` - flat author stats added when `hydrateAuthors=true`\r\n- `authorHandle` - convenience field\r\n- `hitsTotal`, `searchHitsTotal` - search-result totals when Bluesky returns them (the value is capped/rounded by the source, so treat it as an estimate)\r\n\r\n### Account records (`recordType=account`, `like`, `listMember`, `repost` or `starterPackMember`)\r\n\r\n- `did`, `id`, `handle`, `displayName`, `description`, `pronouns`\r\n- `avatar`, `banner`\r\n- `followersCount`, `followsCount`, `postsCount`\r\n- `createdAt`, `indexedAt`\r\n- `url`, `sourceUrl` - public profile URL\r\n- `labels[]`, `labelValues[]`\r\n- `verification` - `{verifiedStatus, trustedVerifierStatus, verifications[]}`\r\n- `associated` - `{listsCount, feedGeneratorsCount, starterPacksCount, isLabeler, chatAllowIncoming, chatAllowGroupInvites, activitySubscription}`\r\n- `status` - `{type, createdAt, durationMinutes, expiresAt, isActive, embed}`\r\n- `pinnedPostUri`, `pinnedPostCid`\r\n- `relation` - `profile`, `searchMatch`, `follower`, `following`, `liked`, `reposted`, `listMember`, `starterPackMember`, `suggestedFollow` or `relationship`\r\n- `likedAt`, `likedPostUri` - for `mode=getLikes`\r\n- `repostedPostUri` - for `mode=repostedBy`\r\n- `listUri`, `listName` - for list members\r\n- `starterPackUri` - for starter-pack members\r\n- `relationshipActor`, `isFollowing`, `isFollowedBy`, `isMutualFollow` - for `mode=relationships`\r\n- `following`, `followedBy`, `blocking`, `blockedBy` - public relationship record URIs when present\r\n\r\n### List records (`recordType=list`)\r\n\r\n- `uri`, `cid`, `id`, `name`, `purpose`, `description`\r\n- `listItemCount`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `url`, `sourceUrl` - public list URL\r\n\r\n### Starter-pack records (`recordType=starterPack`)\r\n\r\n- `uri`, `cid`, `id`, `name`, `description`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `listUri`, `listName`, `listItemCount`\r\n- `joinedAllTimeCount`, `joinedWeekCount`\r\n- `createdAt`, `updatedAt`\r\n- `feeds[]` - `{uri, displayName, description, avatar, creatorHandle}`\r\n- `listItemsSample[]` - sample account summaries\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `url`, `sourceUrl` - public starter-pack URL\r\n\r\n### Feed-generator records (`recordType=feedGenerator`)\r\n\r\n- `uri`, `cid`, `id`, `did`\r\n- `displayName`, `description`, `avatar`\r\n- `likeCount`, `acceptsInteractions`\r\n- `creator` - account summary\r\n- `creatorHandle`, `creatorDid`\r\n- `labels[]`, `labelValues[]`, `indexedAt`\r\n- `isOnline`, `isValid` - when fetched with `mode=feedGenerator`\r\n- `url`, `sourceUrl` - public feed URL\r\n\r\n### Discovery records\r\n\r\n- `recordType=trendingTopic`: `topic`, `displayName`, `description`, `link`, `url`, `sourceUrl`, `rank`\r\n- `recordType=taggedSuggestion`: `tag`, `subjectType`, `subject`, `url`, `sourceUrl`\r\n\r\nWhen a discovery item has no public target URL, `url` and `sourceUrl` fall back to the Bluesky home page so every record still has a source link.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | Enum | `search` | `search` / `profile` / `profiles` / `actorSearch` / `feed` / `postThread` / `urlFetch` / `getPosts` / `follows` / `followers` / `getLikes` / `repostedBy` / `quotes` / `actorLikes` / `getList` / `listFeed` / `lists` / `actorFeeds` / `getStarterPack` / `starterPackSearch` / `feedGenerator` / `feedGeneratorsDiscovery` / `relationships` / `discovery` |\r\n| `searchQuery` | String | `bluesky` | Keyword, hashtag, phrase or Lucene-style query. Used by `search`, `actorSearch`, `starterPackSearch` and `feedGeneratorsDiscovery` |\r\n| `searchSort` | Enum | `latest` | `latest` (newest first; supports deeper collection) or `top` (engagement-ranked, capped at about 100 posts) |\r\n| `searchTags` | Array | `[]` | Hashtags without `#`; multiple tags are AND-matched (`mode=search`) |\r\n| `searchDomain` | String | – | Only posts linking to this domain (`mode=search`) |\r\n| `searchUrl` | String | – | Only posts linking to this exact URL (`mode=search`) |\r\n| `mentionsUser` | String | – | Only posts mentioning this handle or DID (`mode=search`) |\r\n| `fromUser` | String | – | Only posts authored by this handle or DID (`mode=search`) |\r\n| `since` | String | – | Earliest post date (`YYYY-MM-DD` or ISO datetime); a bare date starts at 00:00 UTC (`mode=search`) |\r\n| `until` | String | – | Latest post date (`YYYY-MM-DD` or ISO datetime); a bare date includes the whole day through 23:59:59.999999 UTC (`mode=search`) |\r\n| `language` | Enum | – | ISO 639-1 language filter; empty means no filter |\r\n| `authorFeedFilter` | Enum | `posts_with_replies` | `posts_with_replies` / `posts_no_replies` / `posts_with_media` / `posts_and_author_threads` (`mode=profile`) |\r\n| `includePins` | Boolean | `false` | Include the pinned post at the top of the author feed (`mode=profile`) |\r\n| `includeParents` | Boolean | `false` | Include ancestor posts above the requested post (`mode=postThread`) |\r\n| `threadDepth` | Integer | `6` | Reply and ancestor levels to walk, 0-1000. Depths beyond about 10 reply levels are reached by walking branches across requests (`mode=postThread`) |\r\n| `maxRepliesPerPost` | Integer | `100` | Maximum direct replies followed under each post while walking a thread, 1-1000 (`mode=postThread`) |\r\n| `actor` | String | – | Handle or DID. Used by `profile`, `follows`, `followers`, `lists`, `actorLikes`, `actorFeeds`, `relationships` and `discoveryType=suggestedFollows` |\r\n| `actors` | Array | `[]` | Handles, DIDs or profile URLs for `mode=profiles`; the accounts to check against `actor` for `mode=relationships` |\r\n| `postUri` | String | – | AT URI of a post. Used by `postThread`, `getLikes`, `repostedBy` and `quotes` |\r\n| `postUris` | Array | `[]` | AT URIs to hydrate (`mode=getPosts`; fallback for single-post modes) |\r\n| `postUrls` | Array | `[]` | bsky.app post URLs for `getPosts`; post, profile, list, feed or starter-pack URLs for `urlFetch`; fallback for single-post modes |\r\n| `listUri` | String | – | AT URI of a list (`mode=getList`, `mode=listFeed`) |\r\n| `listUris` | Array | `[]` | AT URIs or list URLs for batch list processing (`mode=getList`) |\r\n| `starterPackUri` | String | – | AT URI of a starter pack (`mode=getStarterPack`) |\r\n| `starterPackUris` | Array | `[]` | AT URIs or starter-pack URLs for batch processing (`mode=getStarterPack`) |\r\n| `feedPreset` | Enum | - | `whats-hot` / `bsky-team` / `hot-classic`; an explicit `feedUri` always wins. Legacy names (`discover`, `mutuals`, `popular-with-friends`, `for-you`, `news`, `trending-videos`, `quiet-posters`) are accepted and mapped to What's Hot. If neither is set, `mode=feed` uses What's Hot |\r\n| `feedUri` | String | – | AT URI or bsky.app feed URL (`mode=feed`, `mode=feedGenerator`) |\r\n| `feedUris` | Array | `[]` | AT URIs or feed URLs for batch lookup (`mode=feedGenerator`) |\r\n| `discoveryType` | Enum | `trendingTopics` | `trendingTopics` / `suggestedFeeds` / `suggestedStarterPacks` / `taggedSuggestions` / `suggestedFollows` (`mode=discovery`) |\r\n| `excludeReplies` | Boolean | `false` | Drop posts that are replies |\r\n| `excludeReposts` | Boolean | `false` | Drop reposts |\r\n| `mediaOnly` | Boolean | `false` | Only posts with at least one image, video or external embed |\r\n| `excludeLabeled` | Boolean | `false` | Drop posts and accounts that carry moderation or self-labels, including labels on a post's author |\r\n| `respectNoUnauthenticated` | Boolean | `true` | Skip records whose author carries `!no-unauthenticated`; the run status reports the skipped count |\r\n| `verifiedOnly` | Boolean | `false` | Only verified accounts, or posts whose author is verified. Records with no verification object are excluded; post modes hydrate author profiles to check |\r\n| `minLikes` | Integer | – | Drop posts below this like count, 0-10,000,000 |\r\n| `minReposts` | Integer | – | Drop posts below this repost count, 0-10,000,000 |\r\n| `minReplies` | Integer | – | Drop posts below this reply count, 0-10,000,000 |\r\n| `minQuotes` | Integer | – | Drop posts below this quote count, 0-10,000,000 |\r\n| `minFollowers` | Integer | – | Keep accounts with at least this many followers, 0-1,000,000,000 |\r\n| `maxFollowers` | Integer | – | Keep accounts with at most this many followers, 0-1,000,000,000 |\r\n| `includeListMetadata` | Boolean | `false` | Emit a list record before its members (`mode=getList`) |\r\n| `includeStarterPackMembers` | Boolean | `true` | Emit the pack's member accounts (`mode=getStarterPack`) |\r\n| `hydrateAuthors` | Boolean | `true` | Fetch full author profiles for post records in batches of 25 and add flat author follower, following, post and verification fields. Automatically enabled when `verifiedOnly=true`; the daily profile prefill leaves it off to stay cheap |\r\n| `maxItems` | Integer | `40` | Hard cap on emitted records, 1-5000. Source exhaustion or Bluesky caps may return fewer; the run status reports a shortfall |\r\n\r\nLegacy saved tasks that specify `mode=getActorLikes` are mapped to `actorLikes` with a status message. That mode reads the account's public like records from its personal data server and hydrates the liked posts; no login or app password is used.\r\n\r\n### Example: brand monitoring with filters\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQuery\": \"bluesky\",\r\n  \"searchSort\": \"latest\",\r\n  \"searchTags\": [\"opensource\"],\r\n  \"language\": \"en\",\r\n  \"minLikes\": 10,\r\n  \"maxItems\": 300\r\n}\r\n```\r\n\r\n### Example: a user's profile and recent media posts\r\n\r\n```json\r\n{\r\n  \"mode\": \"profile\",\r\n  \"actor\": \"bsky.app\",\r\n  \"authorFeedFilter\": \"posts_with_media\",\r\n  \"includePins\": true,\r\n  \"maxItems\": 50\r\n}\r\n```\r\n\r\n### Example: a thread with parents and replies\r\n\r\n```json\r\n{\r\n  \"mode\": \"postThread\",\r\n  \"postUri\": \"at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3l6oveex3ii2l\",\r\n  \"includeParents\": true,\r\n  \"threadDepth\": 30,\r\n  \"maxRepliesPerPost\": 100,\r\n  \"maxItems\": 200\r\n}\r\n```\r\n\r\n### Example: posts an account liked\r\n\r\n```json\r\n{\r\n  \"mode\": \"actorLikes\",\r\n  \"actor\": \"bsky.app\",\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n### Example: audience export with follower counts\r\n\r\n```json\r\n{\r\n  \"mode\": \"followers\",\r\n  \"actor\": \"jay.bsky.team\",\r\n  \"minFollowers\": 100,\r\n  \"maxItems\": 500\r\n}\r\n```\r\n\r\n### Example: discover trending topics\r\n\r\n```json\r\n{\r\n  \"mode\": \"discovery\",\r\n  \"discoveryType\": \"trendingTopics\",\r\n  \"maxItems\": 20\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Social listening and brand monitoring** - track keywords, hashtags, mentions, domains and authors with date and engagement filters.\r\n- **Influencer and KOL research** - combine account search with follower ranges, verification and profile counts.\r\n- **Audience and lead export** - export followers, follows, likers, reposters, list members and starter-pack members with handles, bios and counts.\r\n- **Conversation analysis** - capture a post, its ancestors and replies up to `threadDepth` for sentiment or narrative research.\r\n- **Content and LLM datasets** - collect post text, languages, hashtags, links, media metadata and engagement counts.\r\n- **Community mapping** - explore lists, list feeds, starter packs, custom feeds and trending topics.\r\n\r\n## FAQ\r\n\r\n**Do I need a Bluesky account or login?**\r\nNo. Every mode reads public data. No cookies or API keys are needed. If Bluesky temporarily blocks a search request from the actor's network, the actor retries it automatically through an Apify connection and reports a clear status if it still fails. No proxy setup is required.\r\n\r\n**How far back can a keyword search go?**\r\n`searchSort=latest` walks backwards through time windows and can return far more than the 100-post relevance cap. `searchSort=top` is relevance-ranked and limited to about 100 posts per query. Time-window search is approximate: pages can overlap, so results are de-duplicated by post URI, and a narrow or wide date range changes how predictable the volume is. When Bluesky returns a search hit total it is exposed as `hitsTotal`/`searchHitsTotal`, but the source caps and rounds that number.\r\n\r\n**Why do some posts have no text?**\r\nBluesky allows media-only posts. The actor omits empty `text` and keeps the media metadata.\r\n\r\n**Why are some fields missing from an account?**\r\nBasic account views do not always include a bio, banner, follower counts or a pinned post. The actor hydrates accounts in batches so those fields are present whenever Bluesky publishes them. Labels, verification and live status are conditional by nature.\r\n\r\n**Why are some accounts missing from results?**\r\nSome accounts opt out of unauthenticated access and carry the `!no-unauthenticated` label. They are skipped by default and counted in the run status. Set `respectNoUnauthenticated=false` to include them when Bluesky returns them.\r\n\r\n**Why does a follower export contain fewer rows than the profile's follower count?**\r\nProfile counts are cached totals; deactivated or unindexed accounts can make them larger than the returned list. `!no-unauthenticated` accounts are filtered by this actor by default. The export is complete for what the public API exposes after that policy.\r\n\r\n**How are reposts and quote posts handled?**\r\nA repost is one record with `isRepost=true`, `repostedBy` and the original post's content. A quote post is one record with the quoter's text and a nested `quotedPost` object containing the quoted post's text, author, URL, counts and media.\r\n\r\n**What is the difference between `mode=search` and `mode=actorSearch`?**\r\n`search` finds posts. `actorSearch` finds accounts by handle, display name or bio.\r\n\r\n**What is a feed, and which presets are available?**\r\nA feed is a curated post stream produced by a feed generator. The built-in presets are What's Hot, Bluesky Team and Hot Classic. Paste any other generator's AT URI or bsky.app feed URL into `feedUri`. An explicit `feedUri` always takes precedence over `feedPreset`; legacy preset names are mapped to What's Hot.\r\n\r\n**Does `feedPreset` override my custom `feedUri`?**\r\nNo. `feedUri`/`feedUris` win whenever they are supplied. `feedPreset` is only used when no feed URI is given, and `mode=feedGenerator` never adds an unrequested feed.\r\n\r\n**How does `verifiedOnly` work?**\r\nIt keeps only accounts with a valid Bluesky verification and posts whose author is verified. Records with no verification object are excluded. Post modes hydrate author profiles so verification can be checked, which adds batched profile requests and may return fewer posts than an unfiltered search.\r\n\r\n**How do actor likes work without a login?**\r\n`mode=actorLikes` resolves the account's personal data server from its public DID document, lists the public `app.bsky.feed.like` records stored there, and hydrates each liked post. No credentials are used. Likes whose posts were deleted, or accounts whose DID document does not expose a public data server, return no rows for that part. `mode=getLikes` is the opposite direction: it lists the accounts that liked a given post.\r\n\r\n**How deep can a thread go?**\r\n`threadDepth` can be set up to 1000. The public thread endpoint returns about 10 reply levels per request, so the actor detects reply branches that still have children and fetches those branches separately. `maxRepliesPerPost` caps how many direct replies are followed under each post; when a branch is cut, the affected post carries `threadTruncated=true` and the run status explains why.\r\n\r\n**What is `mode=relationships`?**\r\nIt checks public follow and block relationships between `actor` and each account in `actors` (up to batches of 30). Each account record gets `isFollowing`, `isFollowedBy`, `isMutualFollow` and the public relationship record URIs. It is not a replacement for a logged-in viewer's personalised \"known followers\" list, which needs an account context.\r\n\r\n**Why did I get fewer records than `maxItems`?**\r\nFilters can exclude many candidates, Bluesky can exhaust the source, and some search modes have source caps. The run status message reports the shortfall; it does not silently pretend the result is complete.\r\n\r\n**Can I export followers of a very large account?**\r\nYes, up to `maxItems`. Bluesky returns followers in cursor-paged batches; the actor keeps walking short pages until the cap or the end of the list.\r\n\r\n**How current is the data?**\r\nLive. Every run reads Bluesky at request time, so schedule the actor hourly or daily for ongoing refreshes.\r\n\r\n**Is this affiliated with Bluesky?**\r\nNo. This is an independent actor that reads public Bluesky data.\r\n\r\n## Limitations\r\n\r\n- **Top search uses time windows.** `searchSort=top` is engagement-ranked; the actor walks older time windows to collect more than one page, preserving ranking within each window. Results are deduplicated by post URI.\r\n- **Time-window search is approximate.** The `latest` walk can return posts outside the exact window, can overlap between windows, and is de-duplicated by post URI. The `until` boundary uses the newer of a post's `createdAt` and `indexedAt`, and a date-only `until` includes the whole UTC day.\r\n- **Search hit totals are estimates.** When Bluesky returns `hitsTotal`/`searchHitsTotal`, the source caps and rounds the number; it is not an exact result count.\r\n- **Search can be temporarily blocked.** If Bluesky returns HTTP 403 even after the automatic Apify retry, the run stops with a clear status message. Try again later or use `mode=profile`, `mode=feed` or a direct post/list feed.\r\n- **Search coverage is not exhaustive.** Bluesky's search index is recency-weighted and does not include every post.\r\n- **Thread walking is bounded on purpose.** Each request returns about 10 reply levels, so deeper replies are fetched branch by branch. The walk stops at `threadDepth`, `maxRepliesPerPost`, `maxItems` or the per-run branch budget; affected records carry `threadTruncated=true`. Deleted, blocked, hidden or rate-limited branches still create gaps.\r\n- **Actor likes depend on the public data server.** The like records are read from the account's personal data server rather than the public feed service. If that server is unreachable, does not appear in the DID document, or no longer stores the like record, those likes cannot be returned. Deleted posts are skipped even when their like record remains.\r\n- **Personalised known followers need a login.** The public relationship check in `mode=relationships` can tell you whether supplied accounts follow or block a target, but a viewer-specific \"followers you know\" list requires an authenticated account context, which this actor does not use.\r\n- **Starter-pack typeahead is not a separate mode.** `mode=starterPackSearch` uses the public starter-pack search endpoint, which covers keyword search and paging; a viewer-boosted typeahead ordering is not exposed without an account context.\r\n- **Hidden accounts are skipped by default.** Accounts that carry `!no-unauthenticated` are filtered out unless `respectNoUnauthenticated=false`, and the status message reports how many records were skipped.\r\n- **Follower counts can exceed exported rows.** Profile totals are cached by Bluesky and include accounts that are deactivated or no longer indexed. `!no-unauthenticated` accounts are returned by the API and then filtered by this actor by default, so `followersCount` can exceed the exported rows. Set `respectNoUnauthenticated=false` to include them.\r\n- **Private data is out of scope.** Direct messages, private accounts, notifications and muted/blocked relationships are not available.\r\n- **Some fields are conditional.** Labels, verification, live status, pinned posts, banners and media are present only when the source has them.\r\n- **Custom feeds depend on third-party generators.** If a generator is offline, its feed returns no posts.\r\n- **Follower lists can be very large.** Use `maxItems` to bound a run.\r\n- **`maxItems` is capped at 5,000 per run.** Larger requests are clamped by the input schema.\r\n- **Filtered account modes keep walking cursor pages until the cap or source exhaustion.** If Bluesky has no more matches, the run reports a shortfall in its status message.\r\n- **`verifiedOnly` can return far fewer records.** Most post authors do not publish a verification object, so verified-only post searches are intentionally narrow.\r\n- **`mode=feedGenerator` returns only the feeds you request.** It does not append a default What's Hot record.\r\n",
      "input": {
        "title": "Bluesky Posts, Profiles, Feeds & Threads Scraper Input",
        "description": "Search Bluesky posts with keyword, hashtag, author, mention, domain and URL filters; read profiles, author feeds, full reply branches, custom feeds, lists, starter packs, likes, reposts, quotes, actor liked posts and public relationships; and discover trending topics, feeds and starter packs. All data is public and needs no login, cookies or API key.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch.",
            "editor": "select",
            "enum": [
              "search",
              "profile",
              "profiles",
              "actorSearch",
              "feed",
              "postThread",
              "urlFetch",
              "getPosts",
              "follows",
              "followers",
              "getLikes",
              "repostedBy",
              "quotes",
              "actorLikes",
              "getList",
              "listFeed",
              "lists",
              "actorFeeds",
              "getStarterPack",
              "starterPackSearch",
              "feedGenerator",
              "feedGeneratorsDiscovery",
              "relationships",
              "discovery"
            ],
            "enumTitles": [
              "Search posts - keyword, hashtag, author, mention, domain or URL",
              "Profile - metadata plus recent posts",
              "Profiles - batch lookup by handle or DID",
              "Account search - find users by keyword",
              "Feed - custom feed or built-in preset",
              "Post thread - post, full reply branches, optional parents",
              "URL fetch - expand bsky.app post, profile, list, feed or starter-pack URLs",
              "Get posts - batch-hydrate AT URIs or post URLs",
              "Follows - accounts a user follows",
              "Followers - accounts following a user",
              "Likes - accounts that liked a post",
              "Reposts - accounts that reposted a post",
              "Quotes - posts quoting a post",
              "Actor likes - posts an account liked, via its public PDS",
              "List members - one or more lists, optional list metadata",
              "List feed - posts in a list",
              "Lists - lists created by an account",
              "Actor feeds - feed generators created by an account",
              "Starter packs - pack details and members",
              "Starter-pack search - find starter packs by keyword",
              "Feed generator - details for one or more feeds",
              "Feed discovery - popular feed generators",
              "Relationships - public follow/block checks for supplied accounts",
              "Discovery - trending topics, suggested feeds, starter packs, tags, follows"
            ],
            "default": "search",
            "prefill": "profile"
          },
          "searchQuery": {
            "title": "Search query",
            "type": "string",
            "description": "Keyword, hashtag, phrase, or Lucene-style query. Used by search, actorSearch, starterPackSearch, and feedGeneratorsDiscovery.",
            "editor": "textfield",
            "default": "bluesky",
            "prefill": "bluesky"
          },
          "searchSort": {
            "title": "Search sort",
            "type": "string",
            "description": "Search ranking. `latest` returns newest first; `top` returns engagement-ranked posts. Both use time-window pagination to collect beyond one page.",
            "editor": "select",
            "enum": [
              "top",
              "latest"
            ],
            "enumTitles": [
              "Top - engagement-ranked",
              "Latest - newest first (supports deeper collection)"
            ],
            "default": "latest",
            "prefill": "latest"
          },
          "searchTags": {
            "title": "Search hashtags",
            "type": "array",
            "description": "Only posts with these hashtags (without `#`). Multiple tags are AND-matched. (mode=search)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "searchDomain": {
            "title": "Search domain",
            "type": "string",
            "description": "Only posts linking to this domain, e.g. `github.com`. (mode=search)",
            "editor": "textfield"
          },
          "searchUrl": {
            "title": "Search URL",
            "type": "string",
            "description": "Only posts linking to this exact URL. (mode=search)",
            "editor": "textfield"
          },
          "mentionsUser": {
            "title": "Mentioning user",
            "type": "string",
            "description": "Only posts mentioning this handle or DID. (mode=search)",
            "editor": "textfield"
          },
          "fromUser": {
            "title": "From user",
            "type": "string",
            "description": "Only posts authored by this handle or DID. (mode=search)",
            "editor": "textfield"
          },
          "since": {
            "title": "Since",
            "type": "string",
            "description": "Earliest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)",
            "editor": "textfield"
          },
          "until": {
            "title": "Until",
            "type": "string",
            "description": "Latest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)",
            "editor": "textfield"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "ISO 639-1 language filter for post search and post records. Empty means no filter.",
            "editor": "select",
            "enum": [
              "",
              "ab",
              "aa",
              "af",
              "ak",
              "sq",
              "am",
              "ar",
              "an",
              "hy",
              "as",
              "av",
              "ae",
              "ay",
              "az",
              "bm",
              "ba",
              "eu",
              "be",
              "bn",
              "bi",
              "bs",
              "br",
              "bg",
              "my",
              "ca",
              "ch",
              "ce",
              "ny",
              "zh",
              "cu",
              "cv",
              "kw",
              "co",
              "cr",
              "hr",
              "cs",
              "da",
              "dv",
              "nl",
              "dz",
              "en",
              "eo",
              "et",
              "ee",
              "fo",
              "fj",
              "fi",
              "fr",
              "ff",
              "gl",
              "lg",
              "ka",
              "de",
              "gn",
              "gu",
              "ht",
              "ha",
              "he",
              "hz",
              "hi",
              "ho",
              "hu",
              "is",
              "io",
              "ig",
              "id",
              "ia",
              "ie",
              "iu",
              "ik",
              "ga",
              "it",
              "ja",
              "jv",
              "kl",
              "kn",
              "kr",
              "ks",
              "kk",
              "km",
              "ki",
              "rw",
              "ky",
              "kv",
              "kg",
              "ko",
              "kj",
              "ku",
              "lo",
              "la",
              "lv",
              "li",
              "ln",
              "lt",
              "lu",
              "lb",
              "mk",
              "mg",
              "ms",
              "ml",
              "mt",
              "gv",
              "mi",
              "mr",
              "mh",
              "el",
              "mn",
              "na",
              "nv",
              "ng",
              "ne",
              "nd",
              "se",
              "no",
              "nb",
              "nn",
              "oc",
              "oj",
              "or",
              "om",
              "os",
              "pi",
              "pa",
              "fa",
              "pl",
              "pt",
              "ps",
              "qu",
              "ro",
              "rm",
              "rn",
              "ru",
              "sm",
              "sg",
              "sa",
              "sc",
              "gd",
              "sr",
              "sh",
              "sn",
              "ii",
              "sd",
              "si",
              "sk",
              "sl",
              "so",
              "nr",
              "st",
              "es",
              "su",
              "sw",
              "ss",
              "sv",
              "tl",
              "ty",
              "tg",
              "ta",
              "tt",
              "te",
              "th",
              "bo",
              "ti",
              "to",
              "ts",
              "tn",
              "tr",
              "tk",
              "tw",
              "ug",
              "uk",
              "ur",
              "uz",
              "ve",
              "vi",
              "vo",
              "wa",
              "cy",
              "fy",
              "wo",
              "xh",
              "yi",
              "yo",
              "za",
              "zu"
            ],
            "enumTitles": [
              "(no filter)",
              "Abkhazian",
              "Afar",
              "Afrikaans",
              "Akan",
              "Albanian",
              "Amharic",
              "Arabic",
              "Aragonese",
              "Armenian",
              "Assamese",
              "Avaric",
              "Avestan",
              "Aymara",
              "Azerbaijani",
              "Bambara",
              "Bashkir",
              "Basque",
              "Belarusian",
              "Bengali",
              "Bislama",
              "Bosnian",
              "Breton",
              "Bulgarian",
              "Burmese",
              "Catalan",
              "Chamorro",
              "Chechen",
              "Chichewa",
              "Chinese",
              "Church Slavic",
              "Chuvash",
              "Cornish",
              "Corsican",
              "Cree",
              "Croatian",
              "Czech",
              "Danish",
              "Divehi",
              "Dutch",
              "Dzongkha",
              "English",
              "Esperanto",
              "Estonian",
              "Ewe",
              "Faroese",
              "Fijian",
              "Finnish",
              "French",
              "Fulah",
              "Galician",
              "Ganda",
              "Georgian",
              "German",
              "Guarani",
              "Gujarati",
              "Haitian",
              "Hausa",
              "Hebrew",
              "Herero",
              "Hindi",
              "Hiri Motu",
              "Hungarian",
              "Icelandic",
              "Ido",
              "Igbo",
              "Indonesian",
              "Interlingua (International Auxiliary Language Association)",
              "Interlingue",
              "Inuktitut",
              "Inupiaq",
              "Irish",
              "Italian",
              "Japanese",
              "Javanese",
              "Kalaallisut",
              "Kannada",
              "Kanuri",
              "Kashmiri",
              "Kazakh",
              "Khmer",
              "Kikuyu",
              "Kinyarwanda",
              "Kirghiz",
              "Komi",
              "Kongo",
              "Korean",
              "Kuanyama",
              "Kurdish",
              "Lao",
              "Latin",
              "Latvian",
              "Limburgan",
              "Lingala",
              "Lithuanian",
              "Luba-Katanga",
              "Luxembourgish",
              "Macedonian",
              "Malagasy",
              "Malay (macrolanguage)",
              "Malayalam",
              "Maltese",
              "Manx",
              "Maori",
              "Marathi",
              "Marshallese",
              "Modern Greek (1453-)",
              "Mongolian",
              "Nauru",
              "Navajo",
              "Ndonga",
              "Nepali (macrolanguage)",
              "North Ndebele",
              "Northern Sami",
              "Norwegian",
              "Norwegian Bokmål",
              "Norwegian Nynorsk",
              "Occitan (post 1500)",
              "Ojibwa",
              "Oriya (macrolanguage)",
              "Oromo",
              "Ossetian",
              "Pali",
              "Panjabi",
              "Persian",
              "Polish",
              "Portuguese",
              "Pushto",
              "Quechua",
              "Romanian",
              "Romansh",
              "Rundi",
              "Russian",
              "Samoan",
              "Sango",
              "Sanskrit",
              "Sardinian",
              "Scottish Gaelic",
              "Serbian",
              "Serbo-Croatian",
              "Shona",
              "Sichuan Yi",
              "Sindhi",
              "Sinhala",
              "Slovak",
              "Slovenian",
              "Somali",
              "South Ndebele",
              "Southern Sotho",
              "Spanish",
              "Sundanese",
              "Swahili (macrolanguage)",
              "Swati",
              "Swedish",
              "Tagalog",
              "Tahitian",
              "Tajik",
              "Tamil",
              "Tatar",
              "Telugu",
              "Thai",
              "Tibetan",
              "Tigrinya",
              "Tonga (Tonga Islands)",
              "Tsonga",
              "Tswana",
              "Turkish",
              "Turkmen",
              "Twi",
              "Uighur",
              "Ukrainian",
              "Urdu",
              "Uzbek",
              "Venda",
              "Vietnamese",
              "Volapük",
              "Walloon",
              "Welsh",
              "Western Frisian",
              "Wolof",
              "Xhosa",
              "Yiddish",
              "Yoruba",
              "Zhuang",
              "Zulu"
            ],
            "default": "",
            "prefill": ""
          },
          "authorFeedFilter": {
            "title": "Author feed filter",
            "type": "string",
            "description": "Which posts to include in the author feed. (mode=profile)",
            "editor": "select",
            "enum": [
              "posts_with_replies",
              "posts_no_replies",
              "posts_with_media",
              "posts_and_author_threads"
            ],
            "enumTitles": [
              "Posts with replies",
              "Original posts only",
              "Posts with media",
              "Posts and author threads"
            ],
            "default": "posts_with_replies",
            "prefill": "posts_with_replies"
          },
          "includePins": {
            "title": "Include pinned post",
            "type": "boolean",
            "description": "Include the pinned post at the top of the author feed. (mode=profile)",
            "default": false,
            "prefill": false
          },
          "includeParents": {
            "title": "Include parent posts",
            "type": "boolean",
            "description": "Include ancestor posts above the requested post. (mode=postThread)",
            "default": false,
            "prefill": false
          },
          "threadDepth": {
            "title": "Thread depth",
            "type": "integer",
            "description": "How 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)",
            "minimum": 0,
            "maximum": 1000,
            "default": 6,
            "prefill": 6
          },
          "maxRepliesPerPost": {
            "title": "Max replies per post",
            "type": "integer",
            "description": "Maximum direct replies followed under each post while walking a thread. Larger values reach more branches but cost more requests. (mode=postThread)",
            "minimum": 1,
            "maximum": 1000,
            "default": 100,
            "prefill": 100
          },
          "actor": {
            "title": "Handle or DID",
            "type": "string",
            "description": "Bluesky handle or DID. Used by profile, follows, followers, lists, actorLikes, actorFeeds, relationships, and discoveryType=suggestedFollows.",
            "editor": "textfield",
            "prefill": "bsky.app"
          },
          "actors": {
            "title": "Handles or DIDs",
            "type": "array",
            "description": "Handles, DIDs, or profile URLs for batch lookup. Used by profiles and by relationships as the accounts to check against `actor`.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "postUri": {
            "title": "Post AT URI",
            "type": "string",
            "description": "AT URI of a post. Used by postThread, getLikes, repostedBy, and quotes.",
            "editor": "textfield"
          },
          "postUris": {
            "title": "Post AT URIs",
            "type": "array",
            "description": "AT URIs of posts to hydrate. Used by getPosts and as a fallback for single-post modes.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "postUrls": {
            "title": "Bluesky URLs",
            "type": "array",
            "description": "bsky.app post, profile, list, feed, or starter-pack URLs. Used by urlFetch, getPosts, and as a fallback for single-post modes.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "listUri": {
            "title": "List AT URI",
            "type": "string",
            "description": "AT URI of a Bluesky list. Used by getList and listFeed.",
            "editor": "textfield"
          },
          "listUris": {
            "title": "List AT URIs",
            "type": "array",
            "description": "AT URIs or bsky.app list URLs for batch list processing. (mode=getList)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "starterPackUri": {
            "title": "Starter pack AT URI",
            "type": "string",
            "description": "AT URI of a starter pack. (mode=getStarterPack)",
            "editor": "textfield"
          },
          "starterPackUris": {
            "title": "Starter pack AT URIs",
            "type": "array",
            "description": "AT URIs or bsky.app starter-pack URLs for batch processing. (mode=getStarterPack)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "feedPreset": {
            "title": "Feed preset",
            "type": "string",
            "description": "Built-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.",
            "editor": "select",
            "enum": [
              "whats-hot",
              "bsky-team",
              "hot-classic",
              "discover",
              "mutuals",
              "popular-with-friends",
              "for-you",
              "news",
              "trending-videos",
              "quiet-posters"
            ],
            "enumTitles": [
              "What's Hot",
              "Bluesky Team",
              "Hot Classic",
              "Legacy: Discover (uses What's Hot)",
              "Legacy: Mutuals (uses What's Hot)",
              "Legacy: Popular With Friends (uses What's Hot)",
              "Legacy: For You (uses What's Hot)",
              "Legacy: News (uses What's Hot)",
              "Legacy: Trending Videos (uses What's Hot)",
              "Legacy: Quiet Posters (uses What's Hot)"
            ],
            "prefill": "whats-hot"
          },
          "feedUri": {
            "title": "Feed AT URI",
            "type": "string",
            "description": "AT URI or bsky.app feed URL of a custom feed generator. (mode=feed / feedGenerator)",
            "editor": "textfield"
          },
          "feedUris": {
            "title": "Feed AT URIs",
            "type": "array",
            "description": "AT URIs or bsky.app feed URLs for batch feed-generator lookup. (mode=feedGenerator)",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "discoveryType": {
            "title": "Discovery type",
            "type": "string",
            "description": "Which discovery surface to fetch. (mode=discovery)",
            "editor": "select",
            "enum": [
              "trendingTopics",
              "suggestedFeeds",
              "suggestedStarterPacks",
              "taggedSuggestions",
              "suggestedFollows"
            ],
            "enumTitles": [
              "Trending topics",
              "Suggested feeds",
              "Suggested starter packs",
              "Tagged suggestions",
              "Suggested follows"
            ],
            "default": "trendingTopics",
            "prefill": "trendingTopics"
          },
          "excludeReplies": {
            "title": "Exclude replies",
            "type": "boolean",
            "description": "Drop posts that are replies to another post.",
            "default": false,
            "prefill": false
          },
          "excludeReposts": {
            "title": "Exclude reposts",
            "type": "boolean",
            "description": "Drop posts surfaced as reposts.",
            "default": false,
            "prefill": false
          },
          "mediaOnly": {
            "title": "Media only",
            "type": "boolean",
            "description": "Only emit posts with at least one image, video, or external embed.",
            "default": false,
            "prefill": false
          },
          "excludeLabeled": {
            "title": "Exclude labeled",
            "type": "boolean",
            "description": "Drop posts and accounts that carry moderation or self-labels, including labels on a post's author.",
            "default": false,
            "prefill": false
          },
          "respectNoUnauthenticated": {
            "title": "Respect no-unauthenticated accounts",
            "type": "boolean",
            "description": "Skip records whose author carries the `!no-unauthenticated` label. The run status reports how many records were skipped.",
            "default": true,
            "prefill": true
          },
          "verifiedOnly": {
            "title": "Verified only",
            "type": "boolean",
            "description": "Only 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.",
            "default": false,
            "prefill": false
          },
          "minLikes": {
            "title": "Minimum likes",
            "type": "integer",
            "description": "Drop posts with fewer likes.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minReposts": {
            "title": "Minimum reposts",
            "type": "integer",
            "description": "Drop posts with fewer reposts.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minReplies": {
            "title": "Minimum replies",
            "type": "integer",
            "description": "Drop posts with fewer replies.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minQuotes": {
            "title": "Minimum quotes",
            "type": "integer",
            "description": "Drop posts with fewer quote posts.",
            "minimum": 0,
            "maximum": 10000000
          },
          "minFollowers": {
            "title": "Minimum followers",
            "type": "integer",
            "description": "Keep accounts with at least this many followers.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "maxFollowers": {
            "title": "Maximum followers",
            "type": "integer",
            "description": "Keep accounts with at most this many followers.",
            "minimum": 0,
            "maximum": 1000000000
          },
          "includeListMetadata": {
            "title": "Include list metadata",
            "type": "boolean",
            "description": "Emit a list record before its members. (mode=getList)",
            "default": false,
            "prefill": false
          },
          "includeStarterPackMembers": {
            "title": "Include starter-pack members",
            "type": "boolean",
            "description": "Emit the accounts in the starter pack's list after the pack record. (mode=getStarterPack)",
            "default": true,
            "prefill": true
          },
          "hydrateAuthors": {
            "title": "Hydrate post authors",
            "type": "boolean",
            "description": "Fetch 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.",
            "default": true,
            "prefill": false
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on emitted records. For batch modes the cap applies across the whole run.",
            "minimum": 1,
            "maximum": 5000,
            "default": 40,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Bluesky Posts, Profiles, Feeds & Threads Scraper Output",
        "description": "Bluesky posts, accounts, lists, starter packs, feed generators, trending topics and tag suggestions from the public read API.",
        "properties": {
          "records": {
            "type": "string",
            "title": "Bluesky records",
            "description": "Dataset containing all scraped posts, accounts, lists, starter packs, feed generators and discovery records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Bluesky",
              "transformation": {
                "fields": [
                  "recordType",
                  "url",
                  "createdAt",
                  "authorHandle",
                  "displayName",
                  "text",
                  "likeCount",
                  "repostCount"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.2.1",
    "imageDigest": "a6845b1f6c2988775a68333cb46781d3d451fb90ee174ba8e3a2adfef50fde3c",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.2"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.004353333333333333
    }
  }
}