{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper - Posts, Profiles, Followers & Search",
    "description": "Scrape Bluesky posts by keyword, hashtag or account, plus replies, quotes, custom feeds, lists, followers, likers, profiles, starter packs and trends. Date, language and engagement filters, deep search and a monitor for new posts. No login. $0.018 per 1,000 posts.",
    "version": "0.1",
    "x-build-id": "09oAhm9Nyed3M3dGo"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/topapi~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-topapi-bluesky-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/topapi~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-topapi-bluesky-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/topapi~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-topapi-bluesky-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "🧭 Mode",
            "enum": [
              "auto",
              "searchPosts",
              "authorFeed",
              "profiles",
              "followers",
              "follows",
              "searchPeople",
              "postDetails",
              "thread",
              "quotes",
              "likers",
              "reposters",
              "feed",
              "list",
              "starterPacks",
              "trending"
            ],
            "type": "string",
            "description": "What to collect. Automatic: search queries give posts, handles give each account's posts, post/feed/list/starter pack URLs give their content.",
            "default": "auto"
          },
          "searchQueries": {
            "title": "🔎 Search queries",
            "type": "array",
            "description": "Keywords or phrases, e.g. \"web scraping\", \"climate change\", \"#art\", \"from:nytimes.com\", or a bsky.app/search URL. Each query is searched separately. Also the topics for people and starter pack search.",
            "items": {
              "type": "string"
            }
          },
          "handles": {
            "title": "👤 Accounts",
            "type": "array",
            "description": "Handles, DIDs or profile URLs, e.g. \"bsky.app\", \"@jay.bsky.team\", \"did:plc:z72i7hdynmk6r22z27h6tvur\", \"https://bsky.app/profile/nytimes.com\".",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "🔗 Post URLs",
            "type": "array",
            "description": "Post URLs or AT URIs, e.g. \"https://bsky.app/profile/bsky.app/post/3mtcnex43tk24\". Used for posts by URL, replies, quotes, likers and reposters.",
            "items": {
              "type": "string"
            }
          },
          "feedUrls": {
            "title": "📰 Custom feed URLs",
            "type": "array",
            "description": "Feed URLs or AT URIs, e.g. \"https://bsky.app/profile/bsky.app/feed/whats-hot\", or \"whats-hot\" for Discover.",
            "items": {
              "type": "string"
            }
          },
          "listUrls": {
            "title": "📋 List or starter pack URLs",
            "type": "array",
            "description": "List URLs (\"https://bsky.app/profile/bsky.app/lists/3lvpca43j5z26\"), starter pack URLs (\"https://bsky.app/starter-pack/<handle>/<id>\") or go.bsky.app short links.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🌐 Any Bluesky URLs",
            "type": "array",
            "description": "Any mix of bsky.app URLs (search, hashtag, profile, post, feed, list, starter pack) or a link to a text file with one URL per line. Each is routed by what it is.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sort": {
            "title": "↕️ Search order",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Latest walks back through time for as many posts as you ask for. Top returns Bluesky's best 100 for each query.",
            "default": "latest"
          },
          "dateFrom": {
            "title": "📅 From date",
            "type": "string",
            "description": "Only posts on or after this date: \"2026-10-01\", an ISO time, or relative like \"7 days\" or \"12 hours\". Empty = no lower bound."
          },
          "dateTo": {
            "title": "📅 To date",
            "type": "string",
            "description": "Only posts before the end of this date: \"2026-10-15\" includes all of 15 October (UTC). Also an ISO time or \"2 days\". Ignored in monitor mode for search."
          },
          "language": {
            "title": "🌍 Language",
            "type": "string",
            "description": "Two-letter language code, e.g. \"en\", \"de\", \"ja\". Search sends it to Bluesky; for feeds, posts that declare another language are left out."
          },
          "fromAuthor": {
            "title": "✍️ From author",
            "type": "string",
            "description": "Search only posts by this handle, e.g. \"nytimes.com\". On its own (no keyword) it returns all of that account's own posts."
          },
          "mentionsAuthor": {
            "title": "📣 Mentions",
            "type": "string",
            "description": "Search only posts that mention this handle, e.g. \"bsky.app\"."
          },
          "hashtags": {
            "title": "#️⃣ Hashtags",
            "type": "array",
            "description": "Search only posts with all of these hashtags (no #), e.g. \"art\". On their own they search the hashtag.",
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "🔗 Links to domain",
            "type": "string",
            "description": "Search only posts linking to this domain, e.g. \"nytimes.com\"."
          },
          "exactUrl": {
            "title": "🔗 Links to URL",
            "type": "string",
            "description": "Search only posts that link to this exact URL."
          },
          "authorFeedFilter": {
            "title": "🗂️ Account feed content",
            "enum": [
              "posts_with_replies",
              "posts_no_replies",
              "posts_and_author_threads",
              "posts_with_media",
              "posts_with_video"
            ],
            "type": "string",
            "description": "Which of an account's posts to read (Bluesky's own profile tabs). Reposts are included unless you switch them off below.",
            "default": "posts_with_replies"
          },
          "includePins": {
            "title": "📌 Include the pinned post",
            "type": "boolean",
            "description": "Also return each account's pinned post first (isPinned: true), even when it is older than your date window.",
            "default": false
          },
          "listContent": {
            "title": "📋 What to read from lists",
            "enum": [
              "members",
              "posts",
              "both"
            ],
            "type": "string",
            "description": "For list URLs: the accounts on the list, the list's feed of posts, or both.",
            "default": "members"
          },
          "includeReplies": {
            "title": "↩️ Include replies",
            "type": "boolean",
            "description": "Keep posts that reply to another post. Switch off for top-level posts only.",
            "default": true
          },
          "includeReposts": {
            "title": "🔁 Include reposts",
            "type": "boolean",
            "description": "Keep posts an account reposted (isRepost, repostedByHandle). Switch off for the account's own posts only.",
            "default": true
          },
          "onlyMedia": {
            "title": "🖼️ Only posts with images or video",
            "type": "boolean",
            "description": "Keep only posts with an image, gallery or video.",
            "default": false
          },
          "minLikes": {
            "title": "❤️ Minimum likes",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep posts with at least this many likes. 0 = no minimum."
          },
          "minReposts": {
            "title": "🔁 Minimum reposts",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep posts with at least this many reposts."
          },
          "minReplies": {
            "title": "💬 Minimum replies",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep posts with at least this many replies."
          },
          "minQuotes": {
            "title": "🗨️ Minimum quotes",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep posts quoted at least this many times."
          },
          "filterKeywords": {
            "title": "✅ Must contain (any)",
            "type": "array",
            "description": "Keep posts whose text, link card or hashtags contain at least one of these words, e.g. \"launch\", \"pricing\".",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "⛔ Must not contain",
            "type": "array",
            "description": "Drop posts containing any of these words.",
            "items": {
              "type": "string"
            }
          },
          "strictKeywordMatch": {
            "title": "🔤 Whole words only",
            "type": "boolean",
            "description": "Match the two keyword lists as whole words (\"ai\" will not match \"said\").",
            "default": false
          },
          "minAuthorFollowers": {
            "title": "👥 Author with at least N followers",
            "minimum": 0,
            "maximum": 10000000000,
            "type": "integer",
            "description": "Keep posts whose author has at least this many followers (looks each author up once)."
          },
          "respectOptOut": {
            "title": "🙈 Skip accounts that opted out of signed-out viewing",
            "type": "boolean",
            "description": "On: posts and profiles of accounts that ask apps not to show them to signed-out visitors (Bluesky label !no-unauthenticated) are left out and never charged.",
            "default": true
          },
          "skipAdultContent": {
            "title": "🔞 Skip adult-labelled posts",
            "type": "boolean",
            "description": "Drop posts (or authors) labelled porn, sexual, nudity or graphic media.",
            "default": false
          },
          "includeProfile": {
            "title": "👤 Add each account's profile row",
            "type": "boolean",
            "description": "With account feeds: one profile row per account (followers, posts, bio, links), charged as a profile.",
            "default": false
          },
          "scrapeComments": {
            "title": "💬 Add replies to each post",
            "type": "boolean",
            "description": "For every post found by search, feeds or URLs that has replies: its replies as kind \"comment\" rows (charged as posts).",
            "default": false
          },
          "maxComments": {
            "title": "💬 Max replies per post",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap on replies collected per post (default 100). In Replies mode it replaces Max results per input."
          },
          "threadDepth": {
            "title": "🧵 Reply depth",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many levels of replies to follow (1 = direct replies only). Default 6."
          },
          "replySort": {
            "title": "↕️ Reply order",
            "enum": [
              "likes",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "Order of replies within each level.",
            "default": "likes"
          },
          "includeRootPost": {
            "title": "🌱 Include the post itself",
            "type": "boolean",
            "description": "In Replies mode, also return the post the replies answer.",
            "default": false
          },
          "includeThreadParents": {
            "title": "⬆️ Include parent posts",
            "type": "boolean",
            "description": "For a post that is itself a reply: also return the posts above it (negative commentDepth).",
            "default": false
          },
          "includeProfileDetails": {
            "title": "📊 Full profiles for account lists",
            "type": "boolean",
            "description": "Followers, following, likers, reposters and list members with follower / following / post counts. Each row is then charged as a profile.",
            "default": false
          },
          "includeAuthorStats": {
            "title": "📊 Author counts on posts",
            "type": "boolean",
            "description": "Add authorFollowersCount, authorFollowsCount and authorPostsCount to every post (free).",
            "default": false
          },
          "includeLatestPost": {
            "title": "🕒 Latest post on profiles",
            "type": "boolean",
            "description": "Profile rows get latestPostAt, latestPostText and latestPostUrl (free).",
            "default": false
          },
          "includeMembers": {
            "title": "👥 Starter pack members",
            "type": "boolean",
            "description": "Starter pack rows include the full member list (handle, name, avatar, bio), up to Max members per pack.",
            "default": false
          },
          "maxMembersPerPack": {
            "title": "👥 Max members per pack",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Default 150 (Bluesky's starter pack limit)."
          },
          "includeTrendPosts": {
            "title": "📈 Posts for each trend",
            "type": "boolean",
            "description": "In Trending mode, also return posts from each trend's feed (charged as posts).",
            "default": false
          },
          "maxPostsPerTrend": {
            "title": "📈 Posts per trend",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Default 25."
          },
          "sentiment_analysis": {
            "title": "🙂 Sentiment",
            "type": "boolean",
            "description": "Add sentiment_score and sentiment_label (positive / neutral / negative) to posts and replies, from an English word list (free).",
            "default": false
          },
          "content_analysis": {
            "title": "🏷️ Content category",
            "type": "boolean",
            "description": "Add content_category_label, _path, _confidence and _match_type from keywords and hashtags (free).",
            "default": false
          },
          "monitorMode": {
            "title": "🔁 Only new since the last run",
            "type": "boolean",
            "description": "Remembers what earlier runs delivered (per query, account, post or list) and returns only new rows; profiles only when a count or field changed. A run with nothing new is not charged. Pairs with a schedule.",
            "default": false
          },
          "monitorStoreName": {
            "title": "🗄️ Monitor memory name",
            "type": "string",
            "description": "Name of the key-value store that keeps the memory. Use a different name for each separate watch.",
            "default": "bluesky-monitor"
          },
          "maxItems": {
            "title": "🔢 Max results (total)",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Stop the whole run after this many rows. 0 or empty = no total cap."
          },
          "maxItemsPerInput": {
            "title": "🔢 Max results per input",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Rows per query, account, post, feed or list (default 100). A latest-first search can go far past Bluesky's 100-per-page; account feeds go back to the first post.",
            "default": 100
          },
          "dedupe": {
            "title": "🧹 One row per post",
            "type": "boolean",
            "description": "When two inputs find the same post, return it once (with the first query that found it).",
            "default": true
          },
          "compact": {
            "title": "🤖 Compact output",
            "type": "boolean",
            "description": "Core fields only (text, author, counts, links, dates) - small rows for AI agents and MCP.",
            "default": false
          },
          "includeRaw": {
            "title": "🧾 Include raw record",
            "type": "boolean",
            "description": "Add the full AT Protocol record Bluesky returned, as `raw`.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "Leave off: the actor connects directly and switches to Apify Proxy by itself only if Bluesky refuses a request. Pick a proxy to send every request through it.",
            "default": {
              "useApifyProxy": false
            }
          },
          "maxConcurrency": {
            "title": "⚡ Parallel inputs",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many inputs are read at the same time (default 4). Search requests are paced to at most 4 per second either way.",
            "default": 4
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}