{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper",
    "description": "Scrape Bluesky (AT Protocol) posts by keyword, hashtag, author handle, or custom feed. Export likes, reposts, replies, hashtags, mentions, embeds, and full metadata as JSON or CSV. Built for AI training datasets, social analytics, brand monitoring, and trend tracking.",
    "version": "0.1",
    "x-build-id": "ZcJ48uoGAVQfDVLps"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/legend006~bluesky-firehose-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-legend006-bluesky-firehose-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/legend006~bluesky-firehose-scraper/runs": {
      "post": {
        "operationId": "runs-sync-legend006-bluesky-firehose-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/legend006~bluesky-firehose-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-legend006-bluesky-firehose-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",
          "bskyHandle",
          "bskyAppPassword"
        ],
        "properties": {
          "mode": {
            "title": "Scrape mode",
            "enum": [
              "search",
              "author",
              "feed"
            ],
            "type": "string",
            "description": "What to scrape. 'search' uses keywords/hashtags. 'author' pulls a specific user's feed. 'feed' pulls a public custom feed by URI.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords or hashtags to search (e.g. 'bitcoin', '#ai', 'climate change'). Used when mode = search.",
            "default": [
              "#ai"
            ],
            "items": {
              "type": "string"
            }
          },
          "authors": {
            "title": "Author handles",
            "type": "array",
            "description": "Bluesky handles, e.g. 'bsky.app' or 'jay.bsky.team'. Used when mode = author.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "feedUris": {
            "title": "Feed URIs",
            "type": "array",
            "description": "AT Protocol feed URIs (at://...). Used when mode = feed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of posts to return per input target.",
            "default": 1000
          },
          "since": {
            "title": "Since (ISO date)",
            "type": "string",
            "description": "Only return posts created at or after this UTC date. Format: YYYY-MM-DD or full ISO 8601. Leave empty for no lower bound."
          },
          "until": {
            "title": "Until (ISO date)",
            "type": "string",
            "description": "Only return posts created before this UTC date. Leave empty for no upper bound."
          },
          "language": {
            "title": "Language filter",
            "type": "string",
            "description": "Two-letter language code (e.g. 'en', 'ja'). Search mode only."
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Author mode only. Include reply posts in addition to top-level posts.",
            "default": false
          },
          "bskyHandle": {
            "title": "Bluesky handle ⚠️ Required",
            "type": "string",
            "description": "Your Bluesky handle, e.g. 'yourname.bsky.social'. Required because Bluesky's CDN blocks unauthenticated requests from datacenter IPs. Free Bluesky account: sign up at https://bsky.app (60 seconds)."
          },
          "bskyAppPassword": {
            "title": "Bluesky App Password ⚠️ Required",
            "type": "string",
            "description": "An App Password (NOT your main password). Generate at https://bsky.app/settings/app-passwords (10 seconds). Format: 'xxxx-xxxx-xxxx-xxxx'. Revocable any time. We never store it."
          },
          "proxyConfiguration": {
            "title": "Apify Proxy configuration (optional)",
            "type": "object",
            "description": "Optional. Routes outbound requests through Apify Proxy. Useful for residential IPs on paid plans. Free-tier datacenter proxies are blocked by Bluesky's CDN.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}