{
  "openapi": "3.0.1",
  "info": {
    "title": "Bluesky Posts Scraper: Accounts, Threads, Feeds & Alerts",
    "description": "Public Bluesky posts without a login: the latest posts of any accounts, whole reply threads, and third-party custom feeds. Text, likes, reposts, replies, quotes, links, images, hashtags and mentions. Schedule it with \"Only new posts\" for alerts. USD 0.50 per 1,000 posts.",
    "version": "1.0",
    "x-build-id": "bBUIoZHqZ7MourOv4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/jtpalms~bluesky-posts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-jtpalms-bluesky-posts",
        "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/jtpalms~bluesky-posts/runs": {
      "post": {
        "operationId": "runs-sync-jtpalms-bluesky-posts",
        "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/jtpalms~bluesky-posts/run-sync": {
      "post": {
        "operationId": "run-sync-jtpalms-bluesky-posts",
        "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": {
          "accounts": {
            "title": "Accounts",
            "type": "array",
            "description": "Public Bluesky accounts to read the latest posts from, one per line: a handle (nytimes.com, @jay.bsky.social, or just jay for jay.bsky.social), a DID, or a profile link like https://bsky.app/profile/bsky.app.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Posts (whole threads)",
            "type": "array",
            "description": "Post links, one per line, like https://bsky.app/profile/bsky.app/post/3mv3zcjaijk22. You get the post and the replies under it, each with its depth in the thread.",
            "items": {
              "type": "string"
            }
          },
          "feedUrls": {
            "title": "Custom feeds",
            "type": "array",
            "description": "Custom feed links, one per line, like https://bsky.app/profile/did:plc:jfhpnnst6flqway4eaeqzj2a/feed/for-science. You get the feed's top posts in the feed's own order. Topic and keyword feeds made with tools like SkyFeed work well for monitoring. Bluesky's own feeds (Discover and others) need a login and are not supported.",
            "items": {
              "type": "string"
            }
          },
          "authorFeedFilter": {
            "title": "Which account posts",
            "enum": [
              "posts_no_replies",
              "posts_with_replies",
              "posts_and_author_threads",
              "posts_with_media",
              "posts_with_video"
            ],
            "type": "string",
            "description": "For accounts: which of their posts to include.",
            "default": "posts_no_replies"
          },
          "includeReposts": {
            "title": "Include reposts",
            "type": "boolean",
            "description": "For accounts: also include posts by others that the account reposted. Each such row has isRepost, repostedBy and repostedAt.",
            "default": false
          },
          "maxPostsPerSource": {
            "title": "Max posts per account, thread or feed",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "At most this many posts per source in each run. For accounts, the newest first. For threads, the post and top-level replies come first. For custom feeds, this is how many of the feed's top posts are read. With \"Only new posts\", new posts beyond this number are kept for the next run (accounts and threads).",
            "default": 100
          },
          "threadDepth": {
            "title": "Thread depth",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "For post links: how deep into the replies to go. 1 is only direct replies to the post.",
            "default": 6
          },
          "since": {
            "title": "Posted after",
            "type": "string",
            "description": "Optional. Only posts created on or after this date. A date like 2026-09-01, or a relative value like \"7 days\" or \"24 hours\" (counted back from the start of each run). For accounts, reading stops once posts are older than this."
          },
          "until": {
            "title": "Posted before",
            "type": "string",
            "description": "Optional. Only posts created on or before this date (the whole day is included), or a relative value like \"1 day\"."
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Optional. Only posts tagged with one of these language codes, like en, de or pt (pt also matches pt-BR). Posts without a language tag are left out when this is set.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Must contain (any of)",
            "type": "array",
            "description": "Optional. Keep only posts whose text, link card, links, hashtags or image descriptions contain at least one of these. Whole words, not case-sensitive: \"AI\" does not match \"said\". End a word with * for any ending (\"startup*\"), or write /pattern/ for a regular expression. This filters the posts of your sources; it is not a search of all of Bluesky.",
            "items": {
              "type": "string"
            }
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only posts with at least this many likes."
          },
          "onlyNew": {
            "title": "Only new posts",
            "type": "boolean",
            "description": "Remember what earlier runs returned and output only posts not seen before: new posts from accounts, new replies in threads, new posts in custom feeds. Schedule the actor (every hour, every morning) to use it as an alert: runs with nothing new output nothing and cost nothing. The memory is kept in your \"bluesky-posts-monitor\" key-value store.",
            "default": false
          },
          "firstRunOutput": {
            "title": "First run with \"Only new posts\"",
            "enum": [
              "all",
              "none"
            ],
            "type": "string",
            "description": "What the first monitor run outputs. All: the current posts (up to the maximum). None: nothing; it only records what is there now, so you get only posts that appear after today.",
            "default": "all"
          },
          "monitorId": {
            "title": "Monitor name",
            "type": "string",
            "description": "Optional. Keeps a separate memory of seen posts. Use a different name for each schedule that watches the same accounts or feeds with different filters, so they do not share what counts as new."
          },
          "maxConcurrency": {
            "title": "Sources in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many accounts, threads or feeds to read at the same time. The default is fast and polite.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Only needed if Bluesky answers HTTP 429 (too many requests from a shared IP address)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}