# Cake Job Scraper — Asia Tech Jobs, Salaries & Hiring Companies (`youfuxu/cake-jobs-scraper`) Actor

Scrape jobs from Cake (cake.me), the tech job board used across Taiwan, Japan and Southeast Asia. Titles, companies, salary ranges, seniority, locations and full descriptions as clean JSON.

- **URL**: https://apify.com/youfuxu/cake-jobs-scraper.md
- **Developed by:** [Youfu Xu](https://apify.com/youfuxu) (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 results

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/platform/actors/running/actors-in-store#pay-per-event

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

## Cake Job Scraper — Asia tech jobs, salary ranges & hiring companies

Get clean, structured job data from **[Cake](https://www.cake.me)** (formerly CakeResume) — the tech-focused job board used across **Taiwan, Japan, Singapore and the rest of Southeast Asia**. Search any keyword in English, Chinese or Japanese and download the results as JSON, CSV or Excel. No login, no browser, no proxy setup.

### What you get

Run it with the default input and results look like this:

```json
{
  "title": "Python 後端工程師 (Data Integration & Visualization)",
  "companyName": "InAddition Consultants Ltd.",
  "companyUrl": "https://www.cake.me/companies/inaddition-consultants",
  "salaryMin": 1000000,
  "salaryMax": 1200000,
  "salaryCurrency": "TWD",
  "salaryPeriod": "year",
  "salaryText": "TWD 1,000,000 - 1,200,000 per year",
  "locations": ["台北市, 台灣"],
  "city": "Xinyi District",
  "stateName": "Taipei City",
  "country": "TW",
  "jobType": "full_time",
  "seniorityLevel": "mid_senior_level",
  "minWorkExpYear": 3,
  "language": "Chinese",
  "contentUpdatedAt": "2026-07-20T08:40:28Z",
  "url": "https://www.cake.me/companies/inaddition-consultants/jobs/pythonvisualization",
  "description": "【工作職責】您將加入我們的核心開發團隊…"
}
```

**28 fields per job by default**, including the full plain-text description, the salary range Cake publishes, seniority level, minimum years of experience, number of openings, company logo and the company's city, district and postcode.

Turn on **Include detail page data** and each job also gets `datePosted`, `remoteRequirement` (e.g. `Anywhere`), the HTML description and Cake's internal job identifier.

### Who uses this

- **Recruiters & sourcing teams** — see which companies across Taiwan and Japan are hiring, for which roles, at what pay
- **Salary benchmarking** — Cake listings carry structured `salaryMin` / `salaryMax` / `currency` / `period`, not free text you have to parse
- **Lead generation** — every row carries the hiring company, its Cake profile, logo and office location
- **Job boards & alert bots** — poll a keyword on a schedule and diff against yesterday's dataset
- **Market-entry research** — measure how many companies in a country are hiring for AI, backend, semiconductor or PM roles right now

### How to use

1. Enter a **keyword** — `python`, `product manager`, `後端工程師`, `データエンジニア` all work
2. Optionally set a **location** exactly as Cake spells it: `Taiwan`, `Japan`, `Singapore`, `Taipei City`
3. Set **Max jobs** (default 50; Cake pages 10 at a time)
4. Optionally enable **Include detail page data** for posted dates and remote-work requirements
5. Run, then download from the **Dataset** tab as JSON / CSV / Excel, or pull it through the Apify API

#### Example input

```json
{
  "keyword": "data engineer",
  "location": "Japan",
  "maxItems": 200,
  "includeDetails": true
}
```

### Notes on reliability

- The scraper reads the same structured payload the Cake website itself renders from, so fields stay consistent instead of breaking every time the design changes
- Cake rate-limits fast bursts. This Actor paces its requests and backs off automatically on HTTP 429, so long exports keep running instead of failing halfway
- Jobs that do not disclose pay come back with empty salary fields rather than a misleading `0`

### Pricing model

You pay per result — a small fee for each job returned. A 200-job export costs less than a coffee, and you only pay for rows you actually receive.

### FAQ

**Does it need a proxy?**
No. It works from Apify's own servers without residential proxies.

**How fresh is the data?**
Each job carries `contentUpdatedAt` straight from Cake, and with detail mode on you also get `datePosted`. Schedule the Actor daily and diff to catch new postings.

**Can I get every job for a country?**
Yes — leave the keyword broad and raise `maxItems`. Cake reports the total match count in the log so you know how deep the result set goes before you commit to a big run.

**Which countries are covered?**
Cake is strongest in Taiwan and Japan, with meaningful coverage in Singapore, Hong Kong and the wider APAC region. Use the `location` filter to narrow it.

# Actor input Schema

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

What to search for, e.g. <code>python</code>, <code>product manager</code>, <code>後端工程師</code>. Works in English, Chinese or Japanese. Leave empty to browse a location only.

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

Optional country or city filter exactly as Cake spells it, e.g. <code>Taiwan</code>, <code>Japan</code>, <code>Singapore</code>, <code>Taipei City</code>. Leave empty to search everywhere.

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

Maximum number of jobs to return (Cake pages 10 at a time). Keep it small for a quick test, raise it for a full export.

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

Visit each job page to add the exact posted date, the HTML description, remote-work requirements and Cake's job identifier. One extra request per job, so it is noticeably slower — the search results already include title, company, salary, location and plain-text description without it.

## Actor input object example

```json
{
  "keyword": "python",
  "location": "",
  "maxItems": 50,
  "includeDetails": false
}
```

# 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",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("youfuxu/cake-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",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("youfuxu/cake-jobs-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 '{
  "keyword": "python",
  "maxItems": 50
}' |
apify call youfuxu/cake-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cake Job Scraper — Asia Tech Jobs, Salaries & Hiring Companies",
        "description": "Scrape jobs from Cake (cake.me), the tech job board used across Taiwan, Japan and Southeast Asia. Titles, companies, salary ranges, seniority, locations and full descriptions as clean JSON.",
        "version": "1.0",
        "x-build-id": "VHAju8bUWjV0mpsES"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/youfuxu~cake-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-youfuxu-cake-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/youfuxu~cake-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-youfuxu-cake-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/youfuxu~cake-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-youfuxu-cake-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": [
                    "keyword"
                ],
                "properties": {
                    "keyword": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "What to search for, e.g. <code>python</code>, <code>product manager</code>, <code>後端工程師</code>. Works in English, Chinese or Japanese. Leave empty to browse a location only.",
                        "default": "python"
                    },
                    "location": {
                        "title": "Location filter",
                        "type": "string",
                        "description": "Optional country or city filter exactly as Cake spells it, e.g. <code>Taiwan</code>, <code>Japan</code>, <code>Singapore</code>, <code>Taipei City</code>. Leave empty to search everywhere.",
                        "default": ""
                    },
                    "maxItems": {
                        "title": "Max jobs",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of jobs to return (Cake pages 10 at a time). Keep it small for a quick test, raise it for a full export.",
                        "default": 50
                    },
                    "includeDetails": {
                        "title": "Include detail page data",
                        "type": "boolean",
                        "description": "Visit each job page to add the exact posted date, the HTML description, remote-work requirements and Cake's job identifier. One extra request per job, so it is noticeably slower — the search results already include title, company, salary, location and plain-text description without it.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
