# Malt Scraper: Freelancer Profiles, Rates & Skills (`dltik/malt-scraper`) Actor

Scrape Malt freelancers by keyword, location, daily rate range, skills. Coverage: France, Germany, Spain, UK, Belgium, Netherlands. Get name, headline, daily rate, city, rating, skills, profile URL. For agencies, recruiters, B2B prospecting. $4/1K freelancers, cheaper than every rival.

- **URL**: https://apify.com/dltik/malt-scraper.md
- **Developed by:** [Walid](https://apify.com/dltik) (community)
- **Categories:** Business, Lead generation, Marketing
- **Features:** Limited permissions
- **Stats:** 84 total users, 17 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 freelancer 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

## Malt Scraper — Freelancer Profiles, Daily Rates (TJM) & Skills API

> Scrape **Malt freelancers** by keyword, city, and daily-rate range across France, Germany, Spain, UK, Belgium & the Netherlands. Get name, headline, **daily rate (TJM)**, rating, missions, skills, languages, response rate — plus a free rate benchmark and optional AI fit-scoring. **The richest Malt dataset on Apify, and cheaper than every other Malt scraper — $0.004 per freelancer** ($4 / 1,000).

⭐ **Bookmark this Malt Scraper** to keep it on top of your Apify dashboard — Apify ranks actors by bookmarks, so it directly boosts this scraper's visibility.

### What is the Malt Scraper?

The **Malt Scraper** pulls freelancer profiles from [Malt](https://www.malt.com/), Europe's #1 freelance marketplace (700K+ freelancers). Search by keyword (skill or role), city, and **daily-rate (TJM)** range, then export structured profiles: name, headline, daily rate, rating, reviews, missions count, skills, certifications, languages, and response rate. Every run also appends a **free market summary** — the median and p25/p75 daily rate for your query — so rate benchmarking is built in.

It's the fastest way to get a structured snapshot of the European freelance market without clicking through search pages, and a transparent per-profile **Malt freelancer API** alternative (no official public API exists for bulk profile search).

### Use cases

- **Daily-rate benchmarking (TJM)** — every run returns a `market_summary` record: median, p25/p75, min/max rate, average rating, % Super Malter, % available, and top skills for your query. Price your own rate, or a mission budget, with real data.
- **Talent sourcing for agencies** — bulk-export freelancers in your niche to your CRM, then outreach. Use the `cities` fan-out to pull past Malt's 24-per-search guest cap.
- **AI-ranked shortlists** — turn on AI Fit Scoring: paste a mission brief and get every profile scored 0-100 with a recommended action and a personalised outreach hook.
- **Recruiter intelligence** — track top freelancers in a sector, their rates, and their availability over time.
- **Freelance-market research** — count active freelancers per skill per country, or measure rate inflation quarter over quarter.
- **Build a niche freelancer directory** — power a vertical marketplace on top of Malt data.

### Input

Provide `keywords` (each runs a search), or paste a Malt search URL into `searchUrl` and its filters are reverse-mapped for you. Add `cities` to fan a keyword across locations and beat the 24-result guest cap. See the input schema for the full reference.

```json
{
  "keywords": ["developpeur python"],
  "cities": ["Paris", "Lyon", "Marseille"],
  "country": "fr",
  "minRate": 400,
  "maxRate": 800,
  "enrichProfiles": true,
  "maxResults": 100
}
```

### Output

One record per freelancer (40+ fields; 30+ more with `enrichProfiles`), plus one `market_summary` record per run.

```json
{
  "first_name": "Jean",
  "headline": "Développeur Python · Django & FastAPI",
  "city": "Paris",
  "daily_rate": 650,
  "currency": "EUR",
  "rating": 4.9,
  "missions_count": 23,
  "top_skills": ["Python", "Django", "PostgreSQL", "AWS"],
  "is_super_malter": true,
  "profile_url": "https://www.malt.fr/profile/example",
  "ai": { "fit_score": 88, "recommended_action": "shortlist", "outreach_hook": "..." }
}
```

### Pricing

This actor uses **PAY_PER_EVENT**:

- **$0.005 per run** (actor start) — a flat cover fee, not per-GB, so many small searches stay cheap.
- **$0.004 per freelancer** (= $4 per 1,000) — still cheaper than every other Malt scraper on the Store. The free `market_summary` and all enrichment fields cost nothing extra.

**AI Fit Scoring (optional, premium):** **$0.008 per freelancer analyzed**, charged only when you set `analyzeFreelancers` + `missionBrief` on a paid Apify plan. It scores each profile 0-100 against your brief with a reason, a shortlist/maybe/skip action, and an outreach hook.

### Automate & schedule

Schedule this actor **weekly** to track freelancer rates and availability in your niche, or wire it to Google Sheets, Slack, or your CRM via Apify integrations. Recurring runs keep your talent pool and rate benchmarks current — set it once and forget it.

**Ready-to-run tasks** (pre-configured, one click):

- [Scrape Malt Developers](https://apify.com/dltik/malt-scraper/scrape-malt-developers) — rates, skills & ratings for dev freelancers
- [Malt Daily Rate Benchmark (TJM)](https://apify.com/dltik/malt-scraper/malt-daily-rate-benchmark) — median / p25 / p75 daily rate by skill
- [Scrape Malt Designers](https://apify.com/dltik/malt-scraper/scrape-malt-designers) — UX/UI & product designers
- [Scrape Malt Freelancers by City](https://apify.com/dltik/malt-scraper/malt-freelancers-by-city) — fan across Paris, Lyon, Marseille…
- [Malt Talent Sourcing](https://apify.com/dltik/malt-scraper/malt-talent-sourcing) — bulk export enriched profiles to your CRM

### FAQ — Malt API & alternatives

**Is there an official Malt API, and is it free?** No public API exists for bulk freelancer search. This scraper is the practical way to get structured Malt profiles — no account required.

**How do I scrape more than 24 Malt profiles?** Malt's guest search caps at ~24 results per query. Pass several `keywords`, or set `cities` (e.g. `["Paris","Lyon"]`) to fan each keyword across locations — every keyword×city query returns a different slice, deduplicated by profile.

**Can I paste a Malt search URL?** Yes — put it in `searchUrl` and its filters (keyword, country, city, rate range, location type, availability, experience) are reverse-mapped automatically.

**How accurate are the daily rates (TJM)?** Rates are what each freelancer publicly displays. Some list "rate on demand" and return a null rate; those are excluded from the benchmark.

**Is Malt blocking scrapers?** Malt runs Cloudflare and geo-scores traffic. This scraper routes through **country-matched residential proxies** (a FR IP for malt.fr, DE for malt.de, and so on) with browser TLS impersonation and a warm-up handshake, so it clears Cloudflare reliably. It also paces below Malt's ~50 req/min limit and retries — avoid running many instances in parallel against Malt.

**Which countries does it cover?** France, Germany, Spain, UK, Belgium, and the Netherlands — the markets where Malt operates. Other regions return empty.

***

⭐ **Found this useful? Bookmark this Malt Scraper** — it's the strongest signal for Apify Store ranking, and the more you bookmark, the more you support the dev.

#### Related actors

- [France Travail Scraper](https://apify.com/dltik/francetravail-scraper) — French public job board (full-time + freelance)
- [Welcome to the Jungle Scraper](https://apify.com/dltik/welcome-to-the-jungle-scraper) — FR/EU tech employer jobs
- [HelloWork Scraper](https://apify.com/dltik/hellowork-scraper) — French job board with employer enrichment

License: MIT · Author: [dltik](https://apify.com/dltik)

# Actor input Schema

## `keywords` (type: `array`):

List of keywords to search freelancers (e.g. 'developpeur python', 'designer UI'). Each keyword runs a separate search. Note: Malt limits guest search to ~24 profiles per keyword — use multiple keywords or the 'cities' fan-out to expand coverage (results are deduplicated by profile).

## `searchUrl` (type: `string`):

Paste a Malt search URL (e.g. https://www.malt.fr/s?q=developpeur+python\&city=Paris) and its filters are reverse-mapped automatically: keyword, country (from the domain), city, location type, rate range, availability, experience. Explicit fields above still take precedence. Handy when you built a search visually on Malt.

## `cities` (type: `array`):

List of cities to fan out each keyword across (e.g. \['Paris','Lyon','Marseille']). Malt's guest search caps at ~24 profiles per query, but each keyword×city query returns a different slice — this multiplies unique coverage without login. Deduplicated by profile. Overrides the single 'city' filter when set.

## `country` (type: `string`):

Malt country: fr (France), de (Germany), es (Spain), uk (United Kingdom), be (Belgium), nl (Netherlands).

## `city` (type: `string`):

Filter by city (e.g. 'Paris', 'Lyon', 'Berlin'). Leave empty for all cities.

## `locationType` (type: `string`):

Filter by work location preference.

## `minRate` (type: `integer`):

Filter freelancers with daily rate ≥ this amount (applied at API level when supported).

## `maxRate` (type: `integer`):

Filter freelancers with daily rate ≤ this amount (applied at API level when supported).

## `experienceLevel` (type: `string`):

Filter by minimum experience level.

## `availability` (type: `string`):

Filter by availability status.

## `minRating` (type: `number`):

Filter by minimum rating (0-5). Applied post-fetch.

## `enrichProfiles` (type: `boolean`):

For each freelancer found, fetch the public profile API to extract 30+ extra fields: answer rate, answer time, languages with level, portfolio items count, fee rates, geo coordinates, etc. Slower but no extra cost — enrichment is included in the per-freelancer price.

## `analyzeFreelancers` (type: `boolean`):

Score each freelancer against your 'missionBrief' with an LLM: fit_score 0-100, one-line reason, recommended action (shortlist/maybe/skip), a personalised outreach hook, and a concern flag. Turns raw profiles into a ranked, ready-to-contact shortlist. Requires a paid Apify plan. Charged as a separate premium event ON TOP of freelancer-scraped, only for profiles actually scored. Requires 'missionBrief' to be set.

## `missionBrief` (type: `string`):

The role/mission you are staffing, in any language — e.g. 'Senior Python/FastAPI backend dev for a 6-month fintech mission, remote, budget 600€/day, must speak English'. The AI scores each freelancer against this. Only used when analyzeFreelancers is on.

## `enrichConcurrency` (type: `integer`):

Parallel workers for profile enrichment. Higher = faster but may trigger rate-limits.

## `maxResults` (type: `integer`):

Maximum freelancers per keyword. Malt's guest search caps at ~24 per query — values above 24 only matter when combined with multiple keywords/filters. Aliases accepted: 'limit', 'max'. Each result charged at the per-event price — start small to validate output.

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

Proxy configuration. Malt blocks Apify datacenter IPs via Cloudflare — residential proxies are required. Defaults to Apify residential proxy group.

## Actor input object example

```json
{
  "keywords": [
    "developpeur python"
  ],
  "cities": [],
  "country": "fr",
  "locationType": "",
  "experienceLevel": "",
  "availability": "",
  "enrichProfiles": false,
  "analyzeFreelancers": false,
  "enrichConcurrency": 10,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Dataset of Malt freelancer profiles with name, title, daily rate, location, rating, reviews, skills.

# 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 = {
    "keywords": [
        "developpeur python"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/malt-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 = {
    "keywords": ["developpeur python"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("dltik/malt-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 '{
  "keywords": [
    "developpeur python"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call dltik/malt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dltik/malt-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/iya2fTnWHtN9vugGS/builds/1bcoLWaTEd65brfA1/openapi.json
