Truelancer.com API

Search live Truelancer projects with budgets and proposal counts

The Truelancer.com API returns live freelance projects and profiles as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Truelancer.com endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
T
/truelancer/v1

3 active endpoints. Every call is 1 credit.

  • POST/truelancer/v1/search
  • POST/truelancer/v1/project
  • POST/truelancer/v1/user

What Truelancer.com endpoints does ReefAPI ship?

3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

3 endpoints

search

1 cr

Search live freelance PROJECTS on Truelancer.com by keyword.

required
optional
query, limit, offset

project

1 cr

Full detail for one Truelancer.com project by URL or slug.

required
id
optional

user

1 cr

PUBLIC business profile of a Truelancer.com freelancer by handle or profile URL.

required
username
optional

Every parameter, every allowed value →

Truelancer.com API

1 of 3 endpoints, ready to run

View docs ↗

Live projects by keyword, with the budget object, the skills, the bid count and the client's country on every row.

1 credit0 required · 3 optional
POST/truelancer/v1/search
idle
// 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 Truelancer.com API works

Truelancer.com is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /truelancer/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Qualify a lead before you spend a proposal on it

On a bid board the expensive mistake is writing a proposal for a client who never hires. Truelancer publishes the two facts that predict it, and this engine puts both on the project record.

01search
POST/truelancer/v1/search
{"query": "logo design", "limit": 30}

Thirty rows with budget, skills, status, bid count and the client's country. Paging is genuine — offset 500 still returned a full page of rows.

02project
POST/truelancer/v1/project
{"id": "<row.url>"}

Adds total views, the proposal breakdown into received, active and shortlisted, an end date, and a client block: country, verified flag, total spent, jobs posted and the average rating they give.

A shortlist ranked by whether the client has actually paid anyone before — with no personal detail about them anywhere in the record.

request
curl -X POST https://api.reefapi.com/truelancer/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"design","limit":8}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "truelancer",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Addressing a project, and which fields only the detail action fills

Two things send most first calls into a 404. The project id in a search row is not accepted by the project action on its own, and the slug format the parameter description shows is not the one that resolves. Everything below was measured on live calls: the search action for 'logo design' and 'wordpress', project 655630 (Professional Brand Identity Design), and the profiles webdev, johnsmith, designer, rahulkumar and priya.

FieldMeasured shapeWhat to do with it
projects[].id6-digit integer, e.g. 655630, which is also the number on the end of the URL slugDo not pass it to the project action on its own. A bare numeric id is rejected with INVALID_PARAM.
project action, id paramThe full https URL works, and so does the bare slug 'professional-brand-identity-design-655630'The prefixed form 'freelance-project/<slug>-<id>' returned NOT_FOUND (HTTP 404) in our tests, so use the URL or the bare slug.
budgetObject {type, min, max, currency}, not a string. type is 'fixed' or 'hourly'.min equals max on every row we sampled, because Truelancer publishes one figure rather than a range. Every sampled row was USD.
skillsArray of {id, name} objects, not strings. Ids we saw ran from 1 to 3037.32 = Logo Designers, 35 = Graphic Designers, 104 = Data Entry Operators, 429 = Artificial Intelligence Engineers, 2674 = Video editing.
posted_atUnix epoch seconds, not ISO-8601. 1787415416 is 2026-08-22T16:16:56Z.Multiply by 1000 before handing it to a JavaScript Date.
status'Active' or 'Freezed and Awarded'An already-awarded project stays in search results, so filter on status if you only want biddable work.
category, client_country, clientnull on every search row we pulledAll three are filled by the project action: category 'Graphic Design & Multimedia', client_country 'Egypt', client {country, country_code, verified, total_spent, jobs_posted, avg_rating_given}.
detail.end_dateDate only, '2026-09-14'The bidding deadline. It is unrelated to posted_at and only exists on the project action.
user, username paramA handle ('webdev') or a full profile URL both resolveThe numeric user id is separate from the handle: webdev is id 112250. An unknown handle returns NOT_FOUND.
user.role'freelancer' or 'employer'The same action resolves client accounts, not only freelancers. Check role before treating a record as a freelancer profile.

The poster's name is never returned. What you get about a client is coarse: country, a verified flag, total_spent and jobs_posted. Note also that data.total_count is not a result total. Measured at offsets 0, 15, 30 and 45 with limit 15 it read 15, 30, 45 and 60, so it tracks how far you have paged. Raise offset until returned comes back smaller than the limit you asked for.

A count you cannot trust, paging you can, and the client block that is worth the call

Measured on 2026-08-28 at two offsets and on a project detail. The first line goes badly against us.

No Truelancer account, and no client identity in the response

No login is involved and nothing is tied to an account of yours. The engine's meta reports pii_redacted true: what comes back about the buyer is a business record — country, verified flag, total spent, jobs posted — with no name, no handle and no contact details.

🔴🔴 total_count is not a total

Against us, and you must not build on it. In one call at offset 0 the response said total_count 15 while returning 75 rows in the same payload. In another at offset 500 it said 510 while returning 30. The number is page-local at best and contradictory at worst — ignore it entirely, and use the returned row count against your requested limit as your end condition instead.

⭐ But the paging itself is genuinely deep

Offset 500 returned a full page of 30 rows on a single keyword. That is far deeper than the freelance boards it sits next to in this batch — Fiverr stops at about a hundred and Guru's scopes end in the dozens. The depth is real even though the counter is not.

⭐ The detail carries the lead-qualification fields

This is the reason to make the second call. The project detail returned total_views, a proposals object split into received, active and shortlisted, a payment_verified flag, an end_date and the client block — country, verified, total_spent, jobs_posted and avg_rating_given. On the project we opened, 53 proposals received against 51 still active, 655 views, an unverified payment method and a client who had posted one job and spent nothing. Every one of those is a reason to bid or not to bid, and none of them identifies anybody.

Budget is an object, and it is on every row

budget comes back with type, min, max and currency on the search row itself — fixed and hourly both, with equal minimum and maximum where the client posted a single figure. No parsing of prose, and no second call to find out what the job pays.

The date is an epoch, and there is no freshness filter

posted_at is a Unix timestamp on every row and status says Active where the project is open. There is no posted-within parameter, so a fresh-leads feed here means sorting and diffing on your side rather than asking the source for a window. The end_date on the detail is the other half of the timing picture.

Skills come back with ids

Each project carries its skills as objects with numeric ids as well as names, so grouping a crawl by skill needs no string matching. Category and subcategory arrive on the detail rather than the grid.

The identifier is a URL or a slug

project takes the project URL or the SEO slug that every search row returns; a bare numeric id will not resolve. Bid-board ids expire, so resolve from a live search row rather than from something you stored last month.

What comes back, and what does not

The project and its terms: title, description, budget, skills, status, bid and proposal counts, views, the client's country and their spending history as a business record with no name in it. A public freelancer-profile action also exists, returning what Truelancer itself shows on a profile page; we do not build this page around it and we do not sell profiles as a product. Nothing here carries a private contact channel.

What people build with Truelancer.com

The jobs this data is most often used for.

3

endpoints

1

credit per call

01

Freelance tools call search to surface new Truelancer projects matching a user's skills.

02

Market researchers use search to size demand and budgets for a service.

03

Lead-gen products use project and user to find clients posting relevant work.

What Truelancer.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 →
$0.67–$1.50 / 1,000 credits
  • 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
curl -X POST https://api.reefapi.com/truelancer/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"design","limit":8}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/truelancer/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "design",
  "limit": 8
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Truelancer.com.

Get a free key →
The search results have an id like 655630. Why does the project action reject it?

Truelancer's project page cannot be reached from the numeric id alone without a login, so the engine rejects a bare number with INVALID_PARAM rather than guessing. Pass either the full url from the search row, or the bare slug that ends in that number, for example 'professional-brand-identity-design-655630'. The form written as 'freelance-project/<slug>-<id>' came back NOT_FOUND in our tests.

Is the budget a number or a string?

It is a structured object: budget{type, min, max, currency}. type mirrors the project's own type field and is either 'fixed' or 'hourly'. On every project we sampled min and max were equal, because Truelancer's posting form takes a single figure rather than a range, and currency was USD throughout.

Why are category, client_country and client null in search results?

Truelancer's listing payload does not carry them; they come from the individual project page. Call the project action for any row you care about and you get category 'Graphic Design & Multimedia', detail.subcategory 'Brand Identity Packages', client_country 'Egypt', and a client object with country_code, verified, total_spent, jobs_posted and avg_rating_given.

What does status 'Freezed and Awarded' mean?

The client has picked a freelancer and the project is closed to new proposals. Those rows still appear in search results next to 'Active' ones, so if you are building a bidding or alerting tool, filter on status yourself. Those two were the only values we saw across the projects we sampled.

Are skills plain strings I can match on?

No. skills is an array of {id, name} objects, so skills[0].name is 'Logo Designers', not 'logo design'. The ids are stable Truelancer skill ids and make the better join key: 32 is Logo Designers, 35 Graphic Designers, 104 Data Entry Operators, 429 Artificial Intelligence Engineers. The same shape appears on a freelancer's profile.

Does the user action work for clients as well as freelancers?

Yes, and this surprises people. A handle resolves whichever account owns it, and the record carries a role field that reads 'freelancer' or 'employer'. Of five handles we probed, three were freelancers and two were employers, with organization_type 'Individual' or 'Company'. Check role before you treat a record as a freelancer.

How do I page through results, and can I trust total_count?

Page with offset, which accepts values up to 5000 and returned a fresh set of 15 at offsets 0, 15, 30 and 45. Do not read total_count as a result total: on those same four calls it read 15, 30, 45 and 60, so it tracks how far you have paged rather than how much exists. Keep raising offset until returned comes back smaller than the limit you asked for.

Is any client contact information returned?

No. The poster's name, email, phone and address are dropped before the response is built, and the same applies to freelancer profiles. What remains is business information: country and country code, a verified flag, total_spent, jobs_posted, ratings, hourly_rate, skills and the public profile URL.

What is the Truelancer.com API?

Truelancer.com API is a ReefAPI endpoint group for truelancer.com It returns live JSON through POST requests under /truelancer/v1.

Is the Truelancer.com API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Truelancer.com calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Truelancer.com login or account?

No login to Truelancer.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 Truelancer.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 Truelancer.com API use?

Truelancer.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 Truelancer.com from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call truelancer 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 Truelancer.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.

0/4000

No account needed · we reply from [email protected]

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.