{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Monitor & Scraper — Posts, Keywords, Followers",
    "description": "Search Bluesky posts by keyword or hashtag, scrape profiles with follower counts, author feeds, followers, thread replies, quotes, likes, custom feeds and lists from the public AT Protocol API. Flat JSON/CSV, no login or proxies. Pay per post ($0.0005) or profile ($0.002).",
    "version": "0.1",
    "x-build-id": "ij9mqqsn7huWqDLm9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/owlabee~bluesky-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-owlabee-bluesky-monitor",
        "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/owlabee~bluesky-monitor/runs": {
      "post": {
        "operationId": "runs-sync-owlabee-bluesky-monitor",
        "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/owlabee~bluesky-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-owlabee-bluesky-monitor",
        "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",
          "queries"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "searchPosts",
              "profiles",
              "authorFeed",
              "followers",
              "following",
              "searchActors",
              "postThread",
              "quotes",
              "likedBy",
              "repostedBy",
              "customFeed",
              "listFeed",
              "listMembers",
              "starterPack"
            ],
            "type": "string",
            "description": "What to scrape. `authorFeed`, `profiles`, `followers` and `following` treat Queries as Bluesky handles (e.g. `bsky.app`), DIDs or profile URLs; `searchPosts` and `searchActors` treat them as keywords or hashtags. `searchPosts` returns at most 100 posts per query per run (Bluesky's public search serves one page without a login); use `since`, narrower keywords or several queries for more. Opt-in record modes take one record URL per query: `postThread` (every reply below a post), `quotes` (posts quoting a post), `likedBy` and `repostedBy` (accounts that liked or reposted a post) take post URLs; `customFeed` takes a custom feed URL; `listFeed` (posts by the list's members) and `listMembers` (the list's accounts as full profiles) take a list URL; `starterPack` takes a starter pack URL.",
            "default": "authorFeed"
          },
          "queries": {
            "title": "Queries",
            "minItems": 1,
            "type": "array",
            "description": "One entry per line. Handles, DIDs or profile URLs for `authorFeed`, `profiles`, `followers` and `following` (e.g. `bsky.app`, `did:plc:z72i7hdynmk6r22z27h6tvur`, `https://bsky.app/profile/bsky.app`); keywords or hashtags for `searchPosts` / `searchActors` (e.g. `apify`, `#opensource`, `\"exact phrase\"`). Record modes take bsky.app URLs or at:// URIs: a post (`https://bsky.app/profile/bsky.app/post/3l6oveex3ii2l`) for `postThread`, `quotes`, `likedBy`, `repostedBy`; a custom feed (`https://bsky.app/profile/bsky.app/feed/whats-hot`) for `customFeed`; a list (`https://bsky.app/profile/<handle>/lists/<id>`) for `listFeed` and `listMembers`; a starter pack (`https://bsky.app/starter-pack/<handle>/<id>`) for `starterPack`. The prefilled value is the cheap, always-available example used by Apify's daily automated test.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Upper bound on dataset items across all queries (posts, profiles, followers, likers or reposters depending on Mode). Use it together with the run's maximum cost to control spend.",
            "default": 200
          },
          "sort": {
            "title": "Sort (searchPosts only)",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "`latest` returns the newest matching posts first (best for monitoring); `top` returns the most engaged posts first.",
            "default": "latest"
          },
          "since": {
            "title": "Since (optional)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$",
            "type": "string",
            "description": "Only return posts created on or after this date. ISO date (`2026-10-01`) or datetime (`2026-10-01T12:00:00Z`). Applies to the post modes (`searchPosts`, `authorFeed`, `postThread`, `quotes`, `customFeed`, `listFeed`); ignored by the other modes."
          },
          "onlyNewSinceLastRun": {
            "title": "Only new since last run",
            "type": "boolean",
            "description": "Monitor mode. Remembers what previous runs already returned (per Mode and query) in the state store and emits only records not seen before: new posts, replies and quotes, new followers / follows / likers / reposters / list members, new or changed profiles. The first run is the baseline and emits everything. Ideal for scheduled runs with a webhook.",
            "default": false
          },
          "maxSecondsPerQuery": {
            "title": "Max seconds per query",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Time budget for one query (all pages of one handle, search term or record; for Profiles mode one batch of up to 25 handles). A query that has produced nothing for 60 seconds, or uses up this budget, is cut off: records already collected are kept; with nothing collected it becomes one error item (TIME_BUDGET).",
            "default": 900
          },
          "stateStoreName": {
            "title": "State store name",
            "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-]{0,62}$",
            "type": "string",
            "description": "Named key-value store that keeps the per-query memory for `onlyNewSinceLastRun`. Use a different name per schedule to keep monitors independent; delete the store to reset the baseline.",
            "default": "bluesky-monitor-state"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "pattern": "^https?://.+",
            "type": "string",
            "description": "If set, the Actor POSTs a JSON summary of the run plus up to 100 of the records it produced to this URL when it finishes. Failures are logged, never fatal."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}