{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper: Posts, Profiles, Followers and Feeds",
    "description": "Scrape Bluesky without a login: user posts, keyword search, profiles, followers and follows, full reply threads, likers and reposters, and custom or list feeds. Clean typed records with engagement counts, hashtags, mentions, links and image alt text, from the official public AT Protocol API.",
    "version": "1.0",
    "x-build-id": "WjbErq0FeH4jANIky"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/angadseth~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-angadseth-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/angadseth~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-angadseth-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/angadseth~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-angadseth-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": "What to scrape",
            "enum": [
              "userPosts",
              "searchPosts",
              "profiles",
              "searchProfiles",
              "followers",
              "follows",
              "postThread",
              "postEngagement",
              "customFeed"
            ],
            "type": "string",
            "description": "User posts: the posts of the users below. Search posts: posts matching the search terms. Profiles: profile details of the users below. Search profiles: accounts matching the search terms. Followers / Follows: who follows the users below, or who they follow. Post thread: a post with its parents and its full reply tree, flattened. Post engagement: who liked or reposted a post (and its quote posts). Custom feed: posts from a feed or list.",
            "default": "userPosts"
          },
          "users": {
            "title": "Users (for user posts, profiles, followers, follows)",
            "type": "array",
            "description": "Handles, DIDs or profile URLs, one per line, e.g. bsky.app, @jay.bsky.team, did:plc:z72i7hdynmk6r22z27h6tvur or https://bsky.app/profile/nytimes.com. A bare name like \"alice\" means alice.bsky.social.",
            "default": [
              "bsky.app"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search terms (for search posts, search profiles)",
            "type": "array",
            "description": "One search per line. Post search supports Bluesky's search syntax, e.g. \"climate\", \"#ai\", \"from:nytimes.com\", \"\\\"exact phrase\\\"\", \"domain:github.com\", \"mentions:bsky.app\". Logged-out search returns up to 100 posts per term.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post URLs (for post thread, post engagement)",
            "type": "array",
            "description": "Post links like https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l, or at:// URIs, one per line.",
            "items": {
              "type": "string"
            }
          },
          "feeds": {
            "title": "Feeds or lists (for custom feed)",
            "type": "array",
            "description": "Custom feed links (https://bsky.app/profile/<creator>/feed/<id>), list links (https://bsky.app/profile/<creator>/lists/<id>) or at:// URIs, one per line. \"discover\" is a shortcut for Bluesky's Discover feed.",
            "items": {
              "type": "string"
            }
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "User posts and feeds: also keep posts that are replies to someone. Off = top-level posts only. Search always keeps replies (isReply marks them).",
            "default": false
          },
          "includeReposts": {
            "title": "Include reposts",
            "type": "boolean",
            "description": "User posts and feeds: also keep posts the user reposted (marked isRepost, with repostedAt).",
            "default": false
          },
          "includePinned": {
            "title": "Include pinned post",
            "type": "boolean",
            "description": "User posts: keep the user's pinned post (marked isPinned) even if it is old. Date filters still apply.",
            "default": true
          },
          "onlyWithMedia": {
            "title": "Only posts with images or video",
            "type": "boolean",
            "description": "User posts and feeds: keep only posts that have images or a video.",
            "default": false
          },
          "since": {
            "title": "Posted since",
            "type": "string",
            "description": "Keep posts created on or after this date. A date like 2026-10-01, an ISO time, or a relative time like \"7 days\" or \"24 hours\". For user posts the Actor stops paging once it reaches older posts."
          },
          "until": {
            "title": "Posted until",
            "type": "string",
            "description": "Keep posts created on or before this date (same formats as Posted since)."
          },
          "keywords": {
            "title": "Keep posts containing (feed filter)",
            "type": "array",
            "description": "User posts, feeds and search: keep only posts whose text contains any of these words. Case does not matter. Leave empty for all posts.",
            "items": {
              "type": "string"
            }
          },
          "searchSort": {
            "title": "Search order",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Search posts: newest first, or Bluesky's top (most engaging) results.",
            "default": "latest"
          },
          "searchLanguage": {
            "title": "Search language",
            "type": "string",
            "description": "Search posts: only posts in this language, as a two-letter code like en, ja, pt or de. Leave empty for all languages."
          },
          "engagementTypes": {
            "title": "Engagement to collect",
            "type": "array",
            "description": "Post engagement: which lists to read. likes = accounts that liked the post, reposts = accounts that reposted it, quotes = posts that quote it. Default: likes and reposts.",
            "items": {
              "type": "string",
              "enum": [
                "likes",
                "reposts",
                "quotes"
              ],
              "enumTitles": [
                "Likers",
                "Reposters",
                "Quote posts"
              ]
            },
            "default": [
              "likes",
              "reposts"
            ]
          },
          "includeParents": {
            "title": "Include parent posts",
            "type": "boolean",
            "description": "Post thread: also save the posts above the given post, up to the thread root (threadDepth below 0).",
            "default": true
          },
          "threadDepth": {
            "title": "Reply depth",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Post thread: how many levels of replies to read below the post (1 = direct replies only, up to 1000).",
            "default": 1000
          },
          "fullProfiles": {
            "title": "Full profile details",
            "type": "boolean",
            "description": "Followers, follows, likers, reposters and profile search: add follower, following and post counts and the banner (one extra request per 25 accounts).",
            "default": true
          },
          "authorDetails": {
            "title": "Add author follower counts to posts",
            "type": "boolean",
            "description": "Fill authorFollowersCount, authorFollowsCount and authorPostsCount on every post (one extra request per 25 new authors). In user posts mode the user's own counts are always filled for free.",
            "default": false
          },
          "maxItems": {
            "title": "Max records",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many records in total. It is shared fairly across your inputs. You pay per record saved.",
            "default": 20
          },
          "maxItemsPerInput": {
            "title": "Max records per input",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Optional cap for each user, search term, post or feed. 0 = share Max records evenly; share an input cannot use goes to the inputs that have more.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}