{
  "openapi": "3.0.1",
  "info": {
    "title": "VietnamWorks [💰$1.3] — Full Jobs, Salary & Bilingual Data",
    "description": "[Just 💰$1.3] Search job listings from vietnamworks.com — full descriptions, requirements, skills, benefits, structured salary, geo-located sites and applicant-demand counts, with bilingual English + Vietnamese fields. Keyword, location, category, level and type filters plus incremental monitoring.",
    "version": "0.1",
    "x-build-id": "AaaSE9hlevRmfin9B"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~vietnamworks-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-vietnamworks-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/corvuslab~vietnamworks-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-vietnamworks-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/corvuslab~vietnamworks-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-vietnamworks-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": {
          "query": {
            "title": "🔑 Search keywords",
            "type": "string",
            "description": "Keywords to search for (job title, skill, company). Separate multiple searches with commas — each runs on its own and the results are merged and de-duplicated."
          },
          "startUrls": {
            "title": "📋 Start URLs",
            "type": "array",
            "description": "Paste vietnamworks.com search or job URLs to scrape directly. A job URL (…-<id>-jv) is fetched as a single record.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResults": {
            "title": "🔢 Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of jobs to return. Set 0 for unlimited (bounded by how many the search has).",
            "default": 25
          },
          "location": {
            "title": "📍 Location",
            "type": "array",
            "description": "City / province to filter by.",
            "items": {
              "type": "string",
              "enum": [
                "Ho Chi Minh",
                "Hanoi",
                "Da Nang",
                "Binh Duong",
                "Dong Nai",
                "Hai Phong",
                "Bac Ninh",
                "Bac Giang",
                "Hai Duong",
                "Hung Yen",
                "Vinh Phuc",
                "Phu Tho",
                "Hoa Binh",
                "Thanh Hoa",
                "Nghe An",
                "Ha Tinh",
                "Quang Binh",
                "Khanh Hoa",
                "Lam Dong",
                "Tay Ninh",
                "Ben Tre"
              ],
              "enumTitles": [
                "Ho Chi Minh City",
                "Hanoi",
                "Da Nang",
                "Binh Duong",
                "Dong Nai",
                "Hai Phong",
                "Bac Ninh",
                "Bac Giang",
                "Hai Duong",
                "Hung Yen",
                "Vinh Phuc",
                "Phu Tho",
                "Hoa Binh",
                "Thanh Hoa",
                "Nghe An",
                "Ha Tinh",
                "Quang Binh",
                "Khanh Hoa",
                "Lam Dong",
                "Tay Ninh",
                "Ben Tre"
              ]
            }
          },
          "category": {
            "title": "🗂️ Job category",
            "type": "array",
            "description": "Top-level job function / industry category.",
            "items": {
              "type": "string",
              "enum": [
                "Information Technology/Telecommunications",
                "Sales",
                "Marketing, Advertising/Communications",
                "Accounting/Auditing",
                "Banking & Financial Services",
                "Human Resources/Recruitment",
                "Engineering & Sciences",
                "Manufacturing",
                "Architecture/Construction",
                "Logistics/Import Export/Warehouse",
                "Administration/Office Support",
                "Design",
                "Technician",
                "Real Estate",
                "Legal",
                "CEO & General Management",
                "Others"
              ],
              "enumTitles": [
                "IT / Telecommunications",
                "Sales",
                "Marketing / Advertising / Communications",
                "Accounting / Auditing",
                "Banking & Financial Services",
                "Human Resources / Recruitment",
                "Engineering & Sciences",
                "Manufacturing",
                "Architecture / Construction",
                "Logistics / Import Export / Warehouse",
                "Administration / Office Support",
                "Design",
                "Technician",
                "Real Estate",
                "Legal",
                "CEO & General Management",
                "Others"
              ]
            }
          },
          "jobLevel": {
            "title": "📈 Job level",
            "type": "array",
            "description": "Seniority level.",
            "items": {
              "type": "string",
              "enum": [
                "Intern/Student",
                "Fresher/Entry level",
                "Experienced (non-manager)",
                "Manager",
                "Director and above"
              ],
              "enumTitles": [
                "Intern / Student",
                "Fresher / Entry level",
                "Experienced (non-manager)",
                "Manager",
                "Director and above"
              ]
            }
          },
          "workType": {
            "title": "🧾 Employment type",
            "type": "array",
            "description": "Type of employment.",
            "items": {
              "type": "string",
              "enum": [
                "Permanent",
                "Contract",
                "Freelance",
                "Part-time"
              ],
              "enumTitles": [
                "Permanent",
                "Contract",
                "Freelance",
                "Part-time"
              ]
            }
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "How to order results within each search.",
            "default": "relevance"
          },
          "requireContact": {
            "title": "📇 Require contact details",
            "enum": [
              "off",
              "email",
              "phone",
              "either",
              "both"
            ],
            "type": "string",
            "description": "Keep only records that include a contact. off = keep everything; email / phone = require that channel; either = at least one; both = email and phone. Screened at emit time, so it also trims what you're billed for.",
            "default": "off"
          },
          "includeApplicantInsights": {
            "title": "📊 Include applicant-demand signals",
            "type": "boolean",
            "description": "Add how many people have applied (applicantCount) and a demand label — handy for spotting low-competition listings.",
            "default": true
          },
          "includeDetails": {
            "title": "🔬 Include full details",
            "type": "boolean",
            "description": "Include the full job description, requirements, skills and benefits. Turn off for the fastest, leanest listing-only output.",
            "default": true
          },
          "descriptionFormat": {
            "title": "📝 Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Which representation(s) of the description and requirements to include.",
            "default": "all"
          },
          "descriptionMaxLength": {
            "title": "✂️ Description max length",
            "minimum": 1,
            "type": "integer",
            "description": "Truncate each description / requirements field to this many characters. Leave empty for full length."
          },
          "compact": {
            "title": "📦 Compact records",
            "type": "boolean",
            "description": "Emit only the core fields. Ideal for AI agents and MCP clients.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Drop empty fields",
            "type": "boolean",
            "description": "Remove null, empty-string and empty-array fields from each record.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).",
            "default": false
          },
          "stateKey": {
            "title": "🗝️ State key",
            "type": "string",
            "description": "Stable name for the tracked search. Leave empty to derive one automatically from your search settings."
          },
          "emitUnchanged": {
            "title": "🔁 Include unchanged records",
            "type": "boolean",
            "description": "Also emit records that have not changed since the previous run.",
            "default": false
          },
          "emitExpired": {
            "title": "🗑️ Include expired records",
            "type": "boolean",
            "description": "Emit records for jobs present last run but gone now.",
            "default": false
          },
          "telegramToken": {
            "title": "💬 Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather."
          },
          "telegramChatId": {
            "title": "🆔 Telegram chat ID",
            "type": "string",
            "description": "Chat or channel ID, e.g. \"-100123456789\" or \"@yourchannel\"."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack webhook URL",
            "type": "string",
            "description": "Slack incoming-webhook URL."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord webhook URL",
            "type": "string",
            "description": "Discord incoming-webhook URL."
          },
          "webhookUrl": {
            "title": "🪝 Webhook URL",
            "type": "string",
            "description": "Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier."
          },
          "webhookHeaders": {
            "title": "🧾 Webhook headers",
            "type": "object",
            "description": "Extra headers for the webhook request, e.g. {\"Authorization\": \"Bearer xyz\"}."
          },
          "notificationLimit": {
            "title": "🔢 Records per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many records to include in each notification message.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Optional. This scraper runs fine with no proxy (the default). Enable Apify Proxy only if you run at high volume and start seeing failures.",
            "default": {
              "useApifyProxy": false
            }
          },
          "maxRequestRetries": {
            "title": "🔄 Max request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request before giving up on it.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}