# Thailand Job Market Intelligence (`mai_amm/thailand-job-market-intelligence`) Actor

Searches multiple Thailand job boards and summarizes demand, salaries, skills, hiring companies, locations, and remote/hybrid trends.

- **URL**: https://apify.com/mai\_amm/thailand-job-market-intelligence.md
- **Developed by:** [wiseld\_squid](https://apify.com/mai_amm) (community)
- **Categories:** Jobs, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Thailand Job Market Intelligence

Search Thailand job boards and turn listings into market intelligence. The Actor searches selected sources from keywords and location hints, normalizes job records, extracts salary and skills, and saves source-level and overall summaries. JobsDB uses residential proxy automatically by default because SEEK/JobsDB blocks many cloud and datacenter IPs.

### Sources

- JobThai
- JobsDB Thailand
- JOBBKK
- JOBTOPGUN
- WorkVenture
- LinkedIn / Indeed via `startUrls` URL mode
- Custom job pages via `startUrls`

### Output

The dataset contains three record types:

- `job`: normalized individual job listing
- `source_summary`: source-level summary
- `market_summary`: combined market intelligence across sources

Use `market_summary` for salary benchmarking, demand tracking, hiring company discovery, and skill demand analysis.

# Actor input Schema

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

Main job keyword, skill, or role to search for.
## `keywords` (type: `array`):

Additional keywords. Each keyword is searched across selected sources.
## `location` (type: `string`):

Optional province or city hint such as Bangkok, Chonburi, Chiang Mai, Remote.
## `sources` (type: `array`):

Job boards to search. LinkedIn and Indeed are URL mode only unless startUrls are provided.
## `startUrls` (type: `array`):

Optional search or job detail URLs. Use this for LinkedIn, Indeed, or any custom source page.
## `maxJobsPerSource` (type: `integer`):

Maximum normalized job records to save per source.
## `maxPagesPerSource` (type: `integer`):

Maximum search/listing pages to crawl per source and keyword.
## `includeJobRecords` (type: `boolean`):

Save individual job records in addition to source and market summaries.
## `includeDetails` (type: `boolean`):

Open discovered detail pages to extract skills, salary, and descriptions. More accurate but costs more.
## `includeContacts` (type: `boolean`):

Include public contact emails/phones found in job pages. Disabled by default.
## `useResidentialProxyForJobsDb` (type: `boolean`):

JobsDB often blocks cloud/datacenter IPs. Keep this enabled when using the jobsdb source.
## `maxConcurrency` (type: `integer`):

Number of HTTP requests running at the same time.
## `proxyConfiguration` (type: `object`):

Proxy configuration. Enabled by default because some job boards block Apify cloud IPs.

## Actor input object example

```json
{
  "keyword": "data analyst",
  "keywords": [
    "programmer",
    "บัญชี"
  ],
  "location": "Bangkok",
  "sources": [
    "jobthai",
    "jobsdb",
    "jobbkk",
    "jobtopgun",
    "workventure"
  ],
  "startUrls": [
    {
      "url": "https://www.jobthai.com/th/jobs?keyword=data%20analyst"
    }
  ],
  "maxJobsPerSource": 50,
  "maxPagesPerSource": 2,
  "includeJobRecords": true,
  "includeDetails": true,
  "includeContacts": false,
  "useResidentialProxyForJobsDb": true,
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
````

# Actor output Schema

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

Job records plus market summaries.

## `summary` (type: `string`):

Only market summary records.

# 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": "data analyst",
    "keywords": [
        "programmer",
        "บัญชี"
    ],
    "location": "Bangkok",
    "startUrls": [
        {
            "url": "https://www.jobthai.com/th/jobs?keyword=data%20analyst"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mai_amm/thailand-job-market-intelligence").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": "data analyst",
    "keywords": [
        "programmer",
        "บัญชี",
    ],
    "location": "Bangkok",
    "startUrls": [{ "url": "https://www.jobthai.com/th/jobs?keyword=data%20analyst" }],
}

# Run the Actor and wait for it to finish
run = client.actor("mai_amm/thailand-job-market-intelligence").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 '{
  "keyword": "data analyst",
  "keywords": [
    "programmer",
    "บัญชี"
  ],
  "location": "Bangkok",
  "startUrls": [
    {
      "url": "https://www.jobthai.com/th/jobs?keyword=data%20analyst"
    }
  ]
}' |
apify call mai_amm/thailand-job-market-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mai_amm/thailand-job-market-intelligence",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Thailand Job Market Intelligence",
        "description": "Searches multiple Thailand job boards and summarizes demand, salaries, skills, hiring companies, locations, and remote/hybrid trends.",
        "version": "0.1",
        "x-build-id": "9jxmfdDdW1f2Nh96n"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mai_amm~thailand-job-market-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mai_amm-thailand-job-market-intelligence",
                "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/mai_amm~thailand-job-market-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-mai_amm-thailand-job-market-intelligence",
                "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/mai_amm~thailand-job-market-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-mai_amm-thailand-job-market-intelligence",
                "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": {
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "Main job keyword, skill, or role to search for."
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Additional keywords. Each keyword is searched across selected sources.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional province or city hint such as Bangkok, Chonburi, Chiang Mai, Remote."
                    },
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Job boards to search. LinkedIn and Indeed are URL mode only unless startUrls are provided.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "jobthai",
                                "jobsdb",
                                "jobbkk",
                                "jobtopgun",
                                "workventure",
                                "linkedin",
                                "indeed",
                                "custom"
                            ]
                        },
                        "default": [
                            "jobthai",
                            "jobsdb",
                            "jobbkk",
                            "jobtopgun",
                            "workventure"
                        ]
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional search or job detail URLs. Use this for LinkedIn, Indeed, or any custom source page.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxJobsPerSource": {
                        "title": "Max jobs per source",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum normalized job records to save per source.",
                        "default": 50
                    },
                    "maxPagesPerSource": {
                        "title": "Max pages per source",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum search/listing pages to crawl per source and keyword.",
                        "default": 2
                    },
                    "includeJobRecords": {
                        "title": "Include job records",
                        "type": "boolean",
                        "description": "Save individual job records in addition to source and market summaries.",
                        "default": true
                    },
                    "includeDetails": {
                        "title": "Open detail pages",
                        "type": "boolean",
                        "description": "Open discovered detail pages to extract skills, salary, and descriptions. More accurate but costs more.",
                        "default": true
                    },
                    "includeContacts": {
                        "title": "Include contacts",
                        "type": "boolean",
                        "description": "Include public contact emails/phones found in job pages. Disabled by default.",
                        "default": false
                    },
                    "useResidentialProxyForJobsDb": {
                        "title": "Use residential proxy for JobsDB",
                        "type": "boolean",
                        "description": "JobsDB often blocks cloud/datacenter IPs. Keep this enabled when using the jobsdb source.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of HTTP requests running at the same time.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy configuration. Enabled by default because some job boards block Apify cloud IPs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
