Freelancer.com Scraper
Scrape Freelancer.com projects with no account. Rows carry fixed or hourly budgets, bid counts, average bid, skills, client country and rating.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchQuery,skills,projectType(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00045 per project = $0.45 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Project returned | Charged once per genuine Freelancer.com project row: title, full description, fixed or hourly budget with currency and USD conversion, bid count, average bid, skills, client country, city, rating, review count and verification flags, listing upgrade flags, posted date and project URL. Sample rows, diagnostic rows and projects removed by your own filters are never charged. | $0.00045 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-08, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchQuery | Free-text search across active Freelancer.com projects, e.g. "wordpress", "logo design", "python scraper". Leave empty to take the newest projects across the whole site. | string |
skills | Only return projects tagged with these Freelancer skills. Use the exact skill name shown on the site ("PHP", "Logo Design", "Data Entry"), its URL slug ("web-design") or its numeric skill id. This is a real server-side filter, so it is the cheapest way to narrow a search. | array |
projectType | Fixed-price projects quote a total budget; hourly projects quote an hourly rate. Every row states which in its budgetType field. | string |
upgrades | Paid listing upgrades. These are rare, in a 994-project sample, featured 0.5%, sealed 0.5%, urgent 0.6%, NDA 0.4%, so selecting one will return very few rows. | array |
maxItems | Hard cap on rows returned. You are charged only for rows you receive. Freelancer's own API stops paging at roughly 5,000 projects per search, so that is the practical ceiling for one run. | integer |
includeClientDetails | Adds the client's country, city, star rating, review count, member-since date and verification flags. This costs one extra request per project, so a large run is slower with it on. Country is present on ~100% of projects; a star rating only on ~32%, because most Freelancer clients have no reviews yet. | boolean |
clientCountries | Keep only projects whose client is in one of these countries. Accepts ISO codes ("US", "GB", "AU") or full names ("United States"). Filtered here, after the client lookup. Freelancer's own countries[] parameter is accepted by the API but does nothing. Dropped projects are never charged. | array |
minBudgetUsd | Keep only projects whose budget range reaches this amount. Compared in USD using the exchange rate Freelancer returns with each project, so an INR or GBP project is converted before comparison. Applied here rather than server-side, because Freelancer's max_avg_price parameter is a relevance hint, not a filter. Dropped projects are never charged. | integer |
maxBudgetUsd | Keep only projects whose budget range starts at or below this amount, in USD. | integer |
minBids | Keep only projects with at least this many bids. | integer |
maxBids | Keep only projects with at most this many bids. Useful for finding fresh, low-competition work: set it to 5. | integer |
sortBy | Newest first is Freelancer's default ordering. Most bids first surfaces the busiest projects. | string |
What you get
A structured dataset — each result includes fields like:
titleprojectTypebudgetMinbudgetMaxbudgetCurrencybidCountaverageBidskillsclientCountryclientRatingpostedAtprojectUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Freelancer.com Scraper: open projects with budgets, bid counts and client data
Freelancer.com works on bidding. The client names a budget, freelancers bid against it, and the site publishes how many have bid and what they are asking on average. All three land on every row, next to the skills, the client's country and rating, and the full project description.
One thing to get straight before you sort anything: on an hourly project, budgetMin and budgetMax are an hourly rate, not a total. budgetType says which on every row, and mixing the two is the easiest way to produce a nonsense average.
| Input | A keyword, skills, and budget or bid filters |
| Output | One row per open project |
| Ceiling | 5,000 projects per run |
| Account needed | None, and no API key |
| Price | $0.45 per 1,000 projects, flat on every plan |
🔍 What Freelancer.com Scraper does
It searches the open projects, applies your filters, and writes one row each. Skills are a real server-side filter, so narrowing by PHP or Logo Design is the cheapest and fastest way to cut a search down. Budget, bid-count and client-country filters are applied afterwards on the rows themselves, and anything dropped by them is not charged.
Budgets come back in the project's own currency and converted to USD, using the exchange rate Freelancer returns with each project. That matters because the site is genuinely multi-currency, and sorting a mixed export on budgetMin without the USD columns gives you a meaningless ranking.
Client details are on by default: country, city, star rating, review count, member-since date and the verification flags. That costs one extra lookup per project, so a big run is slower with them on.
📥 What you give it
None of these fields has a default. The input form arrives pre-filled with a working example, and those values are starting points you can clear.
{
"searchQuery": "wordpress",
"skills": ["PHP"],
"projectType": "fixed",
"maxBids": 5,
"minBudgetUsd": 250,
"maxItems": 200
}
| Field | Form starts at | What it is |
|---|---|---|
searchQuery | wordpress | Free text across open projects. Clear it to take the newest projects site-wide. |
skills | empty | Only projects tagged with these. Use the exact skill name, its URL slug like web-design, or its numeric id. This is the one filter Freelancer applies for you. |
projectType | any | fixed or hourly. |
upgrades | empty | featured, sealed, urgent, NDA. These are rare, well under 1% of projects each, so picking one returns very few rows. |
maxItems | 50 | Hard cap on rows, up to 5,000. |
includeClientDetails | on | Adds the client's country, city, rating, review count, member-since date and verification flags. |
clientCountries | empty | Keep only projects whose client is in one of these. ISO codes like US or full names. Applied after the client lookup, so it is slower than filtering on skills. |
minBudgetUsd, maxBudgetUsd | none | Budget bounds in USD, compared after conversion. |
minBids, maxBids | none | Bid-count bounds. Set maxBids to 5 to find work nobody has quoted on yet. |
sortBy | newest | newest or bids. |
proxyConfiguration | off | Optional. Your own servers are used exactly as given. |
📤 What you get back
A real row, with the description cut short:
{
"projectId": 40721965,
"title": "Bilingual Real Estate Cold Caller",
"description": "I need someone who can cold call using a U.S. line for several hours each weekday, speak confidently with residential homeowners in both English and Spanish, and secure firm Zoom listing appointments for me...",
"projectUrl": "https://www.freelancer.com/projects/real-estate/Bilingual-Real-Estate-Cold-Caller",
"projectType": "hourly",
"budgetType": "hourly_rate",
"budgetMin": 15,
"budgetMax": 25,
"budgetCurrency": "USD",
"budgetMinUsd": 15,
"budgetMaxUsd": 25,
"bidCount": 4,
"averageBid": 17.5,
"averageBidUsd": 17.5,
"hourlyCommitmentHours": 40,
"hourlyCommitmentInterval": "week",
"hourlyDuration": "unspecified",
"skills": ["Sales", "CRM", "Real Estate", "Spanish Translator", "Customer Service", "Lead Generation", "Appointment Setting", "Cold Calling"],
"skillIds": [64, 147, 443, 521, 671, 1683, 1694, 3415],
"categories": ["Sales & Marketing", "Translation & Languages", "Data Entry & Admin"],
"isSealed": false, "isFeatured": false, "isUrgent": false, "isNda": false,
"isFulltime": false, "isPremium": false, "isRecruiter": false, "isLocal": false,
"bidsHidden": false,
"status": "open",
"postedAt": "2026-09-20T01:27:46.000Z",
"updatedAt": "2026-09-20T07:28:23.000Z",
"bidPeriodDays": 7,
"bidsCloseAt": "2026-09-27T01:27:46.000Z",
"language": "en",
"projectCountry": null,
"projectCity": null,
"clientDetailsFetched": true,
"clientCountry": "United States",
"clientCountryCode": "US",
"clientCity": "DORAL",
"clientRating": 5,
"clientReviewCount": 4,
"clientMemberSince": "2022-01-03T01:31:14.000Z",
"clientPaymentVerified": true,
"clientEmailVerified": true,
"clientPhoneVerified": true,
"clientProfileComplete": true,
"clientDepositMade": true,
"scrapedAt": "2026-09-20T07:45:12.637Z"
}
The categories list is cut short; the real row carries five.
| Field | What it is |
|---|---|
budgetMin, budgetMax | What the client asked for. A total on a fixed project and an hourly rate on an hourly one. Read budgetType before you compare two rows. budgetMax is missing on open-ended budgets. |
averageBid | What freelancers are actually asking, which is often nowhere near the budget. This is the number that tells you the going rate. |
budgetMinUsd, budgetMaxUsd, averageBidUsd | The same figures converted, so a mixed-currency export sorts properly. |
bidCount | null when nobody has bid yet. The bid filters read that as zero. |
clientRating | Only about a third of projects have one, because most clients have never been reviewed. Read clientReviewCount first: a zero-star client with zero reviews is a new client, not a bad one. |
clientPaymentVerified, clientDepositMade | The two flags worth more than the rating when you are deciding whether a client is real. |
bidsCloseAt | When bidding ends, derived from postedAt and bidPeriodDays. |
projectCountry, projectCity | Set only on the small share of projects that need somebody on site. |
skills, skillIds | Names and Freelancer's numeric ids. Feed the ids straight back into skills on the next run. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A project | It has a projectId | yes |
| The sample row | _sample: true and charged: false | no |
| A diagnostic | An errorCode and no projectId | no |
Real project rows carry no charged field at all, so filter on _sample being absent rather than on charged being true.
errorCode | What it means |
|---|---|
NO_RESULTS | The search ran and matched nothing. Loosen a filter or widen the keyword. |
UNKNOWN_SKILL | A skill name could not be matched. Use the exact name from the site, its slug, or its id. |
SKILL_LOOKUP_FAILED | The skill list could not be read. Re-run it. |
API_ERROR | Freelancer refused the request. |
HTTP_ERROR | Freelancer was unreachable or answered badly. |
BAD_JSON | The answer could not be read. Re-run it. |
▶️ How to run it
1. Open Freelancer.com Scraper and click Try for free. 2. Type a term into Keyword, or clear it to take the newest projects site-wide. 3. Add Skills if you know them. That is the filter that does the most work. 4. Set Maximum projects, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.45 per 1,000 projects. Flat on every Apify plan, no volume tiers.
You pay per project row you receive. Projects dropped by the budget, bid-count or client-country filters are not charged, the sample row is not charged, and diagnostic rows are not charged. Client details do not add a second charge, they just make the run slower.
💡 What people use it for
- Finding fresh work nobody has quoted on:
maxBidsat 5, sorted newest, on a schedule. - Reading the real going rate for a skill, by comparing
averageBidUsdagainstbudgetMinUsdacross
a few hundred projects rather than guessing.
- Filtering for clients who have actually paid before, using
clientPaymentVerifiedand
clientDepositMade instead of a star rating most clients do not have.
- Watching demand for a skill over time, by running the same skill filter weekly and counting rows.
- Building a lead list of clients in one country who post the kind of work you do.
🚧 What it does not do
- Open projects only. No completed or awarded work, and no history.
- No bid lists. You get the count and the average, not who bid or what each of them said.
- No contests and no freelancer profiles. Projects only.
- About 5,000 projects is as deep as one search goes. Use narrower searches rather than a bigger
number.
- Most clients have no rating, so a rating filter of your own would throw away most of the
market. The verification flags are the better signal.
- Budget filters need a USD conversion. A project Freelancer gives no exchange rate for is
dropped by those filters rather than guessed at.
- Listing upgrades are rare. Filtering on
featured,sealed,urgentorNDAwill return
very little.
- Rows are a snapshot. Bid counts move fast and bidding closes.
bidsCloseAttells you when.
🧭 Which work-listings scraper do you need?
| If you want | Use |
|---|---|
| Open freelance projects with budgets and bid counts | This one |
| French job postings with salaries | HelloWork Jobs Scraper |
| Germany, Austria and Switzerland | XING Jobs Scraper |
| Germany, Austria, Netherlands and Belgium | StepStone Jobs Scraper |
| Startup roles from Wellfound | Wellfound Jobs Scraper |
❓ Questions people ask
Do I need a Freelancer account? No. Everything here is public project data.
Why is a $15 to $25 budget showing on a project that will take weeks? Because it is hourly. Check budgetType, which reads hourly_rate on those rows.
Why does the average bid sit above the budget? That happens a lot. The budget is what the client hoped for and averageBid is what the market is asking. That gap is the most useful thing on the row.
Why do so many clients have a zero rating? Because most of them have never been reviewed. clientReviewCount tells you which zeros are new clients rather than bad ones.
What is the fastest way to narrow a search? Skills. Freelancer applies that one itself, so it cuts the work rather than just cutting the output.
Is this legal? These are public project listings. Check Freelancer's terms and your own local rules before using the output commercially. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the keyword or skill and the run ID. If you got a diagnostic row, its errorCode usually names the problem on its own.