# 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, reviews count, skills, profile URL. For agencies, recruiters, talent platforms, B2B prospecting. $1/1K freelancers.

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

## Pricing

from $1.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?

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

## 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. **HTTP-only, $0.001 per freelancer** ($1 / 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.001 per freelancer** (= $1 per 1,000). Failed runs are not charged, and the free `market_summary` and 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 has a Cloudflare rate limit at sustained ~50 req/min on profile endpoints. This scraper paces safely below it 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/eXUPbldBhi5DfZrqh/openapi.json
