{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper - Profiles, Posts, Followers & Leads",
    "description": "Scrape Bluesky (AT Protocol) with no login: search users by keyword, pull rich profiles with follower counts & verification, fetch posts, and map followers/following. Extracts bio emails & links for creator lead-gen. Monitor mode + JSON/CSV/Excel export.",
    "version": "1.0",
    "x-build-id": "K92ybgaTkStltth0a"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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": "Mode",
            "enum": [
              "searchUsers",
              "profiles",
              "userPosts",
              "followers",
              "following",
              "searchPosts"
            ],
            "type": "string",
            "description": "What to scrape. <b>searchUsers</b>: find profiles by keyword. <b>profiles</b>: full details for specific handles. <b>userPosts</b>: a user's posts. <b>followers</b> / <b>following</b>: map a user's audience. <b>searchPosts</b>: keyword post search (needs the optional login below).",
            "default": "searchUsers"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords for <b>searchUsers</b> and <b>searchPosts</b> modes, e.g. <code>photographer</code>, <code>indie game dev</code>, <code>climate</code>. Each term is scraped separately.",
            "items": {
              "type": "string"
            }
          },
          "actors": {
            "title": "Handles / DIDs / profile URLs",
            "type": "array",
            "description": "Bluesky users for <b>profiles</b>, <b>userPosts</b>, <b>followers</b> and <b>following</b> modes. Accepts handles (<code>bsky.app</code>, <code>@nasa.gov</code>), DIDs (<code>did:plc:...</code>), or profile URLs (<code>https://bsky.app/profile/bsky.app</code>). A bare username is treated as <code>username.bsky.social</code>.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "Max results per query",
            "minimum": 1,
            "type": "integer",
            "description": "Cap on records per search term or per actor (followers, posts, etc.). The actor paginates to reach this number.",
            "default": 100
          },
          "enrichProfiles": {
            "title": "Enrich discovered profiles (follower counts, etc.)",
            "type": "boolean",
            "description": "For searchUsers / followers / following: fetch each user's full profile (follower count, following count, post count, verification). Adds one batched lookup per 25 users. Turn off for a faster, lighter run.",
            "default": true
          },
          "includePosts": {
            "title": "Include recent posts per user",
            "type": "boolean",
            "description": "For searchUsers / profiles modes: also output each user's most recent posts as separate post records.",
            "default": false
          },
          "maxPostsPerUser": {
            "title": "Max posts per user",
            "minimum": 1,
            "type": "integer",
            "description": "How many recent posts to fetch per user when 'Include recent posts' is on.",
            "default": 20
          },
          "postFilter": {
            "title": "Post filter (author feed)",
            "enum": [
              "posts_no_replies",
              "posts_with_replies",
              "posts_and_author_threads",
              "posts_with_media"
            ],
            "type": "string",
            "description": "Which posts to include in userPosts / 'include recent posts'.",
            "default": "posts_no_replies"
          },
          "enrichEmails": {
            "title": "Crawl bio links for contact emails",
            "type": "boolean",
            "description": "Visit each profile's personal website / link-in-bio (Linktree, Beacons, Carrd, …) and extract contact emails. Bluesky bios often already contain a business email — this finds the rest. Adds a small fetch per profile that has a crawlable link.",
            "default": false
          },
          "identifier": {
            "title": "Bluesky handle or email (optional)",
            "type": "string",
            "description": "Only needed for <b>searchPosts</b> (keyword post search), which Bluesky restricts on the anonymous API. Your handle (e.g. <code>you.bsky.social</code>) or account email."
          },
          "appPassword": {
            "title": "Bluesky app password (optional)",
            "type": "string",
            "description": "An App Password (format xxxx-xxxx-xxxx-xxxx) from Bluesky Settings → App Passwords. Used only to create a read session for searchPosts. Stored securely."
          },
          "monitorMode": {
            "title": "Monitor mode (only emit new records)",
            "type": "boolean",
            "description": "Remember records seen in previous runs (by post URI / profile DID) and output only NEW ones on each run. Pair with Apify Schedules to track new posts from accounts, new followers, or newly matching users. Complements (does not conflict with) the scheduler.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor state store name",
            "type": "string",
            "description": "Named key-value store that holds the 'already seen' ids for monitor mode. Use different names to track different watchlists independently. Lowercase letters, digits and hyphens only.",
            "default": "bluesky-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "How many search terms / actors to process in parallel.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for outbound requests. The Bluesky API is reachable from datacenter IPs; the default Apify Proxy is fine and rotates IPs for higher throughput.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}