{
  "openapi": "3.0.1",
  "info": {
    "title": "CareerLink.vn Jobs Scraper",
    "description": "Scrapes job postings from CareerLink.vn by keyword, province and posting age, with company, salary, experience, contact and expiry fields, one row per posting.",
    "version": "0.1",
    "x-build-id": "uuGWk3BtJSYjCP8WK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/premium_stapler~careerlink-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-premium_stapler-careerlink-jobs-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/premium_stapler~careerlink-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-premium_stapler-careerlink-jobs-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/premium_stapler~careerlink-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-premium_stapler-careerlink-jobs-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": [
          "keywords"
        ],
        "properties": {
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "One search per keyword. Vietnamese keywords with diacritics work, for example \"xuất nhập khẩu\". Each keyword is searched separately and the results are merged and deduplicated. When you set a maximum, each keyword gets its own share of it, and a keyword that runs out of results lends its unused share to the others.",
            "default": [
              "logistics"
            ],
            "items": {
              "type": "string"
            }
          },
          "city": {
            "title": "Province or city",
            "enum": [
              "",
              "AG",
              "BRVT",
              "BG",
              "BK",
              "BL",
              "BN",
              "BTE",
              "BDH",
              "BD",
              "BP",
              "CM",
              "CT",
              "CB",
              "DN",
              "DL",
              "DNI",
              "DT",
              "GL",
              "HG",
              "HN",
              "HT",
              "HD",
              "HP",
              "HCM",
              "HY",
              "KH",
              "KT",
              "LC",
              "LD",
              "LS",
              "LA",
              "NB",
              "PT",
              "QB",
              "QN",
              "QNI",
              "QNH",
              "ST",
              "SL",
              "TN",
              "TB",
              "TNN",
              "THH",
              "VP"
            ],
            "type": "string",
            "description": "Limit the search to one province. Leave it on \"All of Vietnam\" to search the whole country. A posting that lists several provinces is kept when one of them is the province you picked.",
            "default": ""
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Only keep postings published in the last N days. The board filters by 1, 3, 7, 14 or 30 days, so any value in between is fetched with the next larger filter and trimmed exactly in code. Above 30 days the board has no filter at all: results are read unfiltered and trimmed in code, which costs more requests.",
            "default": 30
          },
          "maxItems": {
            "title": "Maximum postings",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many rows across all keywords, split evenly between them. This is the main cost control: you pay per posting. Set 0 for no row cap, in which case \"Maximum search pages per keyword\" is what bounds the run, at 50 postings a page.",
            "default": 100
          },
          "maxPages": {
            "title": "Maximum search pages per keyword",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many search result pages to walk per keyword, 50 postings a page. This is what bounds a run with no row cap: 20 pages is up to about 1,000 postings per keyword, which at USD 0.003 a posting is about USD 3.00 per keyword. Leave the row cap set if you want an exact bill.",
            "default": 20
          },
          "fetchDetails": {
            "title": "Open each posting for full details",
            "type": "boolean",
            "description": "On: open every job page for experience, expiry date, contact name, company website, company size, description and requirements. Off: use the result cards only (title, company, province, salary, posted date, link), which is faster and cheaper.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many pages to fetch at once. CareerLink is a small server and stops answering an IP that hits it in wide parallel bursts, so keep this low. 1 to 5, default 3.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Keep this on Residential proxy in Vietnam. CareerLink serves an empty result page to requests from outside Vietnam, including Apify's datacenter IPs, so a run without a Vietnamese residential proxy returns zero rows. Measured on 2026-09-10: datacenter proxy 0 rows, residential Vietnam 10 of 10 rows from the same search.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "VN"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}