{
  "openapi": "3.0.1",
  "info": {
    "title": "JobStreet / JobsDB / SEEK Jobs Scraper",
    "description": "Scrapes job listings with full descriptions from JobStreet (ID/MY/PH/SG), JobsDB (TH/HK) and SEEK (AU/NZ) — keyword and location search with work-type, salary and date filters, plus direct job-URL lookup.",
    "version": "0.1",
    "x-build-id": "elfp8eeghvUfa7qjL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~jobstreet-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-jobstreet-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/scrapyx~jobstreet-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-jobstreet-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/scrapyx~jobstreet-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-jobstreet-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",
        "properties": {
          "country": {
            "title": "Market",
            "enum": [
              "ID",
              "MY",
              "PH",
              "SG",
              "TH",
              "HK",
              "AU",
              "NZ"
            ],
            "type": "string",
            "description": "Which country site to search. JobStreet (Indonesia, Malaysia, Philippines, Singapore), JobsDB (Thailand, Hong Kong) and SEEK (Australia, New Zealand) all run on the same platform, so every market returns the identical data shape.",
            "default": "ID"
          },
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "One search per entry — each keyword is run as its own query and gets its own SEARCH_SUMMARY row. Leave empty to browse every job in the market (optionally narrowed by Location and the filters below).",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Optional location filter, resolved server-side against the market's own taxonomy — e.g. 'Jakarta', 'Indonesia', 'Kuala Lumpur', 'Sydney'. If a spelling does not resolve, the API silently returns 0 results: check `locationResolved` on the SEARCH_SUMMARY row to tell 'no matches' apart from 'wrong spelling'.",
            "default": ""
          },
          "jobUrls": {
            "title": "Job URLs (direct mode)",
            "type": "array",
            "description": "Scrape specific job ads directly, skipping search entirely. Accepts a full job URL (https://id.jobstreet.com/job/93908556) or a bare numeric job id. Can be combined with a keyword search in the same run.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItemsPerQuery": {
            "title": "Max jobs per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop paginating a query after this many jobs. The API serves 100 per page, so 100 = one request. Set to 0 for unlimited — note the platform caps its own result window at roughly 6,000 jobs per query regardless of how many matches it reports, so narrow the query (or add a Location / classification filter) to reach deeper inventory.",
            "default": 100
          },
          "includeJobDetails": {
            "title": "Fetch full job descriptions",
            "type": "boolean",
            "description": "Fetch the complete job ad (full HTML description, screening questionnaire, benefit bullets, advertiser record) for every result via one extra request per job. Turn this off for a fast listing-only crawl — search cards already carry title, company, salary label, location, classification and a short teaser.",
            "default": true
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "KeywordRelevance",
              "ListedDate"
            ],
            "type": "string",
            "description": "Relevance is the site default. Date sorts newest-first, which is what you want for a scheduled run that only needs new postings.",
            "default": "KeywordRelevance"
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return jobs listed in the last N days — 1 for the last 24 hours, 7 for the last week, and so on. Any day count works, not just the presets the website offers. Leave at 0 for any date.",
            "default": 0
          },
          "workTypes": {
            "title": "Work type",
            "type": "array",
            "description": "Filter by employment type. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "Full time",
                "Part time",
                "Contract/Temp",
                "Casual/Vacation"
              ]
            },
            "default": []
          },
          "workArrangements": {
            "title": "Work arrangement",
            "type": "array",
            "description": "Filter by on-site / hybrid / remote. Leave empty for all arrangements.",
            "items": {
              "type": "string",
              "enum": [
                "On-site",
                "Hybrid",
                "Remote"
              ]
            },
            "default": []
          },
          "classificationIds": {
            "title": "Classification IDs",
            "type": "array",
            "description": "Filter by SEEK industry classification or sub-classification id (e.g. 1209 = Engineering, 6281 = Information & Communication Technology, 1203 = Banking & Financial Services). Every returned job carries its own ids under `classifications`, so run once without this filter to discover the ids that matter to you.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "salaryMin": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Lower bound in the market's local currency, matched against the salary band the advertiser published. Jobs advertised without a salary are excluded once this is set."
          },
          "salaryMax": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound in the market's local currency. Leave empty for no upper bound."
          },
          "salaryType": {
            "title": "Salary period",
            "enum": [
              "monthly",
              "annual"
            ],
            "type": "string",
            "description": "Whether the salary bounds above are monthly or annual figures. Asian markets advertise monthly; Australia and New Zealand advertise annual.",
            "default": "monthly"
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Upper bound on requests in flight at once, across search paging and job-detail fetches. Raise it for large runs; lower it if you start seeing HTTP 429 in the log.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Residential, pinned to the market you are scraping. Recon from a home connection saw no IP gating, but cloud runs are a different posture: from Apify's own container IP, Cloudflare challenges the market homepage every time, costing ~22s per run before any data is fetched. With Residential the same request succeeds immediately. Turning the proxy off will still return data — the search API itself is not gated — but each run pays that fixed delay.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}