Freelancer.com Scraper - Jobs, Profiles & Contests avatar

Freelancer.com Scraper - Jobs, Profiles & Contests

Pricing

from $1.10 / 1,000 results

Go to Apify Store
Freelancer.com Scraper - Jobs, Profiles & Contests

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

0

Monthly active users

13 hours ago

Last modified

Security

Limited permissions

Share

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 skills to search projects; projectTypes filters fixed-price or hourly work.
  • Freelancers: select freelancers and supply skills for directory listings.
  • Profiles: supply usernames for specific public profiles.
  • Contests: select contests for active contests; skill filters do not apply.
  • Services: select services for fixed-price offerings, optionally with a search phrase in skills.
  • Optional rows: includeBids adds bids in jobs mode; includeEntries adds 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)

FieldDescriptionExample
projectUrlPublic project linkhttps://www.freelancer.com/projects/python/example-project
budgetRangeBudget with currency when shown$250 – $750 USD
avgBidAverage bid amount420
bidCountSource-reported bid total18
skillsListed skill tags["Python", "Automation"]

Freelancer directory (freelancer)

FieldDescriptionExample
hourlyRateRate text shown on the listing$25 USD / hour
reviewCountPublic review count42
scorePublic rating4.9
locationPublic location textLondon, United Kingdom

Public profiles (profile)

FieldDescriptionExample
usernamePublic account nameexampleuser
profileUrlPublic profile linkhttps://www.freelancer.com/u/exampleuser
hourlyRateAmountNumeric rate, without an assured currency25
joinedAtRegistration timestamp when available2020-01-15T00:00:00+00:00
profileClosedWhether the profile is marked closedfalse

Contests (contest)

FieldDescriptionExample
contestUrlPublic contest linkhttps://www.freelancer.com/contest/example-design-1234567.html
prizeNumeric prize amount100
entryCountSource-reported entry total24
statusContest statusactive

Services (service)

FieldDescriptionExample
serviceIdService identifier12345
priceFormatted service price$50 USD
baseDurationDuration value supplied by Freelancer.com3

Bids (bid)

FieldDescriptionExample
bidIdBid identifier123456
projectIdParent project identifier12345678
amountPublic bid amount, when disclosed250
sealedWhether bid contents are hiddentrue

Contest entries (entry)

FieldDescriptionExample
entryIdEntry identifier123456
contestIdParent contest identifier1234567
filesPublic 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

  1. Open Freelancer.com Scraper in Apify Console. A free Apify account is enough to try it.
  2. Enter a skill such as python in skills.
  3. Set maxItems to 5 for your first run.
  4. Click Start and wait for the run to finish.
  5. 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

FieldWhat to enterDefault
modeauto, jobs, freelancers, profiles, contests, or servicesauto
skillsUp to 10 skills or search phrases; required for freelancers, ignored for contestsEmpty; form sample python
usernamesUp to 50 public usernames for profilesEmpty
maxItemsRows per skill, keyword, or username; 1–50070; form sample 3
maxPagesDirectory pages to visit in freelancers mode; 1–501
projectTypesJobs only: fixed or hourlyEmpty
scrapeDetailsAdd contest details and available service seller informationtrue
maxDetailItemsDetail/enrichment limit and number of parent rows eligible for bids or entries; 0–505
enrichProfilesAdd public profile fields to directory rows and available service seller informationtrue
expandPoolsJobs only: extend searches to related skill categoriesfalse
includeBidsJobs only: add public bids as rowsfalse
includeEntriesContests only: add public entries as rowsfalse

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}
  • maxItems is the canonical row limit; maxResults and limit are accepted aliases. keywords, keyword, search, query, and searchTerms are aliases for skills.
  • 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 maxPages are 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_REPORT to 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; leadAbsences explains 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 planPrice per rowPrice per 1,000 rows
Free$0.0015$1.50
Starter$0.0015$1.50
Scale$0.0013$1.30
Business$0.0011$1.10
  • maxItems applies 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 maxTotalChargeUsd in 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 after SUCCEEDED, 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 ApifyClient
client = 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

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. maxPages controls directory paging, not all collection modes.
  • maxDetailItems limits enrichment and parent rows eligible for child collection. Setting it to 0 prevents bid and entry collection even when their switches are on.
  • User phone numbers and emails are not supplied. phoneVerified and emailVerified are 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.

More job board and freelance marketplace scrapers from the same publisher:

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.