{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Omni Scraper",
    "description": "Extract posts, profiles, threads and followers from Bluesky via the official AT Protocol API. Search by keyword or hashtag, scrape author feeds, full threads and follower lists. No browser, no login. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "FgRZMfmev6uuCbWcC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/actorpilot~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-actorpilot-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/actorpilot~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-actorpilot-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/actorpilot~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-actorpilot-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 do you want to scrape?",
            "enum": [
              "searchPosts",
              "authorFeed",
              "postThread",
              "profile",
              "followers",
              "follows",
              "customFeed"
            ],
            "type": "string",
            "description": "Choose a scrape mode. Each mode requires different settings below.",
            "default": "searchPosts"
          },
          "searchQuery": {
            "title": "Search query",
            "minLength": 1,
            "type": "string",
            "description": "Keyword or hashtag to search for. Examples: 'climate change', '#AI', 'OpenAI lang:en'. Bluesky search syntax is supported.",
            "default": "#AI"
          },
          "searchSort": {
            "title": "Sort results by",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Sort search results by newest first, or by most likes and reposts. Applies to: searchPosts",
            "default": "latest"
          },
          "searchSince": {
            "title": "From date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}(T[0-9:.Z+-]*)?$",
            "type": "string",
            "description": "Only return posts on or after this date. Format: YYYY-MM-DD, e.g. 2024-01-15. Leave empty for no lower limit. Applies to: searchPosts"
          },
          "searchUntil": {
            "title": "To date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}(T[0-9:.Z+-]*)?$",
            "type": "string",
            "description": "Only return posts on or before this date. Format: YYYY-MM-DD, e.g. 2024-12-31. Leave empty for no upper limit. Applies to: searchPosts"
          },
          "searchLang": {
            "title": "Language filter",
            "type": "string",
            "description": "Only return posts in a specific language. Use a two-letter ISO 639-1 code: 'en' for English, 'de' for German, 'fr' for French, 'es' for Spanish, 'ja' for Japanese. Leave empty for all languages. Applies to: searchPosts"
          },
          "handles": {
            "title": "Bluesky handles",
            "type": "array",
            "description": "Enter Bluesky handles without the @ symbol. Both formats work: 'username.bsky.social' or a custom domain like 'nytimes.com'. Multiple handles are processed in sequence.",
            "items": {
              "type": "string",
              "pattern": "^(?!@)[a-zA-Z0-9][-a-zA-Z0-9.]*\\.[a-zA-Z]{2,}$"
            },
            "default": [
              "bsky.app"
            ]
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Also collect posts where this account replied to someone. Disabled by default — only top-level posts are returned. Applies to: authorFeed",
            "default": false
          },
          "includeReposts": {
            "title": "Include reposts",
            "type": "boolean",
            "description": "Also collect posts that this account reposted from others. Disabled by default. Applies to: authorFeed",
            "default": false
          },
          "postUrl": {
            "title": "Post URL (copy from bsky.app)",
            "type": "string",
            "description": "Paste the URL of any Bluesky post directly from your browser address bar. Example: 'https://bsky.app/profile/username.bsky.social/post/abc123'. AT URIs (at://...) are also accepted. Applies to: postThread"
          },
          "feedUri": {
            "title": "Custom feed URI",
            "type": "string",
            "description": "The AT URI of a Bluesky feed generator. How to find it: (1) Open any feed on bsky.app, click '...' → 'Share feed' and copy the link — then paste the at:// part. (2) Or browse and discover feeds at skyfeed.app. Only public feeds work without login. Example: at://did:plc:.../app.bsky.feed.generator/whats-hot. Applies to: customFeed"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum number of results to collect. Set to 0 to collect everything available — warning: this can take a very long time and generate high costs for popular accounts or broad search queries. Tip: start with 100 to test your settings first.",
            "default": 100
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}