# Mynavi Tenshoku Jobs Scraper (Japan) (`superslowsloth/mynavi-tenshoku-jobs`) Actor

Scrape job listings from Mynavi Tenshoku (マイナビ転職), one of Japan's largest mid-career job boards - the daily whole-site feed or any prefecture - with title, company, location, salary text plus parsed yen range, first-year income, employment type, tags and listing dates.

- **URL**: https://apify.com/superslowsloth/mynavi-tenshoku-jobs.md
- **Developed by:** [Superslow Sloth](https://apify.com/superslowsloth) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.62 / 1,000 job scrapeds

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

## Mynavi Tenshoku Jobs Scraper (Japan)

Scrape job listings from Mynavi Tenshoku (マイナビ転職, `tenshoku.mynavi.jp`), one
of Japan's largest mid-career job boards, and get one flat row per job: no
nested objects, no HTML to strip yourself. Walk the whole-site feed (about
63,000 open jobs on 2026-10-01) or any prefecture, and get title, company,
location, salary text with a parsed yen range, expected first-year income,
employment type, condition tags and listing dates.

### Input

| field | meaning |
|---|---|
| `startUrls` | Mynavi Tenshoku list pages to walk - any `tenshoku.mynavi.jp` URL with a `/list/` path, e.g. `https://tenshoku.mynavi.jp/list/` (the whole-site feed). Each page is followed forward through its own 次へ (next) link until the last page or `maxItems` |
| `areas` | Optional prefecture / overseas-region codes (`p13` = 東京, `p27` = 大阪, `a20` = アジア, ...), resolved to the same list links the site's own area menu uses |
| `maxItems` | Stop after this many jobs in total, shared across every start page in order. A list page carries 50 job cards |
| `proxyConfiguration` | Apify's default (datacenter) proxy - see **Proxy** below |

Leave `startUrls` and `areas` both empty to walk the whole-site feed.

#### What is not an input, and why

- **Keyword search.** The site's search box submits a form by POST and pages
  its results through a second POST form; neither leaves a link on the page
  that this actor could follow. Rather than guess at a URL shape, the actor
  accepts list URLs only.
- **Hokkaido as an area.** The site's area menu links 北海道 only to a
  regional landing page, not to a `/list/` page, so there is no menu link to
  reuse. If you have a Hokkaido list URL, pass it in `startUrls`.

### Output

| field | meaning |
|---|---|
| `job_id` | The id in the job's permalink, e.g. `206871-1-5-1` (`jobinfo-<id>/`). One row per id per run |
| `url` | `https://tenshoku.mynavi.jp/jobinfo-<id>/` |
| `job_key` | Mynavi's internal numeric posting key, from the card's 気になる button |
| `company_id` | The first part of `job_id`; the same number names the company's image folder |
| `title` | Job headline |
| `company` | Company name - the part of the card heading before `\|` |
| `company_tagline` | The company's catch line after `\|`, if the heading has one |
| `featured` | `true` for the 注目 (featured) placements Mynavi shows ahead of the feed |
| `badge` | The card's corner label as printed: 新着 (new) or 注目 (featured) |
| `employment_type` | 正社員, 契約社員, ... as printed |
| `tags` | Condition chips on the card: 転勤なし, 学歴不問, リモートワーク可, 志望動機・自己PR不要, ... |
| `location` | 勤務地 text |
| `salary_text` | 給与 text, as printed |
| `salary_period`, `salary_min_yen`, `salary_max_yen` | Parsed from `salary_text` - see below |
| `first_year_income_text`, `first_year_income_min_yen`, `first_year_income_max_yen` | 初年度年収 (expected first-year annual income), e.g. `550万円～600万円` -> 5,500,000 / 6,000,000 |
| `job_description` | 仕事内容 text |
| `target_candidates` | 対象となる方 text |
| `updated_date` | 情報更新日 (listing last updated), ISO date |
| `listing_end_date` | 掲載終了予定日 (scheduled end of the listing), ISO date |
| `logo_url`, `image_url` | Company logo and the card's banner photo |
| `list_position` | The card's position on its list page |
| `source_url` | The list page the row was read from |

Every field comes from the list page itself; the actor does not open each
job's detail page. Mynavi shortens long text cells on the list page and ends
them with `…` - `location`, `salary_text`, `job_description` and
`target_candidates` carry exactly what the list page prints, so the full text
is on the job's own page.

#### `null` is not zero

A field is `null` when the card does not state it, never a stand-in value:

- **`salary_min_yen` / `salary_max_yen` / `salary_period`** are filled only when
  the salary text opens with one figure or one range, e.g.
  `月給230,000円〜400,000円` -> monthly 230,000 / 400,000. Mynavi's salary text
  is free text and often lists several tiers - `【未経験者の場合】 月給28万円〜
  【経験者の場合】 月給39万円〜`, or a different figure per city. Picking one tier
  would be a guess, so those rows keep the words in `salary_text` and the
  numbers stay `null`. On the 2026-10-04 sample, roughly a third of cards were
  of that kind.
- **`salary_max_yen`** is `null` for an open-ended salary (`月給35万円以上`,
  `月給29万円〜`). A single exact figure (`月給266,228円`) fills both min and max.
- **`first_year_income_*`** is `null` when the card has no 初年度年収 row - 8 of
  49 complete cards on 2026-10-04.
- **`logo_url`** is `null` on cards that print no company logo - 15 of 50 on
  2026-10-01, 14 of 50 on 2026-10-04 - and on every row from an `areas` start:
  the prefecture / region list pages use a different card that has no logo.
- **Area pages** (`areas`) carry the same fields otherwise. Their 初年度年収 is
  printed as `450～900万円` and parsed the same way; on 2026-10-04, 5 of 50 東京
  cards had none. The overseas region pages (`a20`-`a25`) also list
  scouting.mynavi.jp postings, which are not tenshoku jobs and have no
  `job_id`; those are skipped and not charged (43 of 50 cards on the
  中近東・アフリカ page, 2026-10-04).
- **`job_key`**, **`updated_date`**, **`listing_end_date`** were printed on
  every complete card sampled; they are nullable only so that a card missing
  them is still a row rather than a crash.

A `0` in any of these columns would read as a measurement ("unpaid", "no
income") when the truth is that the card did not say.

### Proxy

Apify's default proxy (datacenter) is the default, and residential is not
needed: the probes on 2026-10-01 and 2026-10-04 fetched full list pages from a
datacenter address. Refusals (HTTP 403, 429, 5xx, or a page with neither job
cards nor a pager) are retried from a fresh proxy address; a 404 is treated
as permanent and not retried.

### Billing

Pay per event: **$0.00062 per job**, plus a fixed actor-start fee per run. A
job is charged once per run, even when it appears on more than one page or
under more than one start URL. Platform usage is included.

# Actor input Schema

## `startUrls` (type: `array`):

Mynavi Tenshoku list pages to walk, e.g. https://tenshoku.mynavi.jp/list/ (the whole-site feed) or a prefecture page such as https://tenshoku.mynavi.jp/shutoken/list/p13/. Any tenshoku.mynavi.jp URL with a /list/ path is accepted. Keyword-search result pages are not supported: the site reaches them through a form POST, not through a link this actor can follow. Each page is followed forward through its own 次へ (next) link. Leave this and Areas both empty to walk the whole-site feed.

## `areas` (type: `array`):

Optional. Walk the list page of each chosen prefecture or overseas region, using the same links as the site's own area menu. Hokkaido is missing because the site's menu links it only as a landing page, not as a list page - paste a Hokkaido list URL into Start URLs instead. Combined with Start URLs in the order: start URLs first, then areas.

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

Stop after this many jobs in total, shared across every start URL and area in order - the first one can use the whole budget. A list page carries 50 job cards, so up to 50 jobs costs one page request. Each job is charged once per run even if it appears on several pages.

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

Apify's default (datacenter) proxy. Mynavi Tenshoku served full list pages to a datacenter address when probed on 2026-10-01 and 2026-10-04, so residential proxy is not needed; switch to it only if the run log shows repeated refusals (HTTP 403/429).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://tenshoku.mynavi.jp/list/"
    }
  ],
  "areas": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "startUrls": [
        {
            "url": "https://tenshoku.mynavi.jp/list/"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("superslowsloth/mynavi-tenshoku-jobs").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 = {
    "startUrls": [{ "url": "https://tenshoku.mynavi.jp/list/" }],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("superslowsloth/mynavi-tenshoku-jobs").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 '{
  "startUrls": [
    {
      "url": "https://tenshoku.mynavi.jp/list/"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call superslowsloth/mynavi-tenshoku-jobs --silent --output-dataset

```

## MCP server setup

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

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/povRHQ389bqn8WGzH/builds/A77wgk2oMJeJFi99P/openapi.json
