{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper - Posts, Profiles, Threads & Feeds (No Login)",
    "description": "Scrape public Bluesky posts, replies, full threads, custom feeds (Discover), post search and profiles with likes, reposts, quotes and follower counts. Official public API, no login or app password, no start fee. Only-new mode for monitoring.",
    "version": "0.1",
    "x-build-id": "0nspZqiS5gOE1JUWk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rjmacarthy~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rjmacarthy-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/rjmacarthy~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rjmacarthy-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/rjmacarthy~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rjmacarthy-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "posts",
              "profiles",
              "thread",
              "feed",
              "search",
              "searchProfiles"
            ],
            "type": "string",
            "description": "Posts: the posts tab of each account in \"Handles\". Profiles: profile details for \"Handles\". Thread: each post in \"Post URLs\" with its replies, flattened with depth. Feed: posts from the custom feeds in \"Feeds\". Search: posts matching \"Search queries\". Search accounts: profiles matching \"Search queries\".",
            "default": "posts"
          },
          "handles": {
            "title": "Handles",
            "type": "array",
            "description": "For the Posts and Profiles modes. Bluesky handles (bsky.app, name.bsky.social, @nytimes.com), DIDs (did:plc:...) or profile URLs (https://bsky.app/profile/bsky.app). A bare name like \"jay\" means jay.bsky.social.",
            "default": [
              "bsky.app"
            ],
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post URLs",
            "type": "array",
            "description": "For the Thread mode. Post links like https://bsky.app/profile/bsky.app/post/3mzhhvhjfwk22, or at:// post URIs. The post and its replies are output, replies level by level.",
            "items": {
              "type": "string"
            }
          },
          "feeds": {
            "title": "Feeds",
            "type": "array",
            "description": "For the Feed mode. Custom feed links like https://bsky.app/profile/bsky.app/feed/whats-hot, at://did:.../app.bsky.feed.generator/<id> URIs, or \"discover\" for Bluesky's Discover feed. Public feeds work without login; feeds that personalise by account return their logged-out version.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "For the Search posts and Search accounts modes. Keywords, \"exact phrases\", #hashtags, or Bluesky search operators such as from:nytimes.com, domain:example.com or lang:en.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items (total)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of items (posts or profiles) for the whole run. 0 = no limit (careful: big accounts have tens of thousands of posts).",
            "default": 100
          },
          "maxPostsPerAuthor": {
            "title": "Max items per input",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum items per handle, feed, query or thread, so one big input does not use up \"Max items (total)\". 0 = no per-input limit.",
            "default": 0
          },
          "sinceDate": {
            "title": "Only posts since",
            "type": "string",
            "description": "Skip posts older than this date (e.g. 2026-10-01 or \"7 days\"). In Posts mode, reposts count by the time they were reposted, and the Actor stops paging once it reaches older posts. Search passes it to Bluesky as the \"since\" filter."
          },
          "filter": {
            "title": "Posts filter (Posts mode)",
            "enum": [
              "posts_and_author_threads",
              "posts_no_replies",
              "posts_with_replies",
              "posts_with_media",
              "posts_with_video"
            ],
            "type": "string",
            "description": "Which posts of each account to return.",
            "default": "posts_and_author_threads"
          },
          "includeReposts": {
            "title": "Include reposts (Posts mode)",
            "type": "boolean",
            "description": "Include posts the account reposted (marked isRepost, with repostedByHandle and repostedAt). Turn off to get only the account's own posts.",
            "default": true
          },
          "threadDepth": {
            "title": "Reply depth (Thread mode)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many levels of replies to fetch below each post. 1 = direct replies only.",
            "default": 6
          },
          "searchSort": {
            "title": "Search sort",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Order of post search results.",
            "default": "latest"
          },
          "searchLanguage": {
            "title": "Search language",
            "type": "string",
            "description": "Only search results in this language (two-letter code like en, de, ja, pt). Leave empty for all languages."
          },
          "onlyNew": {
            "title": "Only new posts (monitoring)",
            "type": "boolean",
            "description": "Skip posts already output by an earlier run with the same \"State key\", so scheduled runs only return (and charge for) new posts. Works for the Posts, Thread, Feed and Search modes.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name of this monitor. Use a different key for each schedule that should keep its own memory of seen posts.",
            "default": "default"
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps the seen-post memory between runs.",
            "default": "bluesky-scraper-state"
          },
          "maxRequestsPerSecond": {
            "title": "Max requests per second",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Request rate towards the Bluesky API (at most 5; Bluesky allows about 3,000 requests per 5 minutes per IP). Lower it if you see HTTP 429 retries.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Not needed normally: the Bluesky API is open. Enable Apify Proxy (datacenter) if your runs are rate-limited or post search returns HTTP 403. Residential proxies are not supported: if you pick the RESIDENTIAL group, the Actor logs a warning and uses Apify datacenter proxy instead.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}