# Lancers Scraper - Japan Freelance Jobs, Budgets & Competitions (`youfuxu/lancers-japan-freelance-jobs-scraper`) Actor

Scrape freelance projects, design competitions and micro-tasks from Lancers (lancers.jp), Japan's largest crowdsourcing marketplace. Titles, categories, JPY budget ranges, deadlines and full briefs as clean JSON — no browser, no proxy.

- **URL**: https://apify.com/youfuxu/lancers-japan-freelance-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/actors/running/actors-in-store.md#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

## Lancers Scraper — Japan freelance projects, budgets & design competitions

Get clean, structured listing data from **[Lancers](https://www.lancers.jp)** (ランサーズ) — Japan's largest crowdsourcing and freelance marketplace, with millions of posted projects, design competitions and micro-tasks. Search any keyword, filter by category, work type or budget, 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 (`python`, projects) and results look like this:

```json
{
  "url": "https://www.lancers.jp/work/detail/5589147",
  "workId": 5589147,
  "title": "テックコンサルタント／テクニカルインタビュアー 募集",
  "workType": "project",
  "workTypeJa": "プロジェクト",
  "category": "AI・Webコンサルティング",
  "categoryId": 266,
  "budgetMin": 300000,
  "budgetMax": 500000,
  "budgetCurrency": "JPY",
  "budgetText": "¥300,000 〜 ¥500,000",
  "paymentType": "fixed",
  "deadline": "2026-08-27T16:41:19+09:00",
  "deadlinePassed": false,
  "daysUntilDeadline": 6,
  "isRemoteFriendly": false,
  "description": "## 仕事内容\n\nテックコンサルタントとして、エンジニア採用における技術面接・技術評価を担当していただきます。\n\n候補者の技術スキルや開発経験、問題解決能力、設計力、コミュニケーション能力などを確認し…",
  "descriptionLength": 1034,
  "source": "lancers",
  "searchKeyword": "python",
  "scrapedAt": "2026-08-21T02:23:30.829Z"
}
```

**22 fields per listing**, including the **full client brief** (Markdown, typically 500–2,500 characters — not a teaser), the budget range as real numbers in JPY, the Lancers category, the proposal deadline converted to ISO-8601 with the Japan offset, and a `deadlinePassed` flag so you can separate live listings from closed ones in one click.

### Who uses this

- **Freelancers and agencies entering Japan** — see what clients actually pay for Python, WordPress, logo, video-editing or translation work before you quote
- **Rate benchmarking & market research** — thousands of historical listings with `budgetMin` / `budgetMax` per category; aggregate by `category` and `paymentType` to build a price index for the Japanese outsourcing market
- **Job-alert and proposal bots** — run every hour with `onlyOpen: true`, diff on `workId`, and be the first to propose on new postings
- **Lead generation for dev shops and SaaS** — every listing is a company or individual with a budget and an unmet need, described in their own words
- **Demand research** — count how many open projects mention AI, LLM, Shopify, Unity or any other stack right now on Japan's biggest freelance marketplace

### How to use

1. Enter a **keyword** — Japanese terms (`Webサイト`, `ロゴ`, `動画編集`, `記事作成`) match far more listings than English ones, but `python`, `WordPress`, `Shopify` work too
2. Optionally pick a **category** (system, web, design, writing, translation, multimedia, business, task)
3. Pick a **work type**: `project` (default — the classic "post a job, pick a freelancer" listing), `competition`, `task`, `agent`, or `all`
4. Optionally turn on **onlyOpen** to get only listings still accepting proposals, and set a **minBudget** / **maxBudget** in yen
5. Set **maxItems** (default 50; Lancers pages 30 at a time)
6. Run, then download from the **Dataset** tab as JSON / CSV / Excel, or pull it through the Apify API

#### Example input

```json
{
  "keyword": "WordPress",
  "category": "web",
  "workType": "project",
  "onlyOpen": true,
  "minBudget": 50000,
  "maxItems": 200
}
```

### Output fields

| Field | Description |
| --- | --- |
| `url` | Listing page on lancers.jp |
| `workId` | Lancers numeric listing ID — use it to de-duplicate between runs |
| `title` | Listing title |
| `workType` / `workTypeJa` | `project` (プロジェクト), `competition` (コンペ), `task` (タスク) or `agent` (エージェント案件) |
| `category` / `categoryId` | Lancers sub-category, e.g. `Webシステム開発・プログラミング`, `ロゴ作成・デザイン` |
| `categoryGroup` | The category group you filtered by (empty when searching all) |
| `budgetMin` / `budgetMax` | Budget range in yen as numbers (`null` when the client did not set one side) |
| `budgetCurrency` | Always `JPY` when a budget is present |
| `budgetText` | Human-readable budget, e.g. `¥300,000 〜 ¥500,000` |
| `paymentType` | `fixed`, `hourly`, `monthly`, `per_task` or `prize` — see note below |
| `deadline` | Proposal deadline, ISO-8601 with `+09:00` offset |
| `deadlinePassed` | `true` when the deadline is already in the past |
| `daysUntilDeadline` | Days left (negative once closed) |
| `isRemoteFriendly` | `true` when the brief mentions リモート / 在宅 / remote |
| `description` | Full client brief as posted (Markdown, line breaks preserved) |
| `descriptionLength` | Character count of the brief |
| `source` | `lancers` for marketplace listings, `lancers_agent` for agent contracts |
| `searchKeyword` | The keyword you searched, handy when merging several runs |
| `scrapedAt` | UTC timestamp of the scrape |

### Notes on reliability

- The scraper reads the same JSON feed the Lancers search page renders from, so fields stay consistent instead of breaking every time the design changes
- Requests are paced at roughly one per second with automatic back-off on HTTP 429 / 5xx, so long exports keep running instead of failing halfway
- Listings without a budget come back with `null` budget fields rather than a misleading `0`
- Results are de-duplicated on `workId` within a run

### Limitations

- **Client name, proposal count and posting date are not included.** Lancers protects its listing pages with a bot challenge, so this Actor deliberately stays on the search feed and does not open individual pages. The feed already carries the full brief, budget, category and deadline; if you need the client's profile or the live proposal count, open the `url` in a browser
- `paymentType` is inferred from wording in the title and brief (時給 / 時間単価 → `hourly`, 月額 / 月単価 → `monthly`, otherwise `fixed`). Competitions are always `prize`, tasks `per_task`
- `minBudget` / `maxBudget` follow Lancers' own rule: a listing matches when its budget *range overlaps* yours, so a ¥5,000–¥10,000 listing still appears with `minBudget: 10000`
- `workType: agent` rows are Lancers Agent monthly contracts that are mixed into keyword search; their `url` points at a retired domain and may not open, so they are excluded unless you ask for them
- Lancers search matches listings from the last several years by default. Use `onlyOpen: true` for live listings only, or filter on `deadlinePassed`

### Legal

This Actor collects publicly available listing data for research, benchmarking and lead-generation purposes. Respect Lancers' terms of service and applicable data-protection law when using the output.

# Actor input Schema

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

What to search for on Lancers, e.g. <code>python</code>, <code>WordPress</code>, <code>ロゴ</code>, <code>Webサイト</code>, <code>動画編集</code>. Japanese keywords match far more listings than English ones.

## `category` (type: `string`):

Restrict the search to one Lancers category group. Leave empty to search all categories.

## `workType` (type: `string`):

<b>project</b> (プロジェクト) = client picks one freelancer from proposals — the main job type. <b>competition</b> (コンペ) = submit a finished design/logo/name, winner takes the prize. <b>task</b> (タスク) = micro-jobs paid per item. <b>agent</b> = Lancers Agent monthly contracts (typically ¥300,000–¥800,000/month, titles start with 【定番】); their links point to a retired domain, so they are only returned when you pick this explicitly. <b>all</b> interleaves project, competition and task page by page.

## `onlyOpen` (type: `boolean`):

When on, returns only listings that are currently open (募集中). Off by default so you also get recently closed listings — useful for budget benchmarking. Every row carries <code>deadlinePassed</code> so you can filter later either way.

## `minBudget` (type: `integer`):

Only listings whose budget is at least this many yen, e.g. <code>100000</code>.

## `maxBudget` (type: `integer`):

Only listings whose budget is at most this many yen, e.g. <code>500000</code>.

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

Maximum number of listings to return (Lancers pages 30 at a time). Keep it small for a quick test, raise it for a full export.

## Actor input object example

```json
{
  "keyword": "python",
  "category": "",
  "workType": "project",
  "onlyOpen": false,
  "maxItems": 50
}
```

# Actor output Schema

## `datasetItemsJson` (type: `string`):

All scraped records as a JSON array.

## `datasetItemsCsv` (type: `string`):

All scraped records as a CSV file.

## `datasetItemsXlsx` (type: `string`):

All scraped records as an Excel workbook.

## `dataset` (type: `string`):

The default dataset of this run in Apify Console.

# 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/lancers-japan-freelance-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/lancers-japan-freelance-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",
  "maxItems": 50
}' |
apify call youfuxu/lancers-japan-freelance-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,youfuxu/lancers-japan-freelance-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/RnUg3CalsTiaKFveD/builds/1LTq7lTQidOAnXFfw/openapi.json
