{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper | Enterprise Grade",
    "description": "Extract Bluesky posts and full comment threads from searches, subreddits, user pages, and direct post URLs. Built for enterprise-grade speed, richest-in-class data coverage, advanced filtering, and clean JSON for market intelligence, sentiment analysis, and analytics.",
    "version": "1.1",
    "x-build-id": "9JRCMybX0Kj6wLd9P"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fatihtahta~All-In-One-Bluesky-Scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fatihtahta-All-In-One-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/fatihtahta~All-In-One-Bluesky-Scraper/runs": {
      "post": {
        "operationId": "runs-sync-fatihtahta-All-In-One-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/fatihtahta~All-In-One-Bluesky-Scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fatihtahta-All-In-One-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": {
          "actionToPerform": {
            "title": "Choose What to Scrape",
            "enum": [
              "searchPosts",
              "getAuthorFeed",
              "getFollowers",
              "getFollows",
              "getProfile"
            ],
            "type": "string",
            "description": "Select whether the actor should search public posts, collect posts from known accounts, collect follower or following lists, or get profile details. This setting controls how values in the keyword or handle field below are interpreted.",
            "default": "searchPosts"
          },
          "queries": {
            "title": "Add Search Keywords or Bluesky Handles",
            "type": "array",
            "description": "Add one or more values for the selected scrape mode. For post search, enter keywords such as `web scraping` or `open source intelligence`. For author feeds, followers, follows, or profile details, enter Bluesky handles such as `bsky.app` or `apify.com`. You can also provide direct Bluesky URLs below in the same run.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Add Bluesky URLs to Scrape",
            "type": "array",
            "description": "Paste Bluesky URLs such as search pages, post pages, profile pages, followers pages, or follows/following pages. Search URLs collect matching posts, post URLs collect the post thread, profile URLs collect both the profile record and author feed, followers URLs collect followers, and follows/following URLs collect follows. Reply records from post and feed results are included only when reply collection is enabled below.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sortOrder": {
            "title": "Choose How Search Posts Are Ranked",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Select whether Bluesky post search should prioritize newest matching posts or top matching posts. This applies only to post search from search keywords or Bluesky search URLs; it does not affect profile, follower, follows, or direct post collection.",
            "default": "latest"
          },
          "dateFrom": {
            "title": "Keep Posts Starting From a Specific Date",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Choose the earliest post date to include. Date-only values are interpreted as UTC days and converted to a UTC `since:` filter for Bluesky search and local post filtering."
          },
          "dateTo": {
            "title": "Keep Posts Up to a Specific Date",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "Choose the latest post date to include. Date-only values include the full selected UTC day by converting the next UTC day start to an `until:` filter."
          },
          "language": {
            "title": "Filter by Language",
            "enum": [
              "",
              "aa",
              "ab",
              "ae",
              "af",
              "ak",
              "am",
              "an",
              "ar",
              "as",
              "av",
              "ay",
              "az",
              "ba",
              "be",
              "bg",
              "bh",
              "bi",
              "bm",
              "bn",
              "bo",
              "br",
              "bs",
              "ca",
              "ce",
              "ch",
              "co",
              "cr",
              "cs",
              "cu",
              "cv",
              "cy",
              "da",
              "de",
              "dv",
              "dz",
              "ee",
              "el",
              "en",
              "eo",
              "es",
              "et",
              "eu",
              "fa",
              "ff",
              "fi",
              "fj",
              "fo",
              "fr",
              "fy",
              "ga",
              "gd",
              "gl",
              "gn",
              "gu",
              "gv",
              "ha",
              "he",
              "hi",
              "ho",
              "hr",
              "ht",
              "hu",
              "hy",
              "hz",
              "ia",
              "id",
              "ie",
              "ig",
              "ii",
              "ik",
              "io",
              "is",
              "it",
              "iu",
              "ja",
              "jv",
              "ka",
              "kg",
              "ki",
              "kj",
              "kk",
              "kl",
              "km",
              "kn",
              "ko",
              "kr",
              "ks",
              "ku",
              "kv",
              "kw",
              "ky",
              "la",
              "lb",
              "lg",
              "li",
              "ln",
              "lo",
              "lt",
              "lu",
              "lv",
              "mg",
              "mh",
              "mi",
              "mk",
              "ml",
              "mn",
              "mr",
              "ms",
              "mt",
              "my",
              "na",
              "nb",
              "nd",
              "ne",
              "ng",
              "nl",
              "nn",
              "no",
              "nr",
              "nv",
              "ny",
              "oc",
              "oj",
              "om",
              "or",
              "os",
              "pa",
              "pi",
              "pl",
              "ps",
              "pt",
              "qu",
              "rm",
              "rn",
              "ro",
              "ru",
              "rw",
              "sa",
              "sc",
              "sd",
              "se",
              "sg",
              "si",
              "sk",
              "sl",
              "sm",
              "sn",
              "so",
              "sq",
              "sr",
              "ss",
              "st",
              "su",
              "sv",
              "sw",
              "ta",
              "te",
              "tg",
              "th",
              "ti",
              "tk",
              "tl",
              "tn",
              "to",
              "tr",
              "ts",
              "tt",
              "tw",
              "ty",
              "ug",
              "uk",
              "ur",
              "uz",
              "ve",
              "vi",
              "vo",
              "wa",
              "wo",
              "xh",
              "yi",
              "yo",
              "za",
              "zh",
              "zu"
            ],
            "type": "string",
            "description": "Optionally choose a language. For post search, the actor appends `lang:<code>` to each search query.",
            "default": ""
          },
          "fromAuthor": {
            "title": "Filter Search to Posts From an Author",
            "type": "string",
            "description": "Optionally enter a Bluesky handle such as `jay.bsky.team`. For post search, the actor appends `from:<handle>` to each search query."
          },
          "mentionsAuthor": {
            "title": "Filter Search to Posts Mentioning an Author",
            "type": "string",
            "description": "Optionally enter a Bluesky handle such as `jay.bsky.team`. For post search, the actor appends `mentions:<handle>` to each search query."
          },
          "hashtags": {
            "title": "Filter Search by Hashtags",
            "type": "array",
            "description": "Optionally add one or more hashtags. You can enter values with or without `#`; the actor appends each one as a Bluesky hashtag search term.",
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "Filter Search by Linked Domain",
            "type": "string",
            "description": "Optionally enter a domain such as `npr.org` or `example.com`. For post search, the actor appends `domain:<domain>` to each search query."
          },
          "exactUrl": {
            "title": "Filter Search by Exact Shared URL",
            "type": "string",
            "description": "Optionally paste a full URL. For post search, the actor appends the URL to each query so Bluesky returns posts that shared it."
          },
          "minLikes": {
            "title": "Keep Posts With at Least This Many Likes",
            "minimum": 0,
            "type": "integer",
            "description": "Optionally keep only post and reply records whose returned like count is at least this value. This filter is applied locally after Bluesky returns results."
          },
          "minReposts": {
            "title": "Keep Posts With at Least This Many Reposts",
            "minimum": 0,
            "type": "integer",
            "description": "Optionally keep only post and reply records whose returned repost count is at least this value. This filter is applied locally after Bluesky returns results."
          },
          "minReplies": {
            "title": "Keep Posts With at Least This Many Replies",
            "minimum": 0,
            "type": "integer",
            "description": "Optionally keep only post records whose returned reply count is at least this value. This filter is applied locally after Bluesky returns results."
          },
          "includeReplies": {
            "title": "Include Reply Posts in Saved Post Results",
            "type": "boolean",
            "description": "Disable this to skip post records that are replies to another post. This controls saved post-like records; `Include Replies from Each Post` still controls whether the actor fetches thread replies.",
            "default": true
          },
          "includeReposts": {
            "title": "Include Reposts in Saved Post Results",
            "type": "boolean",
            "description": "Disable this to skip feed/search records returned because they were reposted by another account.",
            "default": true
          },
          "scrapeComments": {
            "title": "Include Replies from Each Post",
            "type": "boolean",
            "description": "Enable this to collect Bluesky replies along with each scraped post from post search, author feeds, and direct post URLs. Replies are saved as separate comment records, so this can make runs slower and produce larger datasets.",
            "default": false
          },
          "maxComments": {
            "title": "Set a Reply Limit per Post",
            "minimum": 1,
            "type": "integer",
            "description": "Choose the maximum number of replies to collect from each source post when reply collection is enabled. Lower limits help keep runs faster and datasets smaller.",
            "default": 50000
          },
          "maxItems": {
            "title": "Set a Total Record Limit",
            "minimum": 1,
            "type": "integer",
            "description": "Choose the maximum number of records to save across all keywords, handles, URLs, and collected replies. When reply collection is enabled, reply/comment records count toward this same total. Leave empty to collect all available matching records."
          },
          "sentiment_analysis": {
            "title": "Add Sentiment Scores and Labels to Posts and Comments",
            "type": "boolean",
            "description": "Enable this to analyze each scraped post using its text, and each scraped reply using its text when reply collection is enabled, with the AFINN-165 sentiment lexicon. When turned on, the actor adds a numeric sentiment_score and a sentiment_label of positive, negative, or neutral to supported output records.",
            "default": false
          },
          "content_analysis": {
            "title": "Classify Posts into Content Categories",
            "type": "boolean",
            "description": "Enable this to classify each post. When turned on, the actor adds content_category_label and content_category_path to matching post records so they are easier to group, filter, and analyze by topic.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}