{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Scraper & API: Export Posts, Profiles & Search",
    "description": "Scrape Bluesky posts without login: search by keyword, hashtag, date, language, author, mention or domain, every post of any profile, custom feeds and lists. Likes, reposts, replies, quotes, author followers, media and links, only new posts since the last run, and a profiles table with contacts.",
    "version": "0.1",
    "x-build-id": "XZF3tfph73dxUGEg2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/s_actors~bluesky-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-s_actors-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/s_actors~bluesky-scraper/runs": {
      "post": {
        "operationId": "runs-sync-s_actors-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/s_actors~bluesky-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-s_actors-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": {
          "searchQueries": {
            "title": "🔍 Search posts",
            "type": "array",
            "description": "One query per line: words, a #hashtag or a \"quoted phrase\", as in the Bluesky search box. Bluesky operators work too (from:handle, mentions:handle, domain:example.com, lang:en). Every matching post, newest first, as far back as you need.",
            "items": {
              "type": "string"
            }
          },
          "usernames": {
            "title": "👤 Profiles",
            "type": "array",
            "description": "One per line: a handle (name.bsky.social or a custom domain like nytimes.com), @handle, a profile link (bsky.app/profile/...) or a DID. Every post of the profile down to the first one. Followers, bio and contacts of each account go to the profiles table once, free.",
            "items": {
              "type": "string"
            }
          },
          "feedUrls": {
            "title": "📰 Custom feeds and lists",
            "type": "array",
            "description": "Optional: links to custom feeds (bsky.app/profile/<handle>/feed/<name>, e.g. Discover) or user lists (bsky.app/profile/<handle>/lists/<id>). The posts in the feed's order.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "🔗 Post links",
            "type": "array",
            "description": "Optional: single posts by link (bsky.app/profile/<handle>/post/<id>), with all stats.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerInput": {
            "title": "📝 Max posts per query, profile or feed",
            "minimum": 0,
            "type": "integer",
            "description": "How many posts to take from each search query, profile and feed. 0 = all: every post of a profile, every search result within the dates (up to 100 000 per query), a whole feed.",
            "default": 100
          },
          "sort": {
            "title": "↕️ Search order",
            "enum": [
              "latest",
              "top"
            ],
            "type": "string",
            "description": "Latest = every matching post, newest first. Top = Bluesky's most popular posts: up to 100 per query, or up to 100 for each day when Posted after is set.",
            "default": "latest"
          },
          "language": {
            "title": "🌐 Language",
            "type": "string",
            "description": "Only posts in this language: a two-letter code such as en, de, fr, es, ja, pt."
          },
          "fromAuthor": {
            "title": "✍️ From this account",
            "type": "string",
            "description": "Only posts written by this account (handle). Leave the query as a word, or use a profile in Profiles to get all its posts."
          },
          "mentions": {
            "title": "📣 Mentioning this account",
            "type": "string",
            "description": "Only posts that mention this account (handle), e.g. your brand."
          },
          "domain": {
            "title": "🔗 Linking to this website",
            "type": "string",
            "description": "Only posts with a link to this domain, e.g. nytimes.com."
          },
          "hashtags": {
            "title": "#️⃣ With these hashtags",
            "type": "array",
            "description": "Only posts with all of these hashtags (without #).",
            "items": {
              "type": "string"
            }
          },
          "includeReplies": {
            "title": "💬 Replies of the profiles",
            "type": "boolean",
            "description": "Also output the replies the profile wrote under other people's posts (replyToPostUrl shows which post). Off = the profile's own posts and its own threads.",
            "default": false
          },
          "includeReposts": {
            "title": "🔁 Reposts of the profiles",
            "type": "boolean",
            "description": "Also output the posts the profile reposted: the original post with its author and stats, plus repostedBy and repostedAt.",
            "default": false
          },
          "postedAfter": {
            "title": "📅 Posted after",
            "type": "string",
            "description": "Only posts published after this: a date like 2026-01-01 or a period like 24 hours, 7 days, 2 weeks, 6 months (ago). Profiles stop reading at the first older post."
          },
          "postedBefore": {
            "title": "📅 Posted before",
            "type": "string",
            "description": "Only posts published before this: a date like 2026-03-01 or a period like 30 days (ago)."
          },
          "minLikes": {
            "title": "❤️ Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Only posts with at least this many likes. Leave empty for all."
          },
          "includeAuthorFollowers": {
            "title": "👥 Author follower counts",
            "type": "boolean",
            "description": "Add each author's follower count (authorFollowerCount) and the engagement rate to search and feed results. One extra light request per 25 new authors.",
            "default": true
          },
          "onlyNewPosts": {
            "title": "🔔 Only new posts since the previous run",
            "type": "boolean",
            "description": "Output only posts newer than the newest one an earlier run in your account saw for the same query, profile or feed (key-value store bluesky-scraper-state). The first run outputs posts as usual and remembers the newest. A run with no new posts costs only the start.",
            "default": false
          },
          "maxConcurrency": {
            "title": "⚡ Inputs at the same time",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many queries, profiles and feeds are scraped in parallel (100 posts a request).",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "Requests go direct to the Bluesky API and switch to Apify datacenter proxies only if it refuses them. The default works for most runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "debugLog": {
            "title": "🐞 Debug log",
            "type": "boolean",
            "description": "Log every retried request (for troubleshooting).",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}