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

Extract freelancermap.com IT and engineering projects: title, description, skills, category, contract type, company, location, remote arrangement, rate, and publish date. Search by keyword, country, or category.

- **URL**: https://apify.com/parsebird/freelancermap-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 projects

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### Freelancermap Scraper

Freelancermap Scraper extracts IT, engineering, and consulting **projects from freelancermap.com** — Europe's largest freelance-project marketplace — including title, full description, required skills, category, contract type, company, location, remote arrangement, rate, and publish date.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, country, category, contract type, or remote arrangement — or paste freelancermap URLs directly — and get clean, structured project data ready for lead generation, market research, or job-board integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Actor ID `parsebird/freelancermap-scraper` on Apify — call it with the `apify-client` SDK, e.g. `ApifyClient(token).actor("parsebird/freelancermap-scraper").call(run_input={"query": "SAP", "maxResults": 50})`; key inputs are `query` (string keyword, e.g. "Python developer"), `startUrls` (array of `{url}` for freelancermap search-result or individual project pages, takes priority over `query`), `country` (2-letter market code such as `de`, `uk`, `us`), `category` (one of `development`, `engineering`, `consulting`, `marketing`, `design`, `services`, `finance`, `innovation`, `content`), `contractType` (`contracting`, `permanent_position`, or `employee_leasing`), `remote` (`onsite`, `hybrid`, or `remote`), `excludeDach` (boolean, skips Germany/Austria/Switzerland), `maxDaysOld` (integer, 0 = no limit), `sort` (`newest` or `relevant`), and `maxResults` (integer, 0 = unlimited); output rows have `projectId`, `title`, `url`, `description`, `skills`, `category`, `contractType`, `company`, `location`, `remote`, `remotePercent`, `rate`, `publishedAt`, and more; full API spec is on the Apify Console API tab for this actor, and an Apify API token is required to call it programmatically.

#### What does Freelancermap Scraper do?

Freelancermap Scraper reads the same public project pages any visitor to [freelancermap.com](https://www.freelancermap.com) can see — no login, no session, no API key. It supports two ways to collect data:

- 🔍 **Keyword and filtered search** — search by a skill, role, or technology (e.g. `SAP`, `Python developer`, `project manager`) and narrow by country, category, contract type, remote arrangement, DACH exclusion, and posting age. Broad searches automatically pivot across categories and countries to gather more than freelancermap's own single-page result limit.
- 🔗 **Direct URLs** — paste one or more freelancermap project-search result URLs or individual project page URLs and scrape them directly, no keyword needed.

Other things it does:

- Enriches every listing with the **full project detail page** — complete skill list, plain-text description, exact duration and start date — not just the summary shown in search results.
- Runs on Apify's infrastructure with **scheduling**, **REST API access**, and native **JSON, CSV, Excel, HTML, and XML export**.
- Deduplicates results automatically across every search pivot, so you never get the same project twice in one run.
- Skips broken URLs and non-freelancermap links automatically, logging a warning instead of failing the whole run.
- Uses no browser and no proxy by default — freelancermap's project pages are plain server-rendered HTML, so runs are fast and cheap.

#### What data can you extract from freelancermap.com?

| Field | Description |
|-------|-------------|
| `title` / `description` | Project title and full plain-text description |
| `skills` | Required skills, keywords, and tags |
| `category` | freelancermap's project category (e.g. Web and Software Development) |
| `contractType` | Contractor / freelance, Permanent position, or Employee leasing |
| `company` / `companyType` | Posting company and whether it's a direct client or an agency |
| `location` / `city` / `country` | Where the project is based |
| `remote` / `remotePercent` | Remote arrangement label and numeric percentage |
| `startDate` / `duration` | When the project starts and how long it runs |
| `rate` | Hourly / daily rate when disclosed ("On request" otherwise) |
| `publishedAt` | When the project was posted |
| `referenceNumber` | The poster's original reference number, when the project was syndicated from another job board |

#### How to scrape freelancermap.com with Freelancermap Scraper

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Enter a keyword, or add one or more filters — country, category, contract type, remote arrangement.
3. Optionally paste specific freelancermap URLs instead of searching.
4. Click **Start** and watch results land in the dataset in real time.
5. Export results as JSON, CSV, or Excel, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2).

#### How much does it cost to scrape freelancermap.com?

This Actor uses **pay-per-event pricing** — you pay only for results, not for compute time.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| `project-scraped` | $0.00399 | **$3.99** |

A `project-scraped` event fires once for every project saved, whether it came from a keyword search or a pasted URL. Scraping 500 projects costs about $2.00. Apify's monthly platform usage credits apply to this Actor like any other.

#### Input and output

Configure the run from the **Input** tab: enter a keyword, add filters, or paste URLs. See the JSON example below, or use the visual form in Apify Console.

```json
{
  "query": "SAP",
  "country": "de",
  "category": "development",
  "contractType": "contracting",
  "remote": "remote",
  "maxDaysOld": 14,
  "maxResults": 100
}
```

Output example (one project result):

```json
{
  "projectId": "3049663",
  "title": "IAM - ONE IDENTITY MANAGER - INDIA LOCATED",
  "url": "https://www.freelancermap.com/project/iam-one-identity-manager-india-located",
  "skills": ["IAM", "Identity Management", "SAP ERP", "SAP Ariba"],
  "category": "Management and Consulting",
  "contractType": "Contractor / freelance",
  "company": "A-SAP",
  "companyType": "Agency / intermediary",
  "location": "London, United Kingdom",
  "country": "United Kingdom",
  "remote": "Hybrid (20% remote)",
  "remotePercent": 20,
  "startDate": "asap",
  "rate": "On request",
  "publishedAt": "2026-09-18T16:46:55+02:00"
}
```

Download results in JSON, HTML, CSV, or Excel from the **Storage** tab, or fetch them via the [dataset API endpoint](https://docs.apify.com/api/v2#/reference/datasets).

##### Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/freelancermap-scraper").call(run_input={
    "query": "developer",
    "country": "de",
    "remote": "remote",
    "maxResults": 100,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["company"], item["rate"])
```

##### JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/freelancermap-scraper').call({
    startUrls: [{ url: 'https://www.freelancermap.com/projects?query=kubernetes&countries[0]=4' }],
    maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].title, items[0].skills);
```

#### Is it legal to scrape freelancermap.com?

Freelancermap Scraper only collects data that freelancermap already publishes on public project pages without requiring a login. Scraping publicly available data is generally legal, but you're responsible for how you use the data — check [freelancermap's Terms of Service](https://www.freelancermap.com/term-and-conditions.html) and read Apify's [guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) before running large or commercial scrapes.

#### Other job and freelance scrapers

- [Freelancer.com Scraper](https://apify.com/parsebird/freelancer-com-scraper) — general freelance marketplace projects and bids
- [Totaljobs Scraper](https://apify.com/parsebird/totaljobs-scraper) — UK job listings from Totaljobs / StepStone
- [Cadremploi.fr Jobs Scraper](https://apify.com/parsebird/cadremploi-fr-jobs-scraper) — French executive and professional job listings
- [Djinni Jobs Scraper](https://apify.com/parsebird/djinni-jobs-scraper) — tech job listings from Djinni

#### FAQ

**Do I need a freelancermap account to use this Actor?**
No. It only reads public project pages that freelancermap serves to logged-out visitors.

**Why did I get fewer results than my Max results setting?**
freelancermap only returns one page (~20-22 projects) per exact filter combination — it doesn't support deeper pagination. When you leave a filter open (e.g. no country or no category), this Actor automatically explores every category and country to gather more results; when you pin every filter yourself, only that one combination's results are available.

**Why does a project's category sometimes not match the category I filtered by?**
freelancermap classifies each project against multiple categories with a relevance score. The `category` field reports the project's best-matching (primary) category, but the category filter itself matches more broadly — a project can appear in a category-filtered search even if that category isn't its primary one.

**Why is `category` or `referenceNumber` missing for some results?**
Both fields only come from freelancermap's search-result listings, not from the individual project page itself. If you paste a direct project URL in `startUrls` rather than reaching it through a search, freelancermap simply doesn't expose those two fields on that page.

**Can I schedule this to run automatically?**
Yes. Use Apify's built-in [Task Scheduler](https://docs.apify.com/platform/schedules) to run it daily, weekly, or at any interval, and connect it to Zapier, Make, or a webhook for downstream integrations.

**Something looks wrong or missing — how do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console, or use the **API** tab to inspect the exact request/response for your run.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/freelancermap-scraper/changelog.md

# Actor input Schema

## `query` (type: `string`):

A skill, role, or technology to search by, e.g. SAP, Python developer, or project manager. Leave empty to list all projects.

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

Paste freelancermap project-search result URLs or individual project page URLs to scrape them directly. When set, this takes priority over the keyword search below.

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

Limit results to projects located in one country.

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

Limit results to one project category.

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

Limit results to one engagement type.

## `remote` (type: `string`):

Limit results by how much of the work is remote. Projects with no stated remote percentage are treated as onsite.

## `excludeDach` (type: `boolean`):

Skip projects located in the DACH region and focus on international / English-language projects.

## `maxDaysOld` (type: `integer`):

Only include projects published within this many days. Set to 0 for no age limit.

## `sort` (type: `string`):

Order results by publish date or by relevance to the keyword.

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

Maximum number of projects to return. Set to 0 for unlimited. Broad searches automatically explore categories and countries to gather more results, since freelancermap only exposes the first page of each individual search.

## Actor input object example

```json
{
  "query": "SAP",
  "startUrls": [],
  "country": "",
  "category": "",
  "contractType": "",
  "remote": "",
  "excludeDach": false,
  "maxDaysOld": 0,
  "sort": "newest",
  "maxResults": 50
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "SAP",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "query": "SAP",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/freelancermap-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 '{
  "query": "SAP",
  "maxResults": 50
}' |
apify call parsebird/freelancermap-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/freelancermap-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/j6B6HuGjueENUzLHv/builds/LO2QK26v5TiDcn5PK/openapi.json
