{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Historical Archive Scraper - Old Posts by Date & Author",
    "description": "Scrape the full public post history of any Bluesky account by date, author, and thread via the keyless AT-Protocol API. Posts, replies, reposts, profiles, thread trees, and list feeds. No API key, no login, no cookies.",
    "version": "1.0",
    "x-build-id": "7QkcKBIekesbQrKlk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/logiover~bluesky-historical-archive-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-logiover-bluesky-historical-archive-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/logiover~bluesky-historical-archive-scraper/runs": {
      "post": {
        "operationId": "runs-sync-logiover-bluesky-historical-archive-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/logiover~bluesky-historical-archive-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-logiover-bluesky-historical-archive-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": {
          "actors": {
            "title": "Accounts (handles / DIDs / profile URLs)",
            "type": "array",
            "description": "Bluesky accounts to pull the full public post history for. Accepts handles (e.g. `nytimes.com`, `bsky.app`), DIDs (e.g. `did:plc:...`), or full profile URLs (e.g. `https://bsky.app/profile/nytimes.com`). A leading `@` and any URL prefix are stripped automatically. Each account is paginated all the way back to reach its entire archive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "lists": {
            "title": "Bluesky Lists (AT-URIs)",
            "type": "array",
            "description": "Curated Bluesky list AT-URIs to pull posts from (list-feed mode). Format: `at://did:plc:.../app.bsky.graph.list/...`. Every post surfaced by the list is returned as a flat row, just like an author feed. Great for scraping a whole community or topic list at once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Individual Post URLs / AT-URIs",
            "type": "array",
            "description": "Individual Bluesky posts to fetch together with their thread (reply tree). Accepts post URLs (e.g. `https://bsky.app/profile/<handle>/post/<rkey>`) or raw AT-URIs (`at://did:plc:.../app.bsky.feed.post/<rkey>`). Each post and, when `Expand threads` is on, its replies are returned as flat rows.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "feedFilter": {
            "title": "Feed Filter",
            "enum": [
              "posts_with_replies",
              "posts_no_replies",
              "posts_with_media",
              "posts_and_author_threads"
            ],
            "type": "string",
            "description": "Which slice of each account's history to pull. `Posts with replies` (default) returns everything: original posts, the account's replies, and reposts. `Posts, no replies` drops the account's replies. `Posts with media` returns only posts that contain images or video. `Posts and author threads` returns posts plus the account's own self-reply threads.",
            "default": "posts_with_replies"
          },
          "afterDate": {
            "title": "After Date (ISO)",
            "type": "string",
            "description": "Only return posts created AFTER this date. Format: `YYYY-MM-DD` or a full ISO timestamp. Because feeds are newest-first, pagination stops early once posts are older than this date, so time-bounded windows are fast and cheap. Example: `2024-01-01`.",
            "default": null
          },
          "beforeDate": {
            "title": "Before Date (ISO)",
            "type": "string",
            "description": "Only return posts created BEFORE this date. Combine with `After Date` for a precise historical window. Format: `YYYY-MM-DD` or a full ISO timestamp. Example: `2024-12-31`.",
            "default": null
          },
          "maxPostsPerActor": {
            "title": "Max Posts Per Account",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the number of posts pulled per account / list. Prevents one huge account (a news outlet can have tens of thousands of posts) from eating the whole budget. Set high to reach the full archive.",
            "default": 1000
          },
          "expandThreads": {
            "title": "Expand Threads (fetch reply trees)",
            "type": "boolean",
            "description": "For each scraped post, also fetch its full reply tree (comments) via getPostThread and emit every reply as its own flat row. Multiplies result volume and lets you reconstruct entire conversations. Off by default to keep runs lean.",
            "default": false
          },
          "threadDepth": {
            "title": "Thread Depth",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many reply levels deep to walk when `Expand threads` is on (0-1000). Higher values capture nested sub-replies but cost more. 6 is a sensible default for most conversations.",
            "default": 6
          },
          "includeProfiles": {
            "title": "Enrich With Author Profiles",
            "type": "boolean",
            "description": "Enrich every row with the author's follower count, following count, and total post count (getProfile is fetched once per author and cached). Adds valuable audience-size context for lead-gen and influence analysis. On by default.",
            "default": true
          },
          "maxItems": {
            "title": "Max Items (Global)",
            "minimum": 0,
            "type": "integer",
            "description": "Total hard cap across ALL accounts, lists, posts, and expanded threads combined. `0` = unlimited (fetch everything within the per-account caps).",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy (ON by default). The public Bluesky AT-Protocol API responds cleanly to Apify's datacenter IPs, so datacenter proxy is the reliable default. Each retry rotates to a fresh proxy session (new IP) to sail past transient rate limits. If you ever see persistent throttling on a very large run, switch the group to RESIDENTIAL here.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}