Freelancer.com Scraper - Jobs, Profiles & Contests
Pricing
from $1.10 / 1,000 results
Freelancer.com Scraper - Jobs, Profiles & Contests
Collect public jobs, freelancer profiles, contests, and services from Freelancer.com worldwide. Get budgets, bids, rates, skills, and URLs; pay per delivered row plus a start fee.
Pricing
from $1.10 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
0
Monthly active users
13 hours ago
Last modified
Categories
Security
Limited permissionsShare
Freelancer.com Scraper
Collect public jobs, freelancers, contests, services, and profiles from Freelancer.com's global marketplace as rows you can export.
- Find projects by skill or keyword, with budgets, bid counts, and descriptions.
- Compare freelancer rates, reviews, skills, and public profile information.
- Track active contests and fixed-price services.
- Add public bids or contest entries as separate rows when needed.
- Pay only for the rows you receive: $1.50 per 1,000 rows on the Free plan plus a small start fee.
What does Freelancer.com Scraper do?
Freelancer.com Scraper collects public marketplace records from www.freelancer.com. Use it for project monitoring, talent sourcing, or pricing research. It is unofficial and is not affiliated with Freelancer.com.
- Jobs: use
skillsto search projects;projectTypesfilters fixed-price or hourly work. - Freelancers: select
freelancersand supplyskillsfor directory listings. - Profiles: supply
usernamesfor specific public profiles. - Contests: select
contestsfor active contests; skill filters do not apply. - Services: select
servicesfor fixed-price offerings, optionally with a search phrase inskills. - Optional rows:
includeBidsadds bids in jobs mode;includeEntriesadds contest entries. Both are off by default. Each added row is billed like any other row and uses the same row allowance.
What data can you extract from Freelancer.com?
Rows include recordType, id, and scrapedAt. Available fields depend on the mode and what the source publishes. title identifies the project, contest, service, or profile headline.
Jobs (job)
| Field | Description | Example |
|---|---|---|
projectUrl | Public project link | https://www.freelancer.com/projects/python/example-project |
budgetRange | Budget with currency when shown | $250 – $750 USD |
avgBid | Average bid amount | 420 |
bidCount | Source-reported bid total | 18 |
skills | Listed skill tags | ["Python", "Automation"] |
Freelancer directory (freelancer)
| Field | Description | Example |
|---|---|---|
hourlyRate | Rate text shown on the listing | $25 USD / hour |
reviewCount | Public review count | 42 |
score | Public rating | 4.9 |
location | Public location text | London, United Kingdom |
Public profiles (profile)
| Field | Description | Example |
|---|---|---|
username | Public account name | exampleuser |
profileUrl | Public profile link | https://www.freelancer.com/u/exampleuser |
hourlyRateAmount | Numeric rate, without an assured currency | 25 |
joinedAt | Registration timestamp when available | 2020-01-15T00:00:00+00:00 |
profileClosed | Whether the profile is marked closed | false |
Contests (contest)
| Field | Description | Example |
|---|---|---|
contestUrl | Public contest link | https://www.freelancer.com/contest/example-design-1234567.html |
prize | Numeric prize amount | 100 |
entryCount | Source-reported entry total | 24 |
status | Contest status | active |
Services (service)
| Field | Description | Example |
|---|---|---|
serviceId | Service identifier | 12345 |
price | Formatted service price | $50 USD |
baseDuration | Duration value supplied by Freelancer.com | 3 |
Bids (bid)
| Field | Description | Example |
|---|---|---|
bidId | Bid identifier | 123456 |
projectId | Parent project identifier | 12345678 |
amount | Public bid amount, when disclosed | 250 |
sealed | Whether bid contents are hidden | true |
Contest entries (entry)
| Field | Description | Example |
|---|---|---|
entryId | Entry identifier | 123456 |
contestId | Parent contest identifier | 1234567 |
files | Public file names supplied for the entry | ["example-design.png"] |
Bid rows also carry the parent projectUrl; entry rows carry contestUrl. Source totals such as bidCount and entryCount are not the number of child rows delivered.
How to scrape Freelancer.com
- Open Freelancer.com Scraper in Apify Console. A free Apify account is enough to try it.
- Enter a skill such as
pythoninskills. - Set
maxItemsto5for your first run. - Click Start and wait for the run to finish.
- Download the dataset or read the rows through the API.
Empty input starts an example jobs run using the form's python sample, limited to 3 rows. Normal start and row charges apply. With mode set to auto, skills selects jobs and usernames selects profiles. If both are supplied, usernames take priority and skills are ignored.
Jobs
Use skills for keywords or skill names. Explicit jobs mode with no skills lists public projects without a keyword filter. expandPools widens a skill search to related categories and can include neighbouring skills.
Freelancers
Set mode to freelancers and enter at least one skill. enrichProfiles adds available public profile fields to directory rows, up to maxDetailItems. Do not leave skills empty for this mode.
Profiles
Enter usernames, not profile URLs, in usernames. Explicit profiles mode without usernames stops with an input error. A username returns its public profile, not multiple rows simply because the row allowance is larger.
Contests
Set mode to contests; no target is needed. skills is ignored. scrapeDetails adds available contest details; includeEntries requests separate entry rows.
Services
Set mode to services. Leave skills empty to list active services, or enter a search phrase. Available seller information can be added when enrichProfiles or scrapeDetails is enabled.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | auto, jobs, freelancers, profiles, contests, or services | auto |
skills | Up to 10 skills or search phrases; required for freelancers, ignored for contests | Empty; form sample python |
usernames | Up to 50 public usernames for profiles | Empty |
maxItems | Rows per skill, keyword, or username; 1–500 | 70; form sample 3 |
maxPages | Directory pages to visit in freelancers mode; 1–50 | 1 |
projectTypes | Jobs only: fixed or hourly | Empty |
scrapeDetails | Add contest details and available service seller information | true |
maxDetailItems | Detail/enrichment limit and number of parent rows eligible for bids or entries; 0–50 | 5 |
enrichProfiles | Add public profile fields to directory rows and available service seller information | true |
expandPools | Jobs only: extend searches to related skill categories | false |
includeBids | Jobs only: add public bids as rows | false |
includeEntries | Contests only: add public entries as rows | false |
Jobs:
{"skills": ["python"], "projectTypes": ["fixed"], "maxItems": 5}
Freelancers:
{"mode": "freelancers", "skills": ["python"], "maxItems": 5}
Profiles (replace the placeholder with a real username):
{"usernames": ["exampleuser"], "maxItems": 1}
Contests with optional entry rows:
{"mode": "contests", "includeEntries": true, "maxItems": 5}
Services:
{"mode": "services", "skills": ["logo design"], "maxItems": 5}
maxItemsis the canonical row limit;maxResultsandlimitare accepted aliases.keywords,keyword,search,query, andsearchTermsare aliases forskills.- Unknown field names do not themselves fail the run. Close misspellings are corrected; other unknown fields are ignored with a note. Invalid filters such as a non-numeric
maxPagesare ignored rather than stopping the run. - Missing required targets stop before collection or row charges. For example:
INVALID_INPUT: usernames — mode profiles needs at least one username. A start fee can still apply. - Each run writes
INPUT_REPORTto its key-value store, showing fields filled, corrected, inferred, or ignored.
Output example
Illustrative jobs row; values and links are examples, not a live result:
{"recordType": "job","id": "12345678","title": "Python automation project","projectUrl": "https://www.freelancer.com/projects/python/example-project","skills": ["Python", "Automation"],"currency": "USD","budgetMin": 250,"budgetMax": 750,"avgBid": 420,"bidCount": 18,"scrapedAt": "2026-10-24T00:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. RUN_SUMMARY in the key-value store records the delivered row count and any collection warnings.
Why use this Freelancer.com scraper?
- Pay per delivered row. Rows written to the dataset are billed, not pages attempted.
- Keep available results. Rows already written remain in the dataset. When collection ends early with usable rows, the Actor can deliver those partial results; a forced stop before delivery does not guarantee unsaved rows.
- Several inputs. Supply multiple skills or usernames in one run, with a row allowance for each input.
- No guessed contact details. Unavailable values stay empty or are omitted;
leadAbsencesexplains missing contact fields. - No account setup on Freelancer.com. You do not need cookies or a Freelancer.com login. You do not need to set up proxies.
How much does it cost to scrape Freelancer.com?
The Actor uses pay-per-event pricing: $0.005 per start event plus a price per delivered row. Start billing is one event per GB of memory, with a minimum of one event. The default 512 MB allocation therefore costs $0.005 to start. Platform usage is included in these prices.
| Apify plan | Price per row | Price per 1,000 rows |
|---|---|---|
| Free | $0.0015 | $1.50 |
| Starter | $0.0015 | $1.50 |
| Scale | $0.0013 | $1.30 |
| Business | $0.0011 | $1.10 |
maxItemsapplies to each input, with a default of 70 and a maximum of 500. Larger requests are collected in parts. Source availability and other limits can reduce the delivered count.- Parent rows, bids, and entries share that allowance. For example, one job plus four bids uses all five rows of
maxItems: 5. - Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. These limits are set by the Actor developer.
- The whole run stops at your Maximum cost per run, set with
maxTotalChargeUsdin the API.
Example: 3 skills with 5 rows each deliver 15 rows. On the Free plan at 512 MB, the charge is 15 × $0.0015 + $0.005 = $0.0275, assuming all 15 rows are delivered.
What happens when the run timeout is too short
If collection needs longer than the chosen timeout, the Actor can pause rather than fail. Its message reads "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The run temporarily appears as ABORTED.
When results are ready, the same run resumes, writes to the same dataset, and can finish as SUCCEEDED. Rows already delivered are skipped rather than delivered or charged twice. On resumed delivery with previously saved rows, the message reads "Resumed: delivering N rows."
- Automatic pauses are limited to 3 per run. Keep the default timeout of 3600 seconds to reduce the need for them.
- A pause is not a guarantee that collection will succeed. A timeout with no usable rows can still fail.
- Synchronous API endpoints (
run-sync,run-sync-get-dataset-items) wait at most 300 seconds and can return an empty dataset during a pause. For longer jobs, start asynchronously and read the dataset afterSUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server (Claude, ChatGPT, Cursor, VS Code)
Add this Actor to an MCP client that supports remote servers:
https://mcp.apify.com?tools=lentic_clockss/freelancer-scraper
Sign in with Apify when prompted through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; the agent can read rows with get-dataset-items.
Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/freelancer-scraper, with APIFY_TOKEN set.
Example prompt: "Find 5 public Python projects on Freelancer.com and compare their budgets and bid counts."
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/freelancer-scraper").call(run_input={"skills": ["python"], "maxItems": 5})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/freelancer-scraper').call({skills: ['python'], maxItems: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~freelancer-scraper/runs with Authorization: Bearer <YOUR_APIFY_TOKEN>. Read results using GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook through the Actor's Integrations tab. Use Apify Schedules for recurring runs.
FAQ
Is it legal to scrape Freelancer.com?
This Actor collects public data only. You are responsible for complying with Freelancer.com's terms and applicable data protection law. Public availability does not remove those obligations; processing personal data needs a lawful basis.
Why did my run end as ABORTED?
It may be temporarily paused for automatic resumption. Check for the queued/resume message described above. A manually aborted run or another failure is not the same as an automatic pause.
How many results can I get?
maxItems allows 1–500 rows per input. Available records, the total charge limit, and free-plan limits can stop collection sooner. Increasing the allowance does not create more matching records.
Why are some fields empty?
Not every record publishes the same information. Detail and profile enrichment can add public fields, but cannot supply private contacts. Sealed bid amounts and descriptions remain absent when hidden.
Is login required?
No. Only public data is collected; private inboxes and account-only information are excluded.
Can it place bids or hire freelancers?
No. It reads public records and does not bid, hire, message users, or make payments.
What is the difference between jobs and freelancers?
Jobs are projects looking for talent. Freelancers are directory listings of people offering services. Use profiles when you already know their usernames.
Can I treat every hourly rate as the same currency?
No. Directory hourlyRate text can include currency, while profile hourlyRate and hourlyRateAmount are bare numbers. Do not assume a profile's primaryCurrency is the currency of that rate.
Limitations
- Coverage is the public global Freelancer.com site, not private account data or guaranteed exhaustive marketplace coverage.
- Freelancer directory searches need skills; contest searches cannot be filtered by skill.
maxPagescontrols directory paging, not all collection modes. maxDetailItemslimits enrichment and parent rows eligible for child collection. Setting it to0prevents bid and entry collection even when their switches are on.- User phone numbers and emails are not supplied.
phoneVerifiedandemailVerifiedare status flags, not contact values. - Public location may identify only a city and country. Full street addresses, coordinates, user websites, and social links are not promised. Platform contact details are never attributed to a user.
- Search results, profile availability, and public fields can change. Complete contest-detail coverage is not guaranteed.
Related scrapers
More job board and freelance marketplace scrapers from the same publisher:
- LinkedIn Scraper
- Indeed Scraper
- Upwork Scraper
- Glassdoor Scraper
- Fiverr Scraper
- SEEK Scraper
- Bayt Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.