{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper: Posts, Profiles & Followers",
    "description": "Scrape Bluesky without a login: profile posts, search results, full threads with replies, quotes, likers and reposters, profiles and followers. Image alt text, video links, verification, reply settings and hidden replies included. Export to CSV, Excel or JSON, or use the API.",
    "version": "0.1",
    "x-build-id": "eUKNBJsrOWXC5thiR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sz022~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sz022-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/sz022~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sz022-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/sz022~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sz022-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": {
          "profiles": {
            "title": "Profiles",
            "type": "array",
            "description": "Bluesky handles, DIDs or profile URLs, one per line: bsky.app, @jay.bsky.team, did:plc:z72i7hdynmk6r22z27h6tvur or https://bsky.app/profile/bsky.app. A name without a dot is read as name.bsky.social. Each profile gives one profile row, then its posts, followers and follows as set below.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerProfile": {
            "title": "Posts per profile",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many of each profile's most recent posts to return. 0 returns the profile row only.",
            "default": 20
          },
          "feedFilter": {
            "title": "Which posts",
            "enum": [
              "posts_with_replies",
              "posts_no_replies",
              "posts_and_author_threads",
              "posts_with_media",
              "posts_with_video"
            ],
            "type": "string",
            "description": "The same choice as the tabs on a Bluesky profile.",
            "default": "posts_with_replies"
          },
          "includeReposts": {
            "title": "Include reposts",
            "type": "boolean",
            "description": "Posts the profile reposted, marked with isRepost, repostedBy and repostedAt. Off returns only the profile's own posts.",
            "default": true
          },
          "includePinnedPost": {
            "title": "Include the pinned post",
            "type": "boolean",
            "description": "Puts the profile's pinned post first, marked isPinned, whatever its date.",
            "default": false
          },
          "postsNewerThan": {
            "title": "Only posts newer than",
            "type": "string",
            "description": "Optional. Stop reading a profile's posts at this date: 2026-10-01, or a relative value such as 7 days."
          },
          "maxFollowersPerProfile": {
            "title": "Followers per profile",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many of each profile's followers to list, newest first. 0 lists none.",
            "default": 0
          },
          "maxFollowsPerProfile": {
            "title": "Follows per profile",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many of the accounts each profile follows to list. 0 lists none.",
            "default": 0
          },
          "enrichUsers": {
            "title": "Full profiles for listed accounts",
            "type": "boolean",
            "description": "Followers, follows, likers and reposters come as user rows: handle, name, bio, avatar, verification. Turn this on to get each as a full profile row with follower, follow and post counts instead. Charged as a profile row rather than a user row.",
            "default": false
          },
          "includeHandleHistory": {
            "title": "Handle history",
            "type": "boolean",
            "description": "Every handle each profile has used and since when, plus the server hosting it, from the public PLC directory. One extra request per profile, charged as its own event.",
            "default": false
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "Bluesky post URLs or at:// URIs, one per line, for example https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l. Each gives the post itself, and the replies, quotes, likers and reposters asked for below.",
            "items": {
              "type": "string"
            }
          },
          "maxRepliesPerPost": {
            "title": "Replies per post",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "How many replies to return from each post's thread, in Bluesky's own order, nested replies included. Each row has its threadDepth and whether the author hid it. 0 returns none.",
            "default": 0
          },
          "threadDepth": {
            "title": "Thread depth",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many levels of replies to follow: 1 is direct replies only.",
            "default": 10
          },
          "maxQuotesPerPost": {
            "title": "Quote posts per post",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many posts quoting each post to return. 0 returns none.",
            "default": 0
          },
          "maxLikersPerPost": {
            "title": "Likers per post",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many accounts that liked each post to list, newest first, with likedAt. 0 lists none.",
            "default": 0
          },
          "maxRepostersPerPost": {
            "title": "Reposters per post",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "How many accounts that reposted each post to list. 0 lists none.",
            "default": 0
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Words, phrases or hashtags to search posts for, one per line. Bluesky's search syntax works: \"exact phrase\", from:bsky.app, mentions:bsky.app, domain:example.com, #hashtag, lang:en.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerSearch": {
            "title": "Posts per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "How many posts to return for each query. Sorted by Top, a search returns at most 100.",
            "default": 100
          },
          "searchSort": {
            "title": "Sort",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Latest is newest first and has no limit; Top is Bluesky's ranking and stops at 100 posts.",
            "default": "latest"
          },
          "searchSince": {
            "title": "Posted after",
            "type": "string",
            "description": "Optional: 2026-10-01, or a relative value such as 7 days."
          },
          "searchUntil": {
            "title": "Posted before",
            "type": "string",
            "description": "Optional: 2026-10-15, or a relative value such as 1 day."
          },
          "searchLanguage": {
            "title": "Language",
            "type": "string",
            "description": "Optional two-letter language code, such as en, ja or pt, matched against the language the author set on the post."
          },
          "includeHiddenAccounts": {
            "title": "Include accounts hidden from logged-out visitors",
            "type": "boolean",
            "description": "Some people ask Bluesky not to show their account to visitors who are not signed in. Their profiles, posts and list entries are left out by default: a profile or post URL of theirs comes back as hidden_by_user (free), and their posts in feeds, threads and searches are skipped. Turn this on only if you have a reason to read them anyway.",
            "default": false
          },
          "abortAfterConsecutiveFailures": {
            "title": "Stop after this many failures in a row",
            "minimum": 0,
            "type": "integer",
            "description": "Ends the run early when Bluesky stops answering. Profiles and posts that do not exist do not count toward this. 0 never stops early.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Bluesky's public API needs no proxy, so none is used by default. Turn on Apify's datacenter proxy if a run keeps hitting rate limits: each retry then goes out from a fresh IP. Residential and SERP groups are not used; a run that asks for them falls back to datacenter.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}