{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook 公开小组帖子与完整照片集抓取",
    "description": "抓取 Facebook 公开小组的最新与历史帖子，输出机器可读的 JSON 数据：正文、发布时间、作者、互动数据、稳定帖子链接，以及全部可获取的照片链接（含隐藏的 +N 照片集）。支持 Apify API、MCP、日常监控与历史回填。",
    "version": "0.1",
    "x-build-id": "fKKImxyq2MlW90aoN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/spbotdel~facebook-group-posts-cn/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-spbotdel-facebook-group-posts-cn",
        "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/spbotdel~facebook-group-posts-cn/runs": {
      "post": {
        "operationId": "runs-sync-spbotdel-facebook-group-posts-cn",
        "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/spbotdel~facebook-group-posts-cn/run-sync": {
      "post": {
        "operationId": "run-sync-spbotdel-facebook-group-posts-cn",
        "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": [
          "groupUrls"
        ],
        "properties": {
          "groupUrls": {
            "title": "小组链接",
            "type": "array",
            "description": "必填。Facebook 公开小组的链接、自定义链接或数字 ID。请只填写小组链接，不要填写帖子链接、Marketplace 链接或私密/需登录的小组。一次运行最多处理 maxGroupsPerRun 个小组。",
            "items": {
              "type": "string"
            }
          },
          "maxGroupsPerRun": {
            "title": "每次运行的小组数量",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "一次运行中最多处理的小组数量。结果和计费按小组倍增。多余的小组链接将被跳过，并列在 SUMMARY.skippedGroupUrls 中。",
            "default": 10
          },
          "maxPostsPerGroup": {
            "title": "每个小组的最大帖子数",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "每个小组返回的最大帖子结果数。每个帖子为一个计费结果：10 个小组 x 1,000 个帖子约为 10,000 个计费结果。深度历史回填一次最多取 1,000 条，保存 SUMMARY.pointer.nextCursor，再用 startCursor 继续。",
            "default": 30
          },
          "sortMode": {
            "title": "排序方式",
            "enum": [
              "CHRONOLOGICAL",
              "RECENT_ACTIVITY",
              "TOP_POSTS"
            ],
            "type": "string",
            "description": "小组动态的排序方式。「最新优先」最适合采集最新帖子与日常监控。",
            "default": "CHRONOLOGICAL"
          },
          "expandAllPhotos": {
            "title": "展开全部照片",
            "type": "boolean",
            "description": "尽力还原藏在 Facebook +N 缩略图后面的照片链接。建议保持开启以获得完整数据；仅在快速预览时关闭。",
            "default": true
          },
          "includeRawPayload": {
            "title": "包含原始数据",
            "type": "boolean",
            "description": "在每条结果中附带解析后的 Facebook 原始数据。便于调试，但会让输出大很多。",
            "default": false
          },
          "onlyPostsNewerThan": {
            "title": "仅采集此日期之后的帖子",
            "type": "string",
            "description": "规范日期下边界（含）的 [onlyPostsNewerThan, onlyPostsOlderThan) 窗口。返回在此 Facebook 时间戳或之后发布的帖子。使用“最新优先”排序时，Actor 在遇到更旧帖子后停止。最适合增量监控；与 onlyPostsOlderThan 配合可精确收集时间段。"
          },
          "onlyPostsOlderThan": {
            "title": "仅采集此日期之前的帖子",
            "type": "string",
            "description": "规范日期上边界（不含）的 [onlyPostsNewerThan, onlyPostsOlderThan) 窗口。跳过在此 Facebook 时间戳或之后发布的帖子，并继续向更早历史推进。与 onlyPostsNewerThan 结合可收集特定时间段。"
          },
          "knownPostIds": {
            "title": "已知帖子 ID",
            "type": "array",
            "description": "你的系统里已存的帖子 ID。配合「最新优先」排序，遇到其中之一即停止，最适合每日监控。 状态路由：每日最新监控 -> knownPostIds；较旧帖子回填 -> 从 SUMMARY.pointer.nextCursor 获取 startCursor；多组回填 -> startCursorsByGroup；已存储的流水线状态 -> checkpoint。切勿将回填游标传入最新运行。",
            "items": {
              "type": "string"
            }
          },
          "checkpoint": {
            "title": "检查点",
            "type": "object",
            "description": "上一次 SUMMARY 中的 checkpoint 对象。在你的系统保存运行状态时，用于增量监控或按小组续采。 状态路由：每日最新监控 -> knownPostIds；较旧帖子回填 -> 从 SUMMARY.pointer.nextCursor 获取 startCursor；多组回填 -> startCursorsByGroup；已存储的流水线状态 -> checkpoint。切勿将回填游标传入最新运行。"
          },
          "startCursor": {
            "title": "起始游标",
            "type": "string",
            "description": "SUMMARY.pointer.nextCursor 中的游标。仅用于回填更早的历史帖子，不要拿昨天的游标来采新帖子。 状态路由：每日最新监控 -> knownPostIds；较旧帖子回填 -> 从 SUMMARY.pointer.nextCursor 获取 startCursor；多组回填 -> startCursorsByGroup；已存储的流水线状态 -> checkpoint。切勿将回填游标传入最新运行。"
          },
          "startCursorsByGroup": {
            "title": "按小组指定游标",
            "type": "object",
            "description": "可选：小组链接到 GraphQL 游标的映射，用于多小组运行中回填更早页面。优先直接传上一次的 SUMMARY/checkpoint。 状态路由：每日最新监控 -> knownPostIds；较旧帖子回填 -> 从 SUMMARY.pointer.nextCursor 获取 startCursor；多组回填 -> startCursorsByGroup；已存储的流水线状态 -> checkpoint。切勿将回填游标传入最新运行。"
          },
          "paginationMode": {
            "title": "翻页模式",
            "enum": [
              "ranked_snapshot",
              "cursor_page"
            ],
            "type": "string",
            "description": "Ranked 快照先收集候选帖子再按发布时间本地排序；游标翻页保持动态顺序并给出 next 指针，更适合监控与回填。",
            "default": "ranked_snapshot"
          },
          "maxCandidates": {
            "title": "候选帖子上限",
            "minimum": 0,
            "maximum": 3000,
            "type": "integer",
            "description": "本地排序前收集的候选帖子。保留 0 以使用自动预算（约为 maxPostsPerGroup 的 3 倍，最低 +20）。仅在 SUMMARY 报告 candidate_limit_reached 且帖子缺失时提高。",
            "default": 0
          },
          "maxPages": {
            "title": "GraphQL 最大页数",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "公共小组初始化之后的最大 GraphQL 翻页请求数。保留 0 以使用自动预算（约为 maxPostsPerGroup 的 0.85 倍，最低 20）。仅在 SUMMARY 报告页面上限且帖子缺失时提高。",
            "default": 0
          },
          "bootstrapRetries": {
            "title": "初始化重试",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 若 Facebook 返回异常页面或登录墙，用全新代理/会话重新初始化小组主页的尝试次数。",
            "default": 4
          },
          "graphqlPageRetries": {
            "title": "翻页重试",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 遇到临时性空白或过小的 GraphQL 分页响应时的重试次数。",
            "default": 2
          },
          "proxyCountry": {
            "title": "代理国家",
            "type": "string",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 Apify 代理的国家代码。",
            "default": "US"
          },
          "mediaSetRetries": {
            "title": "照片集重试",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 每个 Facebook media/set 请求的重试次数。",
            "default": 1
          },
          "mediaSetRetryDelayMs": {
            "title": "照片集重试间隔",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 media/set 重试的基础等待时间。",
            "default": 800
          },
          "mediaExpansionConcurrency": {
            "title": "照片展开并发",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 同时展开 Facebook media/set 页面的帖子数。数值越大完整照片采集越快，但临时性失败也可能增多。",
            "default": 3
          },
          "mediaExpansionAdaptive": {
            "title": "自适应照片展开",
            "type": "boolean",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 开启后，若近期 media/set 展开质量下降，Actor 会自动把过高的展开并发降回稳定水平。",
            "default": true
          },
          "mediaDeferredRetry": {
            "title": "延迟照片补采",
            "type": "boolean",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 主流程结束后、输出前，仅对可疑的照片集行再补采一次。小幅增加运行时间，换来更高的 +N 覆盖率。",
            "default": true
          },
          "mediaDeferredRetryConcurrency": {
            "title": "补采并发",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 延迟补采阶段同时重试的可疑帖子数。",
            "default": 2
          },
          "mediaDeferredRetryExtraRetries": {
            "title": "补采追加次数",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 延迟补采阶段对可疑 media/set 行的追加重试次数。",
            "default": 2
          },
          "mediaDeferredRetryDelayMs": {
            "title": "补采等待时间",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 延迟补采的基础等待时间。",
            "default": 1500
          },
          "debug": {
            "title": "调试输出",
            "type": "boolean",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 在 SUMMARY 中附带响应样本与发现过程细节。日常生产运行请保持关闭。",
            "default": false
          },
          "discoverBundles": {
            "title": "从 JS 包中发现 doc_id",
            "type": "boolean",
            "description": "高级。保持默认值，除非 SUMMARY 诊断明确指出此开关。 下载 Facebook JS 包以发现最新的 GraphQL doc_id，会多耗流量；备用 doc_id 反正都会试一遍。",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}