# Freelancermap Scraper (`crawlerbros/freelancermap-scraper`) Actor

Scrape freelancermap.com - Europe's IT freelance marketplace. Search freelance IT projects and freelancer profiles by category, workplace type, and contract type; fetch full project or freelancer profile details by URL.

- **URL**: https://apify.com/crawlerbros/freelancermap-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Jobs, Lead generation
- **Stats:** 3 total users, 2 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 and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Freelancermap Scraper

Scrape **freelancermap.com** — one of Europe's largest IT freelance marketplaces. Search or browse freelance IT projects and freelancer profiles by category, workplace type (remote/hybrid/on-site), and contract type, then pull full project or freelancer profile detail by URL. HTTP-only. No auth, no cookies, no proxy required.

### What this actor does

- **Four modes:** `projectSearch`, `freelancerSearch`, `projectDetail`, `freelancerProfile`
- **Project search:** category or skill/technology tag, workplace type (remote/hybrid/on-site), contract type, sort order, keyword search, city + radius, country, posted-within-days, industry, direct-end-client-only, and an option to include the larger Germany/Austria/Switzerland (DACH) results pool
- **Freelancer search:** category or skill/technology tag, keyword search, sort order, city + radius, country, max hourly rate, max daily rate, spoken language, profile-updated-within-days, and an option to include the larger DACH results pool
- **Project detail:** company, client company link (when disclosed), location, contract terms, industry, required skills, budget (when disclosed), start date, duration, full description, whether the listing is still open for applications, whether it's been archived, and how many times the poster has edited it
- **Freelancer profile detail:** name, headline, bio, location, quoted rate, years of experience, skills, languages, certificates, project history, availability, whether the profile is still active, and the date they become available again (when marked temporarily unavailable)
- **Empty fields are omitted** — a record only ever contains fields the source actually published

### Output: per-project listing (mode = `projectSearch`)

- `slug` — freelancermap project slug
- `title`, `company`
- `city`, `country`
- `remoteType` — `On-site` / `Hybrid` / `Remote`
- `contractType` — `Freelance` / `Permanent` / `Agency contract`
- `duration` — freeform duration text as published (e.g. `3 months+`)
- `startAvailability` — freeform start-date text as shown on the listing card (e.g. `ASAP`, `Immediate`, or a specific date), independent of `duration`
- `postedLabel` — freeform "posted" label as shown on the listing
- `isEndClient` — whether the listing card is tagged "End client" (posted directly by the hiring company, no agency in between)
- `sourceUrl` — canonical project URL
- `recordType: "projectListing"`, `scrapedAt`

### Output: per-freelancer listing (mode = `freelancerSearch`)

- `slug` — freelancermap profile slug
- `name` — only present if the freelancer has opted to display it publicly on the directory card
- `headline` — the freelancer's profile title
- `city`, `country`
- `sourceUrl` — canonical profile URL
- `recordType: "freelancerListing"`, `scrapedAt`

### Output: per-project detail (mode = `projectDetail`)

- `projectId`, `slug`, `title`, `company`
- `companyUrl` — link to the client's freelancermap company page, only when the poster made it public
- `city`, `country`
- `contractType`, `remotePercent`, `remoteType`
- `industry`
- `skills[]` — required skills/technologies
- `budget` — only when the poster disclosed one
- `startText`, `startYear`, `startMonth`
- `durationText`, `durationMonths`, `extensionPossible`
- `workloadPercent` — only when disclosed
- `isEndcustomerProject`, `isTopProject`
- `isActive` — whether the listing is still open/accepting applications (a project detail page can remain reachable by direct URL after it has closed)
- `applicationsPaused` — whether the poster has temporarily paused new applications
- `isArchived` — whether the poster has archived the listing (removed it from freelancermap's own search results), independent of `isActive`/`applicationsPaused`
- `updateCount` — how many times the poster has edited this listing since publishing
- `description` — full plain-text project description
- `created`, `updated` — ISO timestamps
- `expires` — the project's application deadline (when it stops accepting new applications)
- `posterName` — the contact name attached to the listing (a recruiter/agency name or an individual's name)
- `posterId` — the posting account's stable numeric ID, useful for grouping multiple listings from the same recruiter/agency
- `posterMemberSince` — the date the posting account joined freelancermap
- `additionalLocations[]` — named secondary locations, only present on the (uncommon) multi-site projects that list more than one location
- `sourceUrl`
- `recordType: "project"`, `scrapedAt`

### Output: per-freelancer profile detail (mode = `freelancerProfile`)

- `slug`, `name`, `headline`
- `about` — the freelancer's short bio/intro text, when provided
- `city`, `country`, `postalCode`
- `rate`, `rateCurrency` — the freelancer's quoted rate as published on their profile (the unit — hourly or daily — is set by the freelancer and isn't separately exposed by the source)
- `experienceYears`, `freelancerSinceYear`, `graduation`
- `skillsSummary` — the freelancer's free-text skills/expertise write-up
- `skills[]` — tagged skill keywords, `skillsCount`
- `languages[]` — `{language, level}` (level 1-4)
- `availability` — `Available` / `Partially available` / `Not available`
- `unavailableUntil` — the date the freelancer becomes available again, only present when they've marked themselves temporarily unavailable
- `profileCompletionPercent`, `isVerified`, `isActive` — whether the profile itself is currently active on freelancermap
- `isAnonymousProfile` — whether the freelancer has opted to hide identifying details from anonymous visitors
- `membershipTier`
- `travelAvailability` — e.g. `Worldwide`, `Remote only`
- `certificates[]` — `{name, issuer, year, url}`
- `projectHistory[]` — `{position, company, startDate, endDate, description}`
- `avatarUrl` — the freelancer's profile photo, when uploaded
- `websiteUrl`, `youtubeUrl` — personal/portfolio site or YouTube channel, when the freelancer listed one
- `portfolioItems[]` — `{title, description, link, imageUrl}`, when the freelancer showcased work samples
- `attachmentNames[]` — file names of uploaded CV/portfolio attachments, when the freelancer has any (the download links themselves require a freelancermap account, so only the file names are exposed)
- `subCategories[]` — broad category tags (e.g. `Programming`, `Consulting`), when the profile has any assigned
- `memberSince` — the date the freelancer's profile was created on freelancermap
- `profileUpdatedAt` — timestamp of the freelancer's most recent profile edit (distinct from `memberSince`/creation and `lastLoginAt`/account login)
- `lastLoginAt` — timestamp of the freelancer's most recent login (a recent-activity signal)
- `sourceUrl`
- `recordType: "freelancer"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `projectSearch` | `projectSearch` / `freelancerSearch` / `projectDetail` / `freelancerProfile` |
| `searchQuery` | string | `python` | Free-text keyword search (mode=projectSearch/freelancerSearch) |
| `category` | select | – | One of freelancermap's 9 top-level categories (mode=projectSearch/freelancerSearch) |
| `remoteType` | select | – | `onsite` / `hybrid` / `remote` (mode=projectSearch) |
| `contractType` | select | – | `contracting` (freelance) / `permanent_position` / `employee_leasing` (mode=projectSearch) |
| `sortBy` | select | `newest` | `newest` / `relevant` (mode=projectSearch/freelancerSearch) |
| `minDurationMonths` | int | – | Drop projects shorter than this (mode=projectSearch) |
| `technologySlug` | string | – | Filter by a skill/technology tag slug, e.g. `python-programming-language` (mode=projectSearch/freelancerSearch). Takes precedence over `category` |
| `city` | string | – | Filter by city name (mode=projectSearch/freelancerSearch) |
| `radiusKm` | int | – | Search radius in km around `city` (mode=projectSearch/freelancerSearch) |
| `country` | select | – | Restrict to freelancers/projects based in this country — 90 curated countries, a more precise and reliable alternative to `city` (mode=projectSearch/freelancerSearch) |
| `postedWithinDays` | int | – | Only projects created within this many days (mode=projectSearch) |
| `industry` | select | – | Restrict to a client industry, e.g. IT, Finance, Automotive (mode=projectSearch) |
| `endClientOnly` | boolean | `false` | Only projects posted directly by the end client, excluding agency reposts (mode=projectSearch) |
| `includeDachRegion` | boolean | `false` | Also include the larger Germany/Austria/Switzerland (DACH) results pool, which freelancermap excludes by default (mode=projectSearch/freelancerSearch) |
| `maxHourlyRate` | int | – | Only freelancers quoting at/below this hourly rate (mode=freelancerSearch) |
| `maxDailyRate` | int | – | Only freelancers quoting at/below this daily rate (mode=freelancerSearch) |
| `language` | select | – | Only freelancers who list this spoken language (mode=freelancerSearch) |
| `updatedWithinDays` | int | – | Only freelancer profiles updated within this many days (mode=freelancerSearch) |
| `requireDisplayedName` | boolean | `false` | Only emit freelancers whose name is publicly shown (mode=freelancerSearch) |
| `hasAttachmentsOnly` | boolean | `false` | Only freelancers who uploaded a portfolio/attachment (mode=freelancerSearch) |
| `openToPermanentJobs` | boolean | `false` | Only freelancers open to permanent-position offers (mode=freelancerSearch) |
| `openToAgencyContract` | boolean | `false` | Only freelancers open to agency/employee-leasing contracts (mode=freelancerSearch) |
| `excludeUnavailable` | boolean | `false` | Drop freelancers marked fully unavailable (mode=freelancerSearch) |
| `recentlyActiveOnly` | boolean | `false` | Only freelancers with the most recently updated/active profiles (mode=freelancerSearch) |
| `minAvailabilityPercent` | int | – | Only freelancers whose self-reported availability is at least this % (100 = fully available) (mode=freelancerSearch) |
| `projectSlugsOrUrls` | array | – | Project URLs or slugs to fetch (mode=projectDetail) |
| `profileSlugsOrUrls` | array | – | Freelancer profile URLs or slugs to fetch (mode=freelancerProfile) |
| `minExperienceYears` | int | – | Drop freelancer profiles with less experience (mode=freelancerProfile) |
| `availableOnly` | boolean | `false` | Only fully-available freelancers (mode=freelancerProfile) |
| `maxItems` | int | `20` | Hard cap on emitted records (1-500) |

### Example: browse remote Python projects

```json
{
  "mode": "projectSearch",
  "searchQuery": "python",
  "category": "web-and-software-development",
  "remoteType": "remote",
  "sortBy": "newest",
  "maxItems": 20
}
````

#### Example: browse freelance SAP consultants

```json
{
  "mode": "freelancerSearch",
  "searchQuery": "SAP",
  "maxItems": 20
}
```

#### Example: fetch full detail for specific projects

```json
{
  "mode": "projectDetail",
  "projectSlugsOrUrls": [
    "https://www.freelancermap.com/project/release-manager-3027983",
    "sc-cleared-android-developer-kotlin-remote"
  ]
}
```

#### Example: fetch full detail for specific freelancer profiles

```json
{
  "mode": "freelancerProfile",
  "profileSlugsOrUrls": ["https://www.freelancermap.com/profile/ryan-devlin"],
  "availableOnly": true
}
```

### Use cases

- **IT staffing agencies** — monitor newly posted freelance IT contracts by skill/category
- **Freelancer sourcing** — build a shortlist of available freelancers with specific skills and experience levels
- **Market research** — track quoted freelancer rates and in-demand skills across IT specialisms
- **Recruitment intelligence** — compare contract vs. permanent vs. agency-contract demand by category
- **Sales/lead generation** — identify companies actively hiring freelance IT talent

#### Example: browse AWS projects within 50km of London, posted in the last 7 days

```json
{
  "mode": "projectSearch",
  "technologySlug": "amazon-web-services",
  "city": "London",
  "radiusKm": 50,
  "postedWithinDays": 7,
  "maxItems": 20
}
```

#### Example: browse available freelancers under €80/hr near Berlin

```json
{
  "mode": "freelancerSearch",
  "technologySlug": "python-programming-language",
  "city": "Berlin",
  "radiusKm": 50,
  "maxHourlyRate": 80,
  "maxItems": 20
}
```

### FAQ

**What is the data source?**
freelancermap.com, a German/European IT freelance marketplace connecting freelancers with freelance and permanent IT projects. This actor is an independent, third-party scraper and is not affiliated with or endorsed by freelancermap.

**How many results can I get per search?**
freelancermap.com shows anonymous (non-logged-in) visitors only the first results page per unique search/filter combination — roughly 18-22 records. To reach a different pool of results, change `searchQuery`, `category`, `remoteType`, or `contractType` rather than relying on deeper pagination.

**Why don't some freelancer listings show a name?**
Freelancers can choose whether their name appears on the public directory card. When hidden, only their profile headline is shown. Enable `requireDisplayedName` to skip these.

**Why is `budget` missing on most projects?**
Most freelance IT project posters on freelancermap don't disclose a budget publicly; the field is included only when the poster provided one.

**Is the rate hourly or daily?**
freelancermap freelancers set a single quoted rate on their profile; the platform doesn't separately expose whether it represents an hourly or daily figure in the public profile data, so this actor reports it as-is (`rate` + `rateCurrency`).

**Can I filter by skill or technology directly?**
Yes — set `technologySlug` to freelancermap's own tag slug (e.g. `python-programming-language`, `sap-hana`, `amazon-web-services`, `java-programming-language`). This is a more precise alternative to `category` and takes precedence over it when both are set.

**How does the `city` filter work?**
For `freelancerSearch`, `city` is sent as a query-string parameter directly to freelancermap.com's `/freelancer` endpoint (works reliably for any city, including German/Austrian/Swiss ones — tested against Berlin, London, Bangkok). For `projectSearch`, freelancermap's `/projects` endpoint does not honor `city` as a query-string parameter at all (it silently returns "No results" regardless of value) — instead this actor routes `city` through the URL path (`/projects/<city-slug>`, e.g. `/projects/berlin`, `/projects/münchen`). That URL path itself is also confirmed unreliable upstream (its own result-count header includes projects located in entirely different cities/countries — e.g. `/projects/berlin` returned Shropshire/Brüssel/Stettin listings with zero Berlin-located results), so this actor additionally re-checks the requested city against each project's own displayed city label client-side and drops any mismatch — a broken upstream filter never silently emits mismatched records. Because the URL path slot is shared with `category`/`technologySlug` and can't be nested with them upstream, `city` takes priority over `category`/`technologySlug` for `projectSearch` whenever both are set.

**What's the difference between `city` and `country`?**
`country` is a genuine, reliable server-side filter on both `/projects` and `/freelancer` (confirmed live: `country` set to United Kingdom returns exactly the count freelancermap's own page reports for that bucket, on both endpoints). `city` is less reliable — see the question above — so prefer `country` when a broader location filter is enough, and use `city`/`radiusKm` only when you need a specific metro area.

**Is there a workload (full-time/part-time) or project-start-date filter?**
No — freelancermap doesn't expose either as a public search filter for anonymous visitors. `workloadPercent` is still included on project detail records when the poster disclosed it, and `minDurationMonths` remains available as a client-side duration filter on project search.

**How fresh is the data?**
Every run fetches live pages directly from freelancermap.com — there is no caching layer.

**Do I need a freelancermap account, cookies, or a proxy?**
No. Every mode works against freelancermap's public pages with no login, no cookies, and no proxy configuration.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text keyword search, e.g. a skill, technology, or job title (mode=projectSearch / freelancerSearch).

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

Restrict results to one of freelancermap's top-level categories (mode=projectSearch / freelancerSearch).

## `remoteType` (type: `string`):

Filter projects by remote/on-site workplace (mode=projectSearch).

## `contractType` (type: `string`):

Filter projects by contract type (mode=projectSearch).

## `sortBy` (type: `string`):

Result ordering (mode=projectSearch / freelancerSearch).

## `minDurationMonths` (type: `integer`):

Drop projects whose listed duration is shorter than this many months (mode=projectSearch). Projects without a disclosed duration always pass through.

## `technologySlug` (type: `string`):

Filter by a single freelancermap skill/technology tag, e.g. `python-programming-language`, `java-programming-language`, `sap-hana`, `amazon-web-services` (mode=projectSearch / freelancerSearch). Accepts a bare slug or a full `/projects/<slug>` or `/freelancer/<slug>` URL. Occupies the same URL slot as `category` on freelancermap — if both are set, this takes precedence.

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

Filter by a city name, e.g. `London`, `Berlin` (mode=projectSearch / freelancerSearch). Combine with `radiusKm` to widen the catchment area.

## `radiusKm` (type: `integer`):

Search radius in kilometres around `city` (mode=projectSearch / freelancerSearch). Has no effect unless `city` is also set.

## `postedWithinDays` (type: `integer`):

Only include projects created within this many days (mode=projectSearch).

## `industry` (type: `string`):

Restrict projects to a client industry, e.g. IT, Finance, Automotive (mode=projectSearch). Curated list of the most common industries freelancermap tracks.

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

Restrict results to freelancers or projects based in this country (mode=projectSearch / freelancerSearch). Curated list of the most common countries freelancermap tracks (90 of 158+ observed) — a more precise alternative to `city`, which freelancermap's own endpoint doesn't reliably honor.

## `endClientOnly` (type: `boolean`):

Only include projects posted directly by the end client (excludes projects reposted by an agency/reseller) (mode=projectSearch).

## `includeDachRegion` (type: `boolean`):

freelancermap shows a smaller 'international' subset by default; enable this to include the much larger pool of Germany/Austria/Switzerland-region projects or freelancers too (mode=projectSearch / freelancerSearch).

## `maxHourlyRate` (type: `integer`):

Only include freelancers whose quoted hourly rate is at or below this value, in their local currency (mode=freelancerSearch).

## `updatedWithinDays` (type: `integer`):

Only include freelancer profiles updated within this many days (mode=freelancerSearch).

## `language` (type: `string`):

Only include freelancers who list this spoken language on their profile (mode=freelancerSearch).

## `maxDailyRate` (type: `integer`):

Only include freelancers whose quoted daily rate is at or below this value, in their local currency (mode=freelancerSearch).

## `requireDisplayedName` (type: `boolean`):

Some freelancer cards only show a headline (no name) until the freelancer opts in to display it. Enable to skip those (mode=freelancerSearch).

## `hasAttachmentsOnly` (type: `boolean`):

Only include freelancers who have uploaded a portfolio file or attachment to their profile (mode=freelancerSearch).

## `openToPermanentJobs` (type: `boolean`):

Only include freelancers who have indicated they're open to permanent-position offers, not just freelance contracts (mode=freelancerSearch).

## `openToAgencyContract` (type: `boolean`):

Only include freelancers who have indicated they're open to agency/employee-leasing contracts (mode=freelancerSearch).

## `excludeUnavailable` (type: `boolean`):

Drop freelancers who have marked themselves fully unavailable (mode=freelancerSearch).

## `recentlyActiveOnly` (type: `boolean`):

Only include freelancers with the most recently updated/active profiles (mode=freelancerSearch).

## `minAvailabilityPercent` (type: `integer`):

Only include freelancers whose self-reported availability is at least this percentage (e.g. 100 = fully available, 50 = at least partially available) (mode=freelancerSearch).

## `projectSlugsOrUrls` (type: `array`):

Full project URLs (e.g. `https://www.freelancermap.com/project/aws-data-engineer-...`) or bare slugs.

## `profileSlugsOrUrls` (type: `array`):

Full profile URLs (e.g. `https://www.freelancermap.com/profile/ryan-devlin`) or bare slugs.

## `minExperienceYears` (type: `integer`):

Drop freelancer profiles with fewer years of experience than this (mode=freelancerProfile). Profiles that don't disclose experience always pass through.

## `availableOnly` (type: `boolean`):

Only emit freelancer profiles marked fully available (mode=freelancerProfile).

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

Hard cap on emitted records. Note: freelancermap.com only exposes a single results page (roughly 18-22 records) to anonymous visitors per unique search/filter combination for the browse modes — narrow your filters to reach different result pools.

## Actor input object example

```json
{
  "mode": "projectSearch",
  "searchQuery": "python",
  "category": "",
  "remoteType": "",
  "contractType": "",
  "sortBy": "newest",
  "technologySlug": "",
  "city": "",
  "industry": "",
  "country": "",
  "endClientOnly": false,
  "includeDachRegion": false,
  "language": "",
  "requireDisplayedName": false,
  "hasAttachmentsOnly": false,
  "openToPermanentJobs": false,
  "openToAgencyContract": false,
  "excludeUnavailable": false,
  "recentlyActiveOnly": false,
  "projectSlugsOrUrls": [],
  "profileSlugsOrUrls": [],
  "availableOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped freelancermap projects and freelancer profiles.

# 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 = {
    "mode": "projectSearch",
    "searchQuery": "python",
    "category": "",
    "remoteType": "",
    "contractType": "",
    "sortBy": "newest",
    "technologySlug": "",
    "city": "",
    "industry": "",
    "country": "",
    "endClientOnly": false,
    "includeDachRegion": false,
    "language": "",
    "requireDisplayedName": false,
    "hasAttachmentsOnly": false,
    "openToPermanentJobs": false,
    "openToAgencyContract": false,
    "excludeUnavailable": false,
    "recentlyActiveOnly": false,
    "projectSlugsOrUrls": [],
    "profileSlugsOrUrls": [],
    "availableOnly": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/freelancermap-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 = {
    "mode": "projectSearch",
    "searchQuery": "python",
    "category": "",
    "remoteType": "",
    "contractType": "",
    "sortBy": "newest",
    "technologySlug": "",
    "city": "",
    "industry": "",
    "country": "",
    "endClientOnly": False,
    "includeDachRegion": False,
    "language": "",
    "requireDisplayedName": False,
    "hasAttachmentsOnly": False,
    "openToPermanentJobs": False,
    "openToAgencyContract": False,
    "excludeUnavailable": False,
    "recentlyActiveOnly": False,
    "projectSlugsOrUrls": [],
    "profileSlugsOrUrls": [],
    "availableOnly": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/freelancermap-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 '{
  "mode": "projectSearch",
  "searchQuery": "python",
  "category": "",
  "remoteType": "",
  "contractType": "",
  "sortBy": "newest",
  "technologySlug": "",
  "city": "",
  "industry": "",
  "country": "",
  "endClientOnly": false,
  "includeDachRegion": false,
  "language": "",
  "requireDisplayedName": false,
  "hasAttachmentsOnly": false,
  "openToPermanentJobs": false,
  "openToAgencyContract": false,
  "excludeUnavailable": false,
  "recentlyActiveOnly": false,
  "projectSlugsOrUrls": [],
  "profileSlugsOrUrls": [],
  "availableOnly": false,
  "maxItems": 20
}' |
apify call crawlerbros/freelancermap-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Freelancermap Scraper",
        "description": "Scrape freelancermap.com - Europe's IT freelance marketplace. Search freelance IT projects and freelancer profiles by category, workplace type, and contract type; fetch full project or freelancer profile details by URL.",
        "version": "1.0",
        "x-build-id": "kNf5GMn36dbkRHI8c"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~freelancermap-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-freelancermap-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/crawlerbros~freelancermap-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-freelancermap-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/crawlerbros~freelancermap-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-freelancermap-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": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "projectSearch",
                            "freelancerSearch",
                            "projectDetail",
                            "freelancerProfile"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "projectSearch"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text keyword search, e.g. a skill, technology, or job title (mode=projectSearch / freelancerSearch).",
                        "default": ""
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "",
                            "web-and-software-development",
                            "engineering",
                            "graphic-design-and-creative-services",
                            "management-and-consulting",
                            "digital-marketing",
                            "writing-and-translation-services",
                            "finance-and-accounting",
                            "research-and-analysis",
                            "it-services"
                        ],
                        "type": "string",
                        "description": "Restrict results to one of freelancermap's top-level categories (mode=projectSearch / freelancerSearch).",
                        "default": ""
                    },
                    "remoteType": {
                        "title": "Workplace type",
                        "enum": [
                            "",
                            "onsite",
                            "hybrid",
                            "remote"
                        ],
                        "type": "string",
                        "description": "Filter projects by remote/on-site workplace (mode=projectSearch).",
                        "default": ""
                    },
                    "contractType": {
                        "title": "Contract type",
                        "enum": [
                            "",
                            "contracting",
                            "permanent_position",
                            "employee_leasing"
                        ],
                        "type": "string",
                        "description": "Filter projects by contract type (mode=projectSearch).",
                        "default": ""
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "newest",
                            "relevant"
                        ],
                        "type": "string",
                        "description": "Result ordering (mode=projectSearch / freelancerSearch).",
                        "default": "newest"
                    },
                    "minDurationMonths": {
                        "title": "Min. project duration (months)",
                        "minimum": 0,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Drop projects whose listed duration is shorter than this many months (mode=projectSearch). Projects without a disclosed duration always pass through."
                    },
                    "technologySlug": {
                        "title": "Skill / technology tag slug",
                        "type": "string",
                        "description": "Filter by a single freelancermap skill/technology tag, e.g. `python-programming-language`, `java-programming-language`, `sap-hana`, `amazon-web-services` (mode=projectSearch / freelancerSearch). Accepts a bare slug or a full `/projects/<slug>` or `/freelancer/<slug>` URL. Occupies the same URL slot as `category` on freelancermap — if both are set, this takes precedence.",
                        "default": ""
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "Filter by a city name, e.g. `London`, `Berlin` (mode=projectSearch / freelancerSearch). Combine with `radiusKm` to widen the catchment area.",
                        "default": ""
                    },
                    "radiusKm": {
                        "title": "Radius around city (km)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Search radius in kilometres around `city` (mode=projectSearch / freelancerSearch). Has no effect unless `city` is also set."
                    },
                    "postedWithinDays": {
                        "title": "Posted within (days)",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only include projects created within this many days (mode=projectSearch)."
                    },
                    "industry": {
                        "title": "Industry",
                        "enum": [
                            "",
                            "24",
                            "1",
                            "9",
                            "7",
                            "8",
                            "2",
                            "10",
                            "14",
                            "3",
                            "22",
                            "6",
                            "12",
                            "18",
                            "21",
                            "5",
                            "11",
                            "23"
                        ],
                        "type": "string",
                        "description": "Restrict projects to a client industry, e.g. IT, Finance, Automotive (mode=projectSearch). Curated list of the most common industries freelancermap tracks.",
                        "default": ""
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "",
                            "28",
                            "29",
                            "31",
                            "32",
                            "33",
                            "2",
                            "159",
                            "36",
                            "38",
                            "39",
                            "43",
                            "150",
                            "45",
                            "46",
                            "81",
                            "49",
                            "50",
                            "86",
                            "51",
                            "87",
                            "88",
                            "147",
                            "133",
                            "52",
                            "54",
                            "173",
                            "27",
                            "55",
                            "169",
                            "56",
                            "14",
                            "58",
                            "1",
                            "165",
                            "60",
                            "12",
                            "69",
                            "70",
                            "156",
                            "72",
                            "74",
                            "8",
                            "77",
                            "82",
                            "84",
                            "197",
                            "90",
                            "93",
                            "94",
                            "95",
                            "96",
                            "99",
                            "153",
                            "98",
                            "104",
                            "106",
                            "189",
                            "152",
                            "107",
                            "110",
                            "184",
                            "111",
                            "112",
                            "113",
                            "114",
                            "115",
                            "117",
                            "6",
                            "119",
                            "149",
                            "124",
                            "15",
                            "126",
                            "129",
                            "7",
                            "128",
                            "120",
                            "3",
                            "158",
                            "131",
                            "134",
                            "135",
                            "5",
                            "11",
                            "143",
                            "4",
                            "139",
                            "141",
                            "142",
                            "151"
                        ],
                        "type": "string",
                        "description": "Restrict results to freelancers or projects based in this country (mode=projectSearch / freelancerSearch). Curated list of the most common countries freelancermap tracks (90 of 158+ observed) — a more precise alternative to `city`, which freelancermap's own endpoint doesn't reliably honor.",
                        "default": ""
                    },
                    "endClientOnly": {
                        "title": "Direct end-client projects only",
                        "type": "boolean",
                        "description": "Only include projects posted directly by the end client (excludes projects reposted by an agency/reseller) (mode=projectSearch).",
                        "default": false
                    },
                    "includeDachRegion": {
                        "title": "Include Germany/Austria/Switzerland (DACH) listings",
                        "type": "boolean",
                        "description": "freelancermap shows a smaller 'international' subset by default; enable this to include the much larger pool of Germany/Austria/Switzerland-region projects or freelancers too (mode=projectSearch / freelancerSearch).",
                        "default": false
                    },
                    "maxHourlyRate": {
                        "title": "Max. hourly rate",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Only include freelancers whose quoted hourly rate is at or below this value, in their local currency (mode=freelancerSearch)."
                    },
                    "updatedWithinDays": {
                        "title": "Profile updated within (days)",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only include freelancer profiles updated within this many days (mode=freelancerSearch)."
                    },
                    "language": {
                        "title": "Spoken language",
                        "enum": [
                            "",
                            "35",
                            "33",
                            "1",
                            "30",
                            "41",
                            "40",
                            "2",
                            "3",
                            "32",
                            "23",
                            "4",
                            "13",
                            "7",
                            "6",
                            "8",
                            "37",
                            "5",
                            "9",
                            "27",
                            "10",
                            "26",
                            "11",
                            "12",
                            "39",
                            "36",
                            "28",
                            "29",
                            "14",
                            "15",
                            "16",
                            "17",
                            "18",
                            "19",
                            "31",
                            "34",
                            "21",
                            "43",
                            "22",
                            "20",
                            "38",
                            "42",
                            "24",
                            "25"
                        ],
                        "type": "string",
                        "description": "Only include freelancers who list this spoken language on their profile (mode=freelancerSearch).",
                        "default": ""
                    },
                    "maxDailyRate": {
                        "title": "Max. daily rate",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Only include freelancers whose quoted daily rate is at or below this value, in their local currency (mode=freelancerSearch)."
                    },
                    "requireDisplayedName": {
                        "title": "Only freelancers with a public name",
                        "type": "boolean",
                        "description": "Some freelancer cards only show a headline (no name) until the freelancer opts in to display it. Enable to skip those (mode=freelancerSearch).",
                        "default": false
                    },
                    "hasAttachmentsOnly": {
                        "title": "Only profiles with a portfolio/attachment",
                        "type": "boolean",
                        "description": "Only include freelancers who have uploaded a portfolio file or attachment to their profile (mode=freelancerSearch).",
                        "default": false
                    },
                    "openToPermanentJobs": {
                        "title": "Only freelancers open to permanent positions",
                        "type": "boolean",
                        "description": "Only include freelancers who have indicated they're open to permanent-position offers, not just freelance contracts (mode=freelancerSearch).",
                        "default": false
                    },
                    "openToAgencyContract": {
                        "title": "Only freelancers open to agency/employee-leasing contracts",
                        "type": "boolean",
                        "description": "Only include freelancers who have indicated they're open to agency/employee-leasing contracts (mode=freelancerSearch).",
                        "default": false
                    },
                    "excludeUnavailable": {
                        "title": "Exclude fully unavailable freelancers",
                        "type": "boolean",
                        "description": "Drop freelancers who have marked themselves fully unavailable (mode=freelancerSearch).",
                        "default": false
                    },
                    "recentlyActiveOnly": {
                        "title": "Only recently active profiles",
                        "type": "boolean",
                        "description": "Only include freelancers with the most recently updated/active profiles (mode=freelancerSearch).",
                        "default": false
                    },
                    "minAvailabilityPercent": {
                        "title": "Min. availability (%)",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Only include freelancers whose self-reported availability is at least this percentage (e.g. 100 = fully available, 50 = at least partially available) (mode=freelancerSearch)."
                    },
                    "projectSlugsOrUrls": {
                        "title": "Project URLs or slugs (mode=projectDetail)",
                        "type": "array",
                        "description": "Full project URLs (e.g. `https://www.freelancermap.com/project/aws-data-engineer-...`) or bare slugs.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "profileSlugsOrUrls": {
                        "title": "Freelancer profile URLs or slugs (mode=freelancerProfile)",
                        "type": "array",
                        "description": "Full profile URLs (e.g. `https://www.freelancermap.com/profile/ryan-devlin`) or bare slugs.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "minExperienceYears": {
                        "title": "Min. years of experience",
                        "minimum": 0,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Drop freelancer profiles with fewer years of experience than this (mode=freelancerProfile). Profiles that don't disclose experience always pass through."
                    },
                    "availableOnly": {
                        "title": "Only currently available freelancers",
                        "type": "boolean",
                        "description": "Only emit freelancer profiles marked fully available (mode=freelancerProfile).",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on emitted records. Note: freelancermap.com only exposes a single results page (roughly 18-22 records) to anonymous visitors per unique search/filter combination for the browse modes — narrow your filters to reach different result pools.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
