{
  "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.",
  "properties": {
    "actor": {
      "description": "Bluesky handle or DID. Used by profile, follows, followers, lists, actorLikes, actorFeeds, relationships, and discoveryType=suggestedFollows.",
      "editor": "textfield",
      "prefill": "bsky.app",
      "title": "Handle or DID",
      "type": "string"
    },
    "actors": {
      "default": [],
      "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"
      },
      "prefill": [],
      "title": "Handles or DIDs",
      "type": "array"
    },
    "authorFeedFilter": {
      "default": "posts_with_replies",
      "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"
      ],
      "prefill": "posts_with_replies",
      "title": "Author feed filter",
      "type": "string"
    },
    "discoveryType": {
      "default": "trendingTopics",
      "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"
      ],
      "prefill": "trendingTopics",
      "title": "Discovery type",
      "type": "string"
    },
    "excludeLabeled": {
      "default": false,
      "description": "Drop posts and accounts that carry moderation or self-labels, including labels on a post's author.",
      "prefill": false,
      "title": "Exclude labeled",
      "type": "boolean"
    },
    "excludeReplies": {
      "default": false,
      "description": "Drop posts that are replies to another post.",
      "prefill": false,
      "title": "Exclude replies",
      "type": "boolean"
    },
    "excludeReposts": {
      "default": false,
      "description": "Drop posts surfaced as reposts.",
      "prefill": false,
      "title": "Exclude reposts",
      "type": "boolean"
    },
    "feedPreset": {
      "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",
      "title": "Feed preset",
      "type": "string"
    },
    "feedUri": {
      "description": "AT URI or bsky.app feed URL of a custom feed generator. (mode=feed / feedGenerator)",
      "editor": "textfield",
      "title": "Feed AT URI",
      "type": "string"
    },
    "feedUris": {
      "default": [],
      "description": "AT URIs or bsky.app feed URLs for batch feed-generator lookup. (mode=feedGenerator)",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Feed AT URIs",
      "type": "array"
    },
    "fromUser": {
      "description": "Only posts authored by this handle or DID. (mode=search)",
      "editor": "textfield",
      "title": "From user",
      "type": "string"
    },
    "hydrateAuthors": {
      "default": true,
      "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.",
      "prefill": false,
      "title": "Hydrate post authors",
      "type": "boolean"
    },
    "includeListMetadata": {
      "default": false,
      "description": "Emit a list record before its members. (mode=getList)",
      "prefill": false,
      "title": "Include list metadata",
      "type": "boolean"
    },
    "includeParents": {
      "default": false,
      "description": "Include ancestor posts above the requested post. (mode=postThread)",
      "prefill": false,
      "title": "Include parent posts",
      "type": "boolean"
    },
    "includePins": {
      "default": false,
      "description": "Include the pinned post at the top of the author feed. (mode=profile)",
      "prefill": false,
      "title": "Include pinned post",
      "type": "boolean"
    },
    "includeStarterPackMembers": {
      "default": true,
      "description": "Emit the accounts in the starter pack's list after the pack record. (mode=getStarterPack)",
      "prefill": true,
      "title": "Include starter-pack members",
      "type": "boolean"
    },
    "language": {
      "default": "",
      "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"
      ],
      "prefill": "",
      "title": "Language",
      "type": "string"
    },
    "listUri": {
      "description": "AT URI of a Bluesky list. Used by getList and listFeed.",
      "editor": "textfield",
      "title": "List AT URI",
      "type": "string"
    },
    "listUris": {
      "default": [],
      "description": "AT URIs or bsky.app list URLs for batch list processing. (mode=getList)",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "List AT URIs",
      "type": "array"
    },
    "maxFollowers": {
      "description": "Keep accounts with at most this many followers.",
      "maximum": 1000000000,
      "minimum": 0,
      "title": "Maximum followers",
      "type": "integer"
    },
    "maxItems": {
      "default": 40,
      "description": "Hard cap on emitted records. For batch modes the cap applies across the whole run.",
      "maximum": 5000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max items",
      "type": "integer"
    },
    "maxRepliesPerPost": {
      "default": 100,
      "description": "Maximum direct replies followed under each post while walking a thread. Larger values reach more branches but cost more requests. (mode=postThread)",
      "maximum": 1000,
      "minimum": 1,
      "prefill": 100,
      "title": "Max replies per post",
      "type": "integer"
    },
    "mediaOnly": {
      "default": false,
      "description": "Only emit posts with at least one image, video, or external embed.",
      "prefill": false,
      "title": "Media only",
      "type": "boolean"
    },
    "mentionsUser": {
      "description": "Only posts mentioning this handle or DID. (mode=search)",
      "editor": "textfield",
      "title": "Mentioning user",
      "type": "string"
    },
    "minFollowers": {
      "description": "Keep accounts with at least this many followers.",
      "maximum": 1000000000,
      "minimum": 0,
      "title": "Minimum followers",
      "type": "integer"
    },
    "minLikes": {
      "description": "Drop posts with fewer likes.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum likes",
      "type": "integer"
    },
    "minQuotes": {
      "description": "Drop posts with fewer quote posts.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum quotes",
      "type": "integer"
    },
    "minReplies": {
      "description": "Drop posts with fewer replies.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum replies",
      "type": "integer"
    },
    "minReposts": {
      "description": "Drop posts with fewer reposts.",
      "maximum": 10000000,
      "minimum": 0,
      "title": "Minimum reposts",
      "type": "integer"
    },
    "mode": {
      "default": "search",
      "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"
      ],
      "prefill": "profile",
      "title": "Mode",
      "type": "string"
    },
    "postUri": {
      "description": "AT URI of a post. Used by postThread, getLikes, repostedBy, and quotes.",
      "editor": "textfield",
      "title": "Post AT URI",
      "type": "string"
    },
    "postUris": {
      "default": [],
      "description": "AT URIs of posts to hydrate. Used by getPosts and as a fallback for single-post modes.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Post AT URIs",
      "type": "array"
    },
    "postUrls": {
      "default": [],
      "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"
      },
      "prefill": [],
      "title": "Bluesky URLs",
      "type": "array"
    },
    "respectNoUnauthenticated": {
      "default": true,
      "description": "Skip records whose author carries the `!no-unauthenticated` label. The run status reports how many records were skipped.",
      "prefill": true,
      "title": "Respect no-unauthenticated accounts",
      "type": "boolean"
    },
    "searchDomain": {
      "description": "Only posts linking to this domain, e.g. `github.com`. (mode=search)",
      "editor": "textfield",
      "title": "Search domain",
      "type": "string"
    },
    "searchQuery": {
      "default": "bluesky",
      "description": "Keyword, hashtag, phrase, or Lucene-style query. Used by search, actorSearch, starterPackSearch, and feedGeneratorsDiscovery.",
      "editor": "textfield",
      "prefill": "bluesky",
      "title": "Search query",
      "type": "string"
    },
    "searchSort": {
      "default": "latest",
      "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)"
      ],
      "prefill": "latest",
      "title": "Search sort",
      "type": "string"
    },
    "searchTags": {
      "default": [],
      "description": "Only posts with these hashtags (without `#`). Multiple tags are AND-matched. (mode=search)",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Search hashtags",
      "type": "array"
    },
    "searchUrl": {
      "description": "Only posts linking to this exact URL. (mode=search)",
      "editor": "textfield",
      "title": "Search URL",
      "type": "string"
    },
    "since": {
      "description": "Earliest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)",
      "editor": "textfield",
      "title": "Since",
      "type": "string"
    },
    "starterPackUri": {
      "description": "AT URI of a starter pack. (mode=getStarterPack)",
      "editor": "textfield",
      "title": "Starter pack AT URI",
      "type": "string"
    },
    "starterPackUris": {
      "default": [],
      "description": "AT URIs or bsky.app starter-pack URLs for batch processing. (mode=getStarterPack)",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Starter pack AT URIs",
      "type": "array"
    },
    "threadDepth": {
      "default": 6,
      "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)",
      "maximum": 1000,
      "minimum": 0,
      "prefill": 6,
      "title": "Thread depth",
      "type": "integer"
    },
    "until": {
      "description": "Latest post date as `YYYY-MM-DD` or an ISO datetime. (mode=search)",
      "editor": "textfield",
      "title": "Until",
      "type": "string"
    },
    "verifiedOnly": {
      "default": false,
      "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.",
      "prefill": false,
      "title": "Verified only",
      "type": "boolean"
    }
  },
  "required": [
    "mode"
  ],
  "schemaVersion": 1,
  "title": "Bluesky Posts, Profiles, Feeds & Threads Scraper Input",
  "type": "object"
}
