# JobThai Jobs Scraper (Thailand) - jobthai.com หางาน (`asiajobs/jobthai-jobs-scraper`) Actor

Extract job postings from JobThai (jobthai.com), Thailand's largest job board. Search by keyword, province, region, job category, salary and WFH, and get salary (parsed THB min/max), education, experience, positions, benefits, full description and company profile as clean JSON.

- **URL**: https://apify.com/asiajobs/jobthai-jobs-scraper.md
- **Developed by:** [naphat zhaokun](https://apify.com/asiajobs) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## JobThai Jobs Scraper (หางาน สมัครงาน): Thailand

Extract job postings from **[JobThai](https://www.jobthai.com)** (จ๊อบไทย), Thailand's largest job board with tens of thousands of open positions across all 77 provinces. You get clean, structured JSON: salary text **plus parsed THB min/max**, education, experience, number of positions, benefits, the full job description and the company profile. Works in Thai or English.

### What you get

For every job posting:

| Field | Example |
|---|---|
| `id`, `url` | 1547764, https://www.jobthai.com/th/job/1547764 |
| `title` | Python/Odoo Developer (Bangkok) |
| `companyName`, `companyId`, `companyUrl`, `logoUrl`, `isTopCompany` | Changan Auto Southeast Asia Co., Ltd. |
| `province`, `district`, `subdistrict`, `region`, `industrialEstate` | กรุงเทพมหานคร, ห้วยขวาง, กรุงเทพและปริมณฑล |
| `transitStations`, `latitude`, `longitude` | MRT พระราม 9, BTS อารีย์ |
| `salaryText` | 15,000 - 25,000 บาท / ตามตกลง |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryNegotiable`, `salaryCurrency` | 15000, 25000, month, false, THB |
| `jobType`, `subJobType`, `employmentType` | งานคอมพิวเตอร์/ไอที, Business Analyst, FULL_TIME |
| `education`, `experience`, `experienceYearsMin`, `freshGraduatesWelcome` | ปริญญาตรี สาขาบัญชี, 2 ปีขึ้นไป, 2, false |
| `numberOfPositions`, `numberOfPositionsText` | 2, หลายอัตรา |
| `postedAt`, `isUrgent` | 2026-10-20T11:01:25.000Z |
| `workFromHome`, `hybridWork`, `onlineInterview`, `tags` | true, false, true |
| `description`, `qualifications`, `benefits`, `applyMethod` | full text (รายละเอียดงาน, คุณสมบัติผู้สมัคร, สวัสดิการ) |
| `companyWebsite`, `companyBusinessType`, `companyAbout`, `companyAddress` | public company profile and business address |
| `applyExternalUrl`, `englishApply`, `language`, `scrapedAt` | |

### Use cases

- **Recruiters & HR tech in Thailand**: see who is hiring, for which roles, in which province, and at what salary.
- **Salary & labor-market research**: parsed THB salary ranges by job category, province and education level (อัตราเงินเดือน).
- **Sales lead generation (B2B)**: companies that are hiring are companies that are growing. You get company name, website, business type and address.
- **Job aggregators, job apps & AI job agents**: feed fresh Thai listings (งานใหม่ล่าสุด) into your own product, in Thai or English.
- **Universities & career centers**: track entry-level and fresh-graduate jobs (งานสำหรับนักศึกษาจบใหม่), internships and part-time work (งานพาร์ทไทม์).

### How to use

1. **Search by keyword** (Thai or English), e.g. `python`, `บัญชี` (accounting), `วิศวกร` (engineer), `sales`, `ขับรถ` (driver). Leave it empty to list the latest jobs.
2. **Filter** (all optional):
   - `province` (จังหวัด), e.g. Bangkok, Chon Buri, Chiang Mai, Rayong, or `region` (ภาค), e.g. Bangkok Area, Eastern, Northern.
   - `jobType`: JobThai job category (ประเภทงาน), e.g. Computer/IT, Accounting, Engineering, Sales, Part-time, Freelance.
   - `salaryMin` / `salaryMax` in THB per month.
   - `workFromHome` for WFH / remote jobs (งาน WFH ทำงานที่บ้าน).
   - `sort`: latest, most relevant, salary high to low or low to high, company name.
3. Choose `language`: `th` (Thai labels) or `en` (English labels for province, category, salary wording).
4. Set `maxItems` and run. Results appear in the dataset. Export as JSON, CSV or Excel, or use the API.

Turn off `includeDetails` for a faster, cheaper list. You still get title, company, location, salary, category, tags and date, but not the description, qualifications, education, experience, benefits or company profile.

#### Example input

```json
{
  "keyword": "บัญชี",
  "province": "01",
  "salaryMin": 20000,
  "language": "th",
  "maxItems": 200,
  "includeDetails": true
}
```

### Pricing

**$3 per 1,000 jobs** ($0.003 per job saved to the dataset), plus a tiny $0.00005 start fee per run. Platform usage (compute, proxy, storage) is included, so there are no surprise costs, and failed requests or empty searches cost only the start fee. Examples: 100 jobs cost $0.30, 10,000 jobs cost $30. The Apify free plan's $5 monthly credit covers about 1,600 jobs.

### Tips

- Run it on a schedule (daily, sorted by latest) and compare `id`s to get only **new** postings.
- `salaryNegotiable: true` with no numbers means the employer wrote ตามตกลง / ตามประสบการณ์ / ตามโครงสร้างบริษัทฯ (negotiable, by experience, by company structure).
- `salaryPeriod` is `day` or `hour` for daily or hourly wages (วันละ / ชั่วโมงละ), otherwise `month`.
- JobThai lists at most about 10,000 results per search. For bigger exports, split by `province` or `jobType`.
- Use the Apify API or integrations (Google Sheets, Slack, LINE via Make/Zapier/n8n) to send new jobs anywhere.

### Notes

This actor reads publicly available job postings only. It does not log in, and it does not collect personal data. Recruiter names, personal emails, phone numbers and LINE IDs are not exported, and any that appear inside free text are replaced with `[phone hidden]` / `[email hidden]`. Company information is limited to public business details (name, website, business type, business address). Please use the data in line with Thailand's PDPA and JobThai's terms.

Questions or a field you need? Open an issue on the actor page. Fixes usually ship within a day.

# Actor input Schema

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

Search jobs by keyword in Thai or English, e.g. 'python', 'บัญชี', 'sales', 'วิศวกร'. Leave empty to list the latest jobs.

## `province` (type: `string`):

Only jobs in this province.

## `region` (type: `string`):

Only jobs in this region of Thailand. Use either province or region.

## `jobType` (type: `string`):

Only jobs in this JobThai job category.

## `salaryMin` (type: `integer`):

Only jobs whose salary range reaches at least this amount, e.g. 30000. Jobs with negotiable salary may be excluded by JobThai.

## `salaryMax` (type: `integer`):

Only jobs whose salary starts at or below this amount.

## `workFromHome` (type: `boolean`):

Return only jobs that JobThai marks as WFH / remote work.

## `sort` (type: `string`):

Sort order of the job list.

## `language` (type: `string`):

Language for province, category and other labels. Job text stays as the employer wrote it.

## `includeDetails` (type: `boolean`):

Fetch each job for description, qualifications, education, experience, number of positions, benefits, employment type, company profile and address. Turn off for a faster, lighter list.

## `maxItems` (type: `integer`):

Maximum number of jobs to return.

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

Proxy settings. JobThai works best WITHOUT a proxy (the default); only enable one if you see blocked (403) requests.

## Actor input object example

```json
{
  "keyword": "python",
  "province": "",
  "region": "",
  "jobType": "",
  "workFromHome": false,
  "sort": "UPDATED_AT_DESC",
  "language": "th",
  "includeDetails": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped job postings (dataset items).

# 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 = {
    "keyword": "python"
};

// Run the Actor and wait for it to finish
const run = await client.actor("asiajobs/jobthai-jobs-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 = { "keyword": "python" }

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

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

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

```

## CLI example

```bash
echo '{
  "keyword": "python"
}' |
apify call asiajobs/jobthai-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,asiajobs/jobthai-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cAL1l8J2ojzpfact6/builds/4ijRNO8Fn8xorbNG6/openapi.json
