# Freelancer.com Scraper (`unfenced-group/freelancercom-scraper`) Actor

Scrape Freelancer.com projects — all 100+ categories. Filter by keyword, skill, category, budget, language or date. 25+ output fields. No proxy, no API key needed. Cheapest option on the market.

- **URL**: https://apify.com/unfenced-group/freelancercom-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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

## Freelancer.com Scraper

![Freelancer.com Scraper](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/freelancercom-scraper)

Extract project listings from Freelancer.com — the world's largest freelance marketplace with 6,700+ active projects posted across every category. Filter by keyword, skill, category, budget, language, or date. **No API key, no proxy, and no account required.**

***

### Why this scraper?

#### 🌍 Full platform coverage — all 100+ categories

Scrapes every active project across all categories: IT & Software, Design, Writing, Engineering, Sales, Trades & Services, AI, and more. No category is off-limits.

#### 🔍 Richest output in its class

Returns 28+ structured fields per project — including bid count, average bid, bidding deadline, sealed/NDA/IP-contract flags, escrow status, hourly commitment, duration, skill categories, and more. Competitors return 8–12 fields.

#### 💸 Cheapest option — no proxy overhead

The platform's public API works directly from datacenter IPs. No residential proxy costs are passed through — ever. Our competitors explicitly warn users to purchase proxies separately.

#### ⚡ Fast — 1,000 projects in ~5 minutes

Retrieves 100 projects per request with no browser required. Scales to the full platform (6,700+ projects) in under 35 minutes.

#### 🔄 Daily feed ready

Built-in cross-run deduplication with a 90-day fingerprint cache. Run on a schedule with `daysOld: 1` + `skipReposts: true` to receive only new projects daily.

#### 🛡️ Self-healing architecture

Automatic retry with exponential backoff, circuit breaker, and per-run health monitoring. Every run writes HEALTH and OUTPUT keys to the key-value store.

***

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | String | `""` | Keyword(s) to search across project titles and descriptions |
| `jobIds` | Array | `[]` | Skill IDs to filter by (e.g. `[190]` for Automotive, `[7]` for JavaScript). Empty = all skills |
| `categoryIds` | Array | `[]` | Category IDs (e.g. `[5]` for Engineering & Science). Empty = all categories |
| `projectType` | String | `"all"` | `"all"`, `"fixed"`, or `"hourly"` |
| `budgetMin` | Integer | — | Only include projects with a budget ≥ this value (project's native currency) |
| `budgetMax` | Integer | — | Only include projects with a budget ≤ this value |
| `languages` | Array | `[]` | Language filter (e.g. `["en"]`, `["en","de"]`). Empty = all languages |
| `maxResults` | Integer | `100` | Maximum number of projects to return |
| `fetchDetails` | Boolean | `false` | Fetch full description and owner location per project (one extra API call per project) |
| `daysOld` | Integer | `0` | Only return projects posted within N days. `0` = no date filter |
| `skipReposts` | Boolean | `false` | Skip projects already seen in previous runs (90-day cache) |
| `startUrls` | Array | `[]` | Specific Freelancer.com search or category URLs to scrape |
| `requestDelayMs` | Integer | `500` | Delay between API requests in milliseconds |
| `respectRobotsTxt` | Boolean | `true` | Apply crawl-delay from robots.txt if present |

#### Skill ID reference (common values)

| ID | Skill | Category |
|----|-------|----------|
| 3 | PHP | IT & Software |
| 7 | JavaScript | IT & Software |
| 17 | Website Design | IT & Software |
| 20 | Graphic Design | Design |
| 21 | Copywriting | Writing |
| 26 | Python | IT & Software |
| 38 | SEO | IT & Software |
| 64 | Sales | Sales & Marketing |
| 190 | Automotive | Engineering & Science |
| 844 | Machine Learning | IT & Software |
| 1023 | Digital Marketing | IT & Software |
| 2228 | Automotive Engineering | Engineering & Science |

#### Category ID reference

| ID | Category |
|----|----------|
| 1 | Websites, IT & Software |
| 2 | Writing & Content |
| 3 | Design, Media & Architecture |
| 4 | Data Entry & Admin |
| 5 | Engineering & Science |
| 6 | Sales & Marketing |
| 7 | Business, Accounting, HR & Legal |
| 8 | Product Sourcing & Manufacturing |
| 9 | Mobile Phones & Computing |
| 10 | Translation & Languages |
| 12 | Trades & Services |
| 100 | Freight, Shipping & Transportation |
| 104 | Artificial Intelligence |

***

### Output schema

#### Always present

| Field | Type | Description |
|-------|------|-------------|
| `id` | Number | Freelancer.com project ID |
| `title` | String | Project title |
| `url` | String | Full URL to the project page |
| `type` | String | `"fixed"` or `"hourly"` |
| `subStatus` | String | Platform sub-status (null if not set) |
| `budgetMin` | Number | Minimum budget in the project's currency (null if not set) |
| `budgetMax` | Number | Maximum budget in the project's currency (null if not set) |
| `currency` | String | ISO currency code (USD, EUR, AUD, GBP, INR, etc.) |
| `hourlyCommitmentHours` | Number | For hourly projects: required hours per week (null if fixed) |
| `hourlyCommitmentInterval` | String | For hourly projects: commitment period (`"week"`, null if fixed) |
| `hourlyDuration` | String | For hourly projects: duration classification (e.g. `"unspecified"`, null if fixed) |
| `skills` | Array | Skill/job names attached to the project |
| `skillCategories` | Array | Unique top-level category names across all attached skills (e.g. `["Websites, IT & Software", "Mobile Phones & Computing"]`) |
| `category` | String | Primary category name (from the first attached skill) |
| `previewDescription` | String | ~200-character description snippet |
| `bidCount` | Number | Number of bids placed on this project |
| `bidAvg` | Number | Average bid amount (null if no bids yet) |
| `bidPeriodDays` | Number | How many days the bidding window is open (typically 7) |
| `biddingDeadline` | String | ISO 8601 timestamp when bidding closes |
| `postedAt` | String | ISO 8601 posting timestamp |
| `updatedAt` | String | ISO 8601 last-updated timestamp |
| `language` | String | Project language code (`"en"`, `"de"`, `"es"`, etc.) |
| `frontendStatus` | String | Display status as shown on the platform |
| `isRepost` | Boolean | `true` if this is a reposted project (accurate only with `fetchDetails: true`) |
| `isFeatured` | Boolean | `true` if the project has the Featured upgrade |
| `isUrgent` | Boolean | `true` if the project has the Urgent upgrade |
| `isSealed` | Boolean | `true` if bids are hidden from other bidders |
| `isNDA` | Boolean | `true` if an NDA is required to bid |
| `isQualified` | Boolean | `true` if only verified freelancers may bid |
| `isIPContract` | Boolean | `true` if an IP ownership contract is required |
| `isEscrow` | Boolean | `true` if payment is held in escrow |
| `isBuyerKYCRequired` | Boolean | `true` if the buyer must complete identity verification |
| `isSellerKYCRequired` | Boolean | `true` if bidders must complete identity verification |
| `isHireMe` | Boolean | `true` if this is a direct hire / HireMe project |
| `isLocal` | Boolean | `true` if the project requires in-person work |
| `changeStatus` | String | `"NEW"` or `"SEEN"` (when `skipReposts: true`) |
| `contentHash` | String | 12-character MD5 fingerprint for cross-run deduplication |

#### With `fetchDetails: true`

| Field | Type | Description |
|-------|------|-------------|
| `description` | String | Full project description text |
| `descriptionMarkdown` | string | Description in Markdown/plain text. |
| `countryCode` | String | ISO country code of the project owner (null if not disclosed) |
| `city` | String | City of the project owner (null if not disclosed) |
| `isRepost` | Boolean | Accurate repost flag (fetched from detail endpoint) |

#### Example output record

```json
{
  "id": 40411253,
  "title": "Build a React dashboard for logistics tracking",
  "url": "https://www.freelancer.com/projects/javascript/Build-React-dashboard-logistics",
  "type": "fixed",
  "subStatus": null,
  "budgetMin": 250,
  "budgetMax": 750,
  "currency": "USD",
  "hourlyCommitmentHours": null,
  "hourlyCommitmentInterval": null,
  "hourlyDuration": null,
  "skills": ["React.js", "JavaScript", "Node.js", "API"],
  "skillCategories": ["Websites, IT & Software"],
  "category": "Websites, IT & Software",
  "previewDescription": "We need a React dashboard for real-time shipment tracking from our logistics API...",
  "bidCount": 18,
  "bidAvg": 487.50,
  "bidPeriodDays": 7,
  "biddingDeadline": "2026-05-08T08:34:21.000Z",
  "postedAt": "2026-05-01T08:34:21.000Z",
  "updatedAt": "2026-05-01T08:34:21.000Z",
  "language": "en",
  "frontendStatus": "open",
  "isRepost": false,
  "isFeatured": false,
  "isUrgent": true,
  "isSealed": false,
  "isNDA": false,
  "isQualified": false,
  "isIPContract": false,
  "isEscrow": false,
  "isBuyerKYCRequired": false,
  "isSellerKYCRequired": false,
  "isHireMe": false,
  "isLocal": false,
  "changeStatus": "NEW",
  "contentHash": "a3f1c8e2d094"
}
```

**Hourly project example (new fields):**

```json
{
  "type": "hourly",
  "hourlyCommitmentHours": 40,
  "hourlyCommitmentInterval": "week",
  "hourlyDuration": "unspecified",
  "skillCategories": ["Websites, IT & Software", "Mobile Phones & Computing"]
}
```

***

### Examples

**All new projects from the last 24 hours (daily feed):**

```json
{
  "daysOld": 1,
  "skipReposts": true,
  "maxResults": 500
}
```

**Fixed-price web design projects under $500:**

```json
{
  "searchQuery": "landing page",
  "projectType": "fixed",
  "budgetMax": 500,
  "maxResults": 100
}
```

**Hourly IT projects with full descriptions:**

```json
{
  "categoryIds": [1],
  "projectType": "hourly",
  "languages": ["en"],
  "fetchDetails": true,
  "maxResults": 50
}
```

**Automotive engineering projects — all types:**

```json
{
  "jobIds": [190, 2228],
  "maxResults": 100,
  "fetchDetails": true
}
```

***

### 💰 Pricing

**$0.99 per 1,000 results** — you only pay for successfully retrieved projects.
Failed retries and filtered duplicates are never charged.

| Results | Cost |
|---------|------|
| 100 | ~$0.10 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.90 |
| 100,000 | ~$99.00 |

> Competing actors charge $1.00–$5.00 per 1,000 results and require you to pay for residential proxies on top. This actor needs no proxy.

***

### Performance

| Mode | Items | Approximate time |
|------|-------|-----------------|
| `fetchDetails: false` | 1,000 | ~5–6 min |
| `fetchDetails: false` | Full platform (6,700+) | ~30–35 min |
| `fetchDetails: true` | 500 | ~10–15 min |

***

### Known limitations

- Projects marked `nonpublic` (client-hidden) are excluded by the platform
- Budget amounts are in the project's native currency — no conversion
- Owner country/city only available with `fetchDetails: true` and only if the owner has disclosed them
- `isRepost` is reliably populated only with `fetchDetails: true` (the list endpoint does not expose repost metadata for anonymous requests)
- The platform has ~6,700–7,000 active projects at any given time

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

### Related scrapers

Other scrapers in our **Jobs — Finance & Specialist** collection:

- [eFinancialCareers Scraper](https://apify.com/unfenced-group/efinancialcareers-scraper)
- [TheLadders.Com Job Scraper](https://apify.com/unfenced-group/theladders-scraper)
- [Workday.com Scraper](https://apify.com/unfenced-group/workday-scraper)
- [TheHub.io Scraper](https://apify.com/unfenced-group/thehub-io-scraper)

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Technical details

- **Coverage:** everything the public search exposes, filterable via the input parameters above
- **Retry:** automatic retry on network errors with exponential backoff
- **Formats:** results export to JSON, CSV and Excel from the dataset

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keyword(s) to search across project titles and descriptions (e.g. 'React dashboard', 'logo design', 'car wrap').

## `jobIds` (type: `array`):

Filter by Freelancer.com skill IDs. Common: PHP=3, Web Design=17, Graphic Design=20, Python=26, JavaScript=7, Automotive=190, Machine Learning=844. Leave empty for all skills.

## `categoryIds` (type: `array`):

Filter by category. IT & Software=1, Writing=2, Design=3, Data Entry=4, Engineering=5, Sales=6, Business=7, Manufacturing=8, Mobile=9, Translation=10, Trades=12, Freight=100, AI=104. Leave empty for all.

## `projectType` (type: `string`):

Filter by project type.

## `budgetMin` (type: `integer`):

Only include projects with a maximum budget at or above this value (in the project's native currency). Leave empty to disable.

## `budgetMax` (type: `integer`):

Only include projects with a maximum budget at or below this value (in the project's native currency). Leave empty to disable.

## `languages` (type: `array`):

Filter by project language. Examples: \['en'] for English only, \['en','de'] for English and German. Leave empty for all languages.

## `fetchDetails` (type: `boolean`):

ON: fetches full job description, salary, company info, and all details. OFF: returns basic listing info only (faster, lower cost).

## `daysOld` (type: `integer`):

Only return projects posted within this many days. Set to 0 to disable date filtering.

## `skipReposts` (type: `boolean`):

Skip projects already seen in previous runs (cross-run deduplication using a persistent 90-day fingerprint cache).

## `requestDelayMs` (type: `integer`):

Delay between API requests in milliseconds. Increase if you encounter rate limiting.

## `respectRobotsTxt` (type: `boolean`):

Check robots.txt for crawl-delay directives and apply them.

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

Optional list of specific Freelancer.com search or category URLs to scrape. When provided, overrides searchQuery.

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

Maximum number of projects to return.

## Actor input object example

```json
{
  "searchQuery": "developer",
  "jobIds": [],
  "categoryIds": [],
  "projectType": "all",
  "languages": [],
  "fetchDetails": false,
  "skipReposts": false,
  "requestDelayMs": 500,
  "respectRobotsTxt": true,
  "startUrls": [],
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "developer",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/freelancercom-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 = {
    "searchQuery": "developer",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/freelancercom-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 '{
  "searchQuery": "developer",
  "maxItems": 100
}' |
apify call unfenced-group/freelancercom-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/freelancercom-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/oOVcldhBnwuIZzYKY/builds/f4FDUwXxGL6bwUeg7/openapi.json
