# JobThai.com Scraper (`shahidirfan/jobthai-com-scraper`) Actor

Extract live job listings from Thailand's top job board. Get job titles, companies, salaries, descriptions & apply links. Perfect for recruitment analytics, salary benchmarking, market research & AI training datasets. Fully structured, ETL-ready output.

- **URL**: https://apify.com/shahidirfan/jobthai-com-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Jobs, AI, Automation
- **Stats:** 6 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## JobThai Jobs Scraper

Collect structured job listings from JobThai with URL-based filters or keyword-driven search input. Build reliable datasets for market research, hiring analysis, lead generation, and competitive monitoring.

### Features

- **Flexible start input** — Run with a full JobThai jobs URL or plain keyword/location filters.
- **Pagination controls** — Limit by both `resultsWanted` and `maxPage` for predictable runs.
- **Rich job dataset** — Includes job, company, location, salary, tags, transit, and update fields.
- **Clean output records** — Excludes null and empty values from dataset items.
- **Proxy-ready runs** — Supports proxy configuration for stronger reliability.

### Use Cases

#### Hiring Market Monitoring

Track active openings by role, region, or company to monitor demand trends over time.

#### Salary and Location Analysis

Compare salary ranges and location distribution to support recruiting strategy or relocation planning.

#### Job Lead Collection

Collect fresh job URLs and role information for outreach pipelines or matching systems.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `url` | String | No | `https://www.jobthai.com/หางาน/งานทั้งหมด` | JobThai jobs URL (supports query filters). |
| `keyword` | String | No | `developer` | Search term for job title or company. |
| `location` | String | No | `Bangkok` | Location hint (mapped for supported provinces). |
| `resultsWanted` | Integer | No | `20` | Maximum jobs to save. |
| `maxPage` | Integer | No | `3` | Maximum pages to request. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": false }` | Optional proxy settings. |

***

### Output Data

| Field | Type | Description |
|-------|------|-------------|
| `id` | Number | Job ID. |
| `jobTitle` | String | Job title text. |
| `companyName` | String | Company name. |
| `companyId` | Number | Company ID. |
| `companyLogoUrl` | String | Company logo URL. |
| `salary` | String | Salary text. |
| `workLocation` | String | Work location details. |
| `provinceId` | String | Province ID. |
| `provinceName` | String | Province name. |
| `districtId` | String | District ID. |
| `districtName` | String | District name. |
| `industrialId` | String | Industrial zone ID. |
| `industrialName` | String | Industrial zone name. |
| `countryName` | String | Country name if present. |
| `jobTypeId` | Number | Job type ID. |
| `jobTypeName` | String | Job type name. |
| `regionId` | String | Region ID. |
| `regionName` | String | Region name. |
| `urgent` | String | Urgency label. |
| `isTopCompany` | Boolean | Top company flag. |
| `tags` | Array | Job tags. |
| `transitStations` | Array | Nearby stations. |
| `updatedAt` | String | Last updated timestamp. |
| `jobUrl` | String | Direct job detail URL. |

***

### Usage Examples

#### Default Run

```json
{
  "url": "https://www.jobthai.com/หางาน/งานทั้งหมด",
  "resultsWanted": 20,
  "maxPage": 3
}
```

#### Keyword Search

```json
{
  "keyword": "developer",
  "resultsWanted": 50,
  "maxPage": 5
}
```

#### URL With Built-In Filters

```json
{
  "url": "https://www.jobthai.com/th/jobs?province=01&jobtype=7&page=1",
  "resultsWanted": 40,
  "maxPage": 4
}
```

***

### Sample Output

```json
{
  "id": 1319950,
  "jobTitle": "เจ้าหน้าที่จัดกิจกรรมคณิตศาสตร์/วิทยาศาสตร์",
  "companyName": "บริษัท สู่อัจฉริยะ จำกัด",
  "salary": "16,000บาท(Full time)/500บาท(Part time)",
  "provinceName": "กรุงเทพมหานคร",
  "districtName": "บางกะปิ",
  "jobTypeName": "งานวิชาการ",
  "updatedAt": "2026-06-01T14:03:58.000Z",
  "jobUrl": "https://www.jobthai.com/th/company/job/1319950"
}
```

***

### Tips for Best Results

#### Use Specific Keywords

Short, role-specific keywords usually produce cleaner datasets than broad terms.

#### Keep Pagination Practical

Start with `resultsWanted: 20` and `maxPage: 3`, then scale after verifying output quality.

#### Prefer Filtered URLs for Precision

When you already know province/job type filters, using a prepared JobThai URL gives tighter results.

***

### Integrations

Connect output data to:

- **Google Sheets** — Share and analyze job feeds quickly.
- **Airtable** — Build searchable hiring databases.
- **Make** — Automate enrichment and notifications.
- **Zapier** — Trigger downstream workflows.

#### Export Formats

- **JSON** — Programmatic integrations.
- **CSV** — Spreadsheet workflows.
- **Excel** — Business reporting.

***

### Frequently Asked Questions

#### Can I run with only keyword and no URL?

Yes. The actor supports keyword-only runs.

#### Does it support pagination?

Yes. It paginates automatically up to `maxPage` and stops at `resultsWanted`.

#### Why are some fields missing in some rows?

Some postings do not publish every attribute; missing values are excluded from output.

#### Does user input override defaults?

Yes. Values you provide at run time always take priority.

#### Can I use proxy settings?

Yes. Use `proxyConfiguration` when needed.

***

### Legal Notice

Use this actor responsibly and ensure your usage complies with JobThai terms and applicable laws.

# Actor input Schema

## `url` (type: `string`):

Any JobThai listing URL (for example /th/jobs, /หางาน/งานทั้งหมด, or URLs with filters).

## `keyword` (type: `string`):

Job keyword, title, or company term.

## `location` (type: `string`):

Location text (for example Bangkok, Nonthaburi, Chonburi).

## `resultsWanted` (type: `integer`):

Maximum number of jobs to collect.

## `maxPage` (type: `integer`):

Maximum number of result pages to request.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy for reliability if needed.

## Actor input object example

```json
{
  "url": "https://www.jobthai.com/หางาน/งานทั้งหมด",
  "keyword": "developer",
  "location": "Bangkok",
  "resultsWanted": 20,
  "maxPage": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "url": "https://www.jobthai.com/หางาน/งานทั้งหมด",
    "keyword": "developer",
    "location": "Bangkok",
    "resultsWanted": 20,
    "maxPage": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/jobthai-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "url": "https://www.jobthai.com/หางาน/งานทั้งหมด",
    "keyword": "developer",
    "location": "Bangkok",
    "resultsWanted": 20,
    "maxPage": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/jobthai-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "url": "https://www.jobthai.com/หางาน/งานทั้งหมด",
  "keyword": "developer",
  "location": "Bangkok",
  "resultsWanted": 20,
  "maxPage": 3
}' |
apify call shahidirfan/jobthai-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/jobthai-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/93B7GLTsUp8ScMXnJ/builds/CY3g4Xs9BANvXN1bW/openapi.json
