{
  "openapi": "3.0.1",
  "info": {
    "title": "Cào dữ liệu VOZ｜Xuất bài viết, bình luận VOZ.vn ra JSON",
    "description": "Cào VOZ (voz.vn), diễn đàn lớn nhất Việt Nam, không cần đăng nhập hay API: danh sách chủ đề của box (lọc từ khóa tiêu đề), bài đầu và toàn bộ bình luận đã bỏ trích dẫn, kèm tác giả, lượt xem, thời gian ISO. Xuất JSON/CSV/Excel. Dùng cho social listening, giám sát thương hiệu, nghiên cứu thị trường.",
    "version": "1.0",
    "x-build-id": "0bAuvBPAYtVPFmKYy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/claude_code_reviewer~voz-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-claude_code_reviewer-voz-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/claude_code_reviewer~voz-scraper/runs": {
      "post": {
        "operationId": "runs-sync-claude_code_reviewer-voz-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/claude_code_reviewer~voz-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-claude_code_reviewer-voz-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "🎯 Chế độ",
            "enum": [
              "forum",
              "thread"
            ],
            "type": "string",
            "description": "Bạn muốn lấy gì? Chọn một chế độ rồi điền các ô tương ứng bên dưới.",
            "default": "forum"
          },
          "forumIds": {
            "title": "📋 ID box",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "ID box của VOZ (số, nằm trong URL dạng voz.vn/f/{slug}.{id}/), ví dụ 17 (Chuyện trò linh tinh), 70 (Tư vấn cấu hình), 36 (Apple), 42 (AI). Xem danh sách box tại voz.vn. Dùng cho chế độ Box.",
            "items": {
              "type": "string"
            }
          },
          "threadIds": {
            "title": "💬 ID chủ đề",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "ID chủ đề của VOZ (số, nằm trong URL dạng voz.vn/t/{slug}.{id}/), ví dụ 1089186. Dùng cho chế độ Chủ đề đầy đủ.",
            "items": {
              "type": "string"
            }
          },
          "threadUrls": {
            "title": "💬 URL chủ đề",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "URL đầy đủ của chủ đề, ví dụ https://voz.vn/t/vozer-father-ver-2026-hoi-nhung-ong-bo-bim-sua.1089186/. Actor tự động lấy ID chủ đề.",
            "items": {
              "type": "string"
            }
          },
          "bulkInput": {
            "title": "📋 Dán hàng loạt",
            "type": "string",
            "description": "**Mỗi dòng một mục**, nhấn Enter để xuống dòng, không cần dấu ngoặc kép hay dấu phẩy. Tự động được hiểu là ID box / ID chủ đề / URL tùy theo chế độ và gộp vào các ô bên trên. Copy cả một cột từ Google Sheet hoặc Excel rồi dán vào là nhanh nhất."
          },
          "keywords": {
            "title": "🔍 Lọc theo từ khóa trong tiêu đề",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "(Tùy chọn) Chế độ Box: chỉ giữ các chủ đề có tiêu đề chứa ít nhất một từ khóa. Để trống nếu không lọc. Đây là bộ lọc tiêu đề trong box, không phải tìm kiếm toàn diễn đàn.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "📊 Số lượng tối đa",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Chế độ Box: số chủ đề tối đa cho mỗi box. Chế độ Chủ đề đầy đủ: số chủ đề tối đa (mặc định lấy toàn bộ bình luận của mỗi chủ đề, đặt maxReplies để giới hạn theo tầng). Tối đa 2000.",
            "default": 50
          },
          "maxReplies": {
            "title": "🧵 Số bình luận tối đa mỗi chủ đề (tùy chọn)",
            "minimum": 1,
            "type": "integer",
            "description": "Áp dụng cho chế độ Chủ đề đầy đủ. Số bình luận tối đa lấy cho mỗi chủ đề. Mỗi bình luận được tính phí theo sự kiện review-item; chủ đề dài có thể có hàng nghìn bình luận, đặt giá trị này để giới hạn chi phí mỗi chủ đề. Lấy N tầng bình luận đầu tiên (tính theo số tầng #, tầng đã bị xóa có thể làm số dòng thực tế ít hơn N). Để trống = không giới hạn (mặc định). Không liên quan đến \"Số lượng tối đa\" (giới hạn số chủ đề)."
          },
          "keepQuotes": {
            "title": "💬 Giữ nguyên phần trích dẫn (tùy chọn)",
            "type": "boolean",
            "description": "Áp dụng cho chế độ Chủ đề đầy đủ. Mặc định phần trích dẫn (\"X đã nói: ... Nhấp để mở rộng...\") bị loại khỏi nội dung để tránh lặp lại bài viết khác. Bật để giữ nguyên.",
            "default": false
          },
          "dateFrom": {
            "title": "📅 Chỉ lấy mục sau thời điểm này (tùy chọn)",
            "type": "string",
            "description": "Áp dụng cho chế độ Box, dựa trên thời điểm đăng hoặc trả lời gần nhất (lấy mốc mới hơn). Định dạng: thời gian tương đối 3d (3 ngày), 12h (12 giờ), 2w (2 tuần), hoặc ngày tuyệt đối MM/DD/YY. Để trống = không lọc. Khi đặt, actor dừng lật trang sớm (chủ đề ghim không bị ảnh hưởng), tiết kiệm chi phí khi chạy theo lịch."
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy (mặc định bật Apify datacenter proxy)",
            "type": "object",
            "description": "Mặc định dùng Apify datacenter proxy: không dùng proxy thì chia sẻ IP thoát với các run khác trên nền tảng nên dễ bị diễn đàn giới hạn tốc độ (429). Phản hồi HTML nhỏ, chi phí proxy gần như bằng không. Nếu gặp thử thách Cloudflare, chuyển sang RESIDENTIAL và chọn quốc gia VN. Chỉ tắt khi dùng proxy riêng hoặc chạy thử trên máy.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}