Search live Freelancer.com projects with budgets and bid counts
The Freelancer.com API returns live freelance projects and profiles as clean JSON.
6 active endpoints. Every call is 1 credit.
- POST/freelancer/v1/search
- POST/freelancer/v1/project
- POST/freelancer/v1/user
- POST/freelancer/v1/contests
- POST/freelancer/v1/skills
- POST/freelancer/v1/categories
What Freelancer.com endpoints does ReefAPI ship?
6 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Freelancer.com API
3 of 6 endpoints, ready to run
Live projects by keyword, skill, budget band and freshness — with the bid count, the average bid and the budget range on every row.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Freelancer.com API works
Freelancer.com is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
A fresh-leads feed with the competition already counted
For lead generation on a bid board the two questions are "is it new" and "how crowded is it". Both are answered without a second call here: one is a server-side filter, the other is a field on the row.
{"query": "python"}Resolved to a numeric skill id with an active_project_count next to it — 189 live projects behind that skill when we ran it. Do this once and cache the ids.
{"skills": [13], "posted_within": "24h", "match": "all", "sort": "time_submitted"}posted_within is applied upstream, not filtered afterwards: a 24-hour window returned a total_count of 24 and stop_reason complete. Every row carries bids_count, bid_avg and bid_period_days.
Only today's projects, scoped to a skill id rather than a fuzzy keyword, with the number of competing bids and the going bid already on each row.
curl -X POST https://api.reefapi.com/freelancer/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"python","limit":10}'{
"ok": true,
"data": { … },
"meta": {
"api": "freelancer",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Skill ids, and how much work each one currently has
The skills filter takes numeric ids, not names, and the ids are not guessable — you resolve them with the skills action, which returns 60 skills each carrying an active_project_count. That count is live demand for the skill at the moment you call, which makes this table useful for more than filtering. Values below were measured in a single call.
| Skill id | Skill | Open projects when measured |
|---|---|---|
| 20 | Graphic Design | 1,028 |
| 3 | PHP | 731 |
| 688 | Video Editing | 679 |
| 335 | HTML | 576 |
| 1031 | Web Development | 554 |
| 17 | Website Design | 545 |
| 676 | Video Production | 525 |
| 663 | Social Media Marketing | 523 |
| 39 | Data Entry | 487 |
| 171 | After Effects | 483 |
| 38 | SEO | 454 |
| 662 | Content Writing | 452 |
| 13 | Python | 194 |
Our own parameter documentation has this wrong and we are fixing it: it gives 'PHP' as id 13. Measured, 13 is Python and PHP is 3. Never hard-code a skill id from a doc example — including ours. Call skills once and resolve by name.
How fresh, how deep, and what is deliberately missing
Measured on 2026-08-28 across freshness windows, a deep offset and the taxonomy actions.
No login is involved and nothing is tied to an account of yours. The engine also strips the client side of the record before you see it — its meta returns pii_redacted true, and client_country came back null on the rows we read. You get the project and its economics, not the buyer's identity.
posted_within is applied upstream rather than filtered out afterwards, and the totals prove it: a 24-hour window on one query returned total_count 24 with stop_reason complete, against 30-plus rows for the same query with no window. Windows run from one hour to thirty days, which makes a polling feed cheap.
limit 100 returned 96 rows for one query — the whole result set, not a cap. Pushing offset to 3,000 returned total_count 0 with stop_reason complete rather than an error or a repeat. The offset range runs to 5,000, but the boards themselves end long before that.
bids_count, bid_avg and bid_period_days come back on the search row itself — one project we opened showed 87 bids averaging 498 against a 250-to-750 budget. The detail adds selected_bids_count, an escrow flag, the attachment count and any qualifications. For deciding whether a lead is worth writing a proposal for, that is the whole calculation on one row.
Freelancer's own search treats a multi-word query as OR, so "data scraping python" returns projects matching any one of the three. match all makes it strict. It defaults to any, matching the source's behaviour — so if your results look loose, that is why, and there is a one-word fix.
The skills action resolves a name to Freelancer's numeric id and returns active_project_count with it, so you can see how much live work sits behind a skill before you build a feed on it. Filtering by skill id rather than by keyword is both more precise and cheaper.
Against us, though mildly. contests returns total_count null, so there is no way to know how many open contests exist; you page until the rows stop. The rows themselves are complete — prize, currency, entry count, skills and deadline.
posted_at and updated_at are separate epoch timestamps on the row, and the default ordering is by update rather than by submission. If you want genuinely new projects rather than recently-bumped ones, sort by time_submitted.
The project and its terms: title, description, budget, type, skills, status, bid counts, language, country of the project and the timestamps — with the client's own identity stripped by the engine before you see it. There is also a user action, and it returns the public trading profile the platform publishes itself: handle, display name, country and city, role, hourly rate, skills, badges, reputation, membership, portfolio count and registration year. We opened one and it carried no e-mail and no phone, because Freelancer.com does not publish those. We do not build this page around it and we do not sell profiles as a product; the project and its economics are the product.
What people build with Freelancer.com
The jobs this data is most often used for.
endpoints
credit per call
Freelance tools call search to surface new projects matching a user's skills and budget.
Market researchers use categories and search to size demand and rates for a skill.
Lead-gen products use project and user to find clients posting relevant work.
What Freelancer.com data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/freelancer/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"python","limit":10}'import requests
r = requests.post(
"https://api.reefapi.com/freelancer/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "python",
"limit": 10
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Freelancer.com.
Get a free key →Why are the timestamps integers instead of dates?▾
posted_at and updated_at are Unix epoch seconds, not ISO strings — a measured project returned posted_at 1787780838. So does a user's registration_date. Multiply by 1000 for JavaScript, or feed straight to a Unix-seconds parser. A common bug here is passing the value to a millisecond parser and landing in 1970.
What does budget.min and budget.max mean for an hourly project?▾
It is the hourly rate band, not a total. Two measured projects side by side make the difference obvious: a fixed-price one returned budget {type: 'fixed', min: 9999.0, max: 10000.0, currency: 'INR'}, and an hourly one returned {type: 'hourly', min: 2.0, max: 8.0, currency: 'USD'} — two to eight dollars an hour. Read budget.type before you interpret the numbers, and never sum the two kinds together.
Are budgets comparable across projects?▾
No, and this is the trap in any Freelancer analysis. Every project is priced in the client's own currency, returned as currency plus currency_sign, and the measured pair above was 9,999 INR against 8 USD. bid_avg has the same problem: 9999.78 on the INR project and 9.90 on the USD one. Convert to a single currency before you average anything, or your marketplace numbers will be dominated by whichever country posts in the smallest unit.
Why is client_country null when there is a countries filter?▾
Because the country the filter matches on is the project's own listed country, and that field is frequently unpublished on the posting itself — client_country came back null on a measured live project. The filter still works; it just runs server-side against data the response does not always echo back. Do not use client_country to reconstruct the filter you applied, and do not treat null as a failed fetch.
A profile shows overall_rating 0.0 — is that a bad freelancer?▾
Almost certainly not; it means no reviews yet. A measured profile returned reputation {overall_rating: 0.0, reviews: 0, completion_rate: 0, on_budget_rate: 0.0, on_time_rate: 0.0, repeat_hire_rate: null, earnings_score: 0.0}. Note that repeat_hire_rate is null in that same object while the others are 0.0 — null is 'not computed', 0.0 is 'computed and zero'. The parallel employer_reputation block returned reviews, completion_rate and on_time_rate as null throughout, because that account has never hired. Always read the reviews count before you read the rating.
Why are there two status fields on a project?▾
status is the platform's internal state and frontend_status is what the site shows a visitor — a measured live project returned status 'active' with frontend_status 'open'. They usually agree, but the pair is what tells you whether a project is genuinely accepting bids versus merely not yet archived. If you are building a lead feed, filter on frontend_status and sort with sort=time_submitted so you get newly posted work rather than recently touched work.
Why do categories come back with null counts?▾
The categories action returns 18 top-level categories with their ids and names, and measured, every row had seo_url null and active_project_count null — the counts live on skills, not on categories. So use categories for the taxonomy and the id, and skills when you want to know where the demand actually is. The category search parameter takes an SEO slug such as websites-it-software rather than the numeric id.
How deep can I page, and what is never returned?▾
limit goes to 100 per call and offset to 5000, so roughly 5,100 projects are reachable for one query — narrow with posted_within (1h, 24h, 3d, 7d, 30d) rather than paging further, especially for a fresh-leads feed. On profiles, email, phone, legal name and address are never returned under any parameter: the user action serves the public business profile only, and that is a hard boundary rather than a default you can switch off.
What is the Freelancer.com API?▾
Freelancer.com API is a ReefAPI endpoint group for freelancer.com It returns live JSON through POST requests under /freelancer/v1.
Is the Freelancer.com API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Freelancer.com calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Freelancer.com login or account?▾
No login to Freelancer.com is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Freelancer.com data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Freelancer.com API use?▾
Freelancer.com actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Freelancer.com from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call freelancer actions with the same key, credit pool and JSON envelope used by normal REST requests.
15 Jobs & Hiring APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Freelancer.com, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.