{
  "openapi": "3.0.1",
  "info": {
    "title": "VOZ Scraper – Vietnam's Biggest Forum Threads & Replies",
    "description": "Scrape VOZ (voz.vn), Vietnam's biggest tech and lifestyle forum, with no API or login: board thread listings (title keyword filter), main posts and all replies with quotes removed, plus author, views and ISO timestamps. Export JSON/CSV/Excel for social listening and brand monitoring.",
    "version": "1.0",
    "x-build-id": "OaxChpLbcPvtFXWxK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/claude_code_reviewer~voz-scraper-en/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-claude_code_reviewer-voz-scraper-en",
        "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-en/runs": {
      "post": {
        "operationId": "runs-sync-claude_code_reviewer-voz-scraper-en",
        "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-en/run-sync": {
      "post": {
        "operationId": "run-sync-claude_code_reviewer-voz-scraper-en",
        "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": "🎯 Mode",
            "enum": [
              "forum",
              "thread"
            ],
            "type": "string",
            "description": "What do you want to scrape? Pick a mode, then fill in the matching fields below.",
            "default": "forum"
          },
          "forumIds": {
            "title": "📋 Board IDs",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "VOZ board (forum) IDs - the number in URLs like voz.vn/f/{slug}.{id}/, e.g. 17 (Chuyện trò linh tinh / off-topic chat), 70 (PC build advice), 36 (Apple), 42 (AI). Browse voz.vn for more boards. Used by Board mode.",
            "items": {
              "type": "string"
            }
          },
          "threadIds": {
            "title": "💬 Thread IDs",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "VOZ thread IDs - the number in URLs like voz.vn/t/{slug}.{id}/, e.g. 1089186. Used by Full thread mode.",
            "items": {
              "type": "string"
            }
          },
          "threadUrls": {
            "title": "💬 Thread URLs",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Full thread URLs, e.g. https://voz.vn/t/vozer-father-ver-2026-hoi-nhung-ong-bo-bim-sua.1089186/. The thread ID is extracted automatically.",
            "items": {
              "type": "string"
            }
          },
          "bulkInput": {
            "title": "📋 Bulk paste",
            "type": "string",
            "description": "**One item per line** - press Enter, no quotes or commas. Lines are treated as board IDs / thread IDs / URLs depending on the mode and merged into the fields above. Copying a column from Google Sheets or Excel is the fastest way."
          },
          "keywords": {
            "title": "🔍 Title keyword filter",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "(Optional) Board mode: keep only threads whose title contains any keyword. Leave empty for no filter. This filters titles inside the board - it is not a site-wide search.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "📊 Max items",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Board mode: max threads per board. Full thread mode: max number of threads (all replies of each thread are fetched by default; set maxReplies to cap them by floor). Up to 2000.",
            "default": 50
          },
          "maxReplies": {
            "title": "🧵 Max replies per thread (optional)",
            "minimum": 1,
            "type": "integer",
            "description": "Full thread mode only. Maximum replies to fetch per thread. Every reply is billed (review-item), and popular threads can have thousands, so this caps the cost per thread. Takes the first N reply floors (by floor number; deleted floors may make the actual count slightly lower than N). Leave empty = unlimited (default). Unrelated to \"Max items\", which limits the number of threads."
          },
          "keepQuotes": {
            "title": "💬 Keep quoted text (optional)",
            "type": "boolean",
            "description": "Full thread mode only. By default quoted blocks (\"X đã nói: ... Nhấp để mở rộng...\") are removed from post content so replies are not duplicated. Turn on to keep them.",
            "default": false
          },
          "dateFrom": {
            "title": "📅 Only items after this time (optional)",
            "type": "string",
            "description": "Board mode only; judged by thread start time or last-reply time (whichever is newer). Format: relative 3d (3 days), 12h (12 hours), 2w (2 weeks), or absolute MM/DD/YY. Leave empty = no filter. When set, paging stops early (sticky threads are unaffected), which saves cost on scheduled monitoring runs."
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy (Apify datacenter proxy on by default)",
            "type": "object",
            "description": "Uses Apify datacenter proxy by default: without a proxy the run shares egress IPs with other runs on the platform and the forum may rate-limit it (429). HTML responses are small, so proxy traffic cost is negligible. If Cloudflare ever challenges the datacenter IPs, switch to RESIDENTIAL with country VN. Turn off only with your own proxy or for local testing.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}