upwork.com APIupwork.com ↗
Search Upwork freelancers by keyword. Returns profiles with hourly rates, job success scores, skills, location, and earnings data via a single endpoint.
curl -X GET 'https://api.parse.bot/scraper/59193041-dabe-405d-8d1b-570a0b3a553e/search_freelancers?page=1&query=react+developer&per_page=3' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for freelancers on Upwork by keyword query. Returns paginated results with detailed profile information including skills, hourly rate, job success score, location, and earnings.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| query | string | Search keyword(s) to find freelancers |
| per_page | integer | Number of results per page (1-50) |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"query": "string - the search query used",
"per_page": "integer - results per page",
"freelancers": "array of freelancer objects with name, title, description, profile_url, hourly_rate, currency, country, city, skills, job_success_score, total_earnings, and more",
"total_pages": "integer - total number of pages",
"results_count": "integer - number of results returned on this page",
"total_results": "integer - total matching freelancers"
},
"sample": {
"data": {
"page": 1,
"query": "react developer",
"per_page": 3,
"freelancers": [
{
"city": "Lviv",
"name": "Yurij M.",
"state": "Lviv",
"title": "React Developer Frontend React Full Stack Developer React Node SaaS",
"skills": [
"React",
"Node.js",
"JavaScript"
],
"vetted": false,
"country": "Ukraine",
"currency": "USD",
"hide_jss": false,
"timezone": "UTC+02:00 Israel",
"top_rated": "top_rated",
"ciphertext": "~01dc05c3dd4817bee4",
"description": "Senior Full Stack Developer...",
"hourly_rate": "35.0",
"id_verified": false,
"profile_url": "https://upwork.com/freelancers/~01dc05c3dd4817bee4",
"total_hours": 5320.17,
"portrait_url": "https://www.upwork.com/profile-portraits/c1GyxylmbwyRDMzLnTieLbYbtAhDZRD3HTLPFtGFsI0jm3I4sQrbMr8LV3iqXfkiq1",
"hide_earnings": false,
"top_rated_plus": "top_rated_plus",
"total_earnings": 0,
"job_success_score": 1,
"total_completed_jobs": 7
}
],
"total_pages": 3334,
"results_count": 3,
"total_results": 138359
},
"status": "success"
}
}About the upwork.com API
The Upwork API exposes one endpoint — search_freelancers — that returns up to 50 freelancer profiles per page across 17 structured fields including hourly rate, currency, job success score, skills array, city, country, and total results count. Pass any keyword or skill term to retrieve paginated, ranked freelancer listings directly from Upwork's marketplace.
What the API Returns
The search_freelancers endpoint accepts a query string (skill name, job title, or any keyword) and returns an array of freelancer objects. Each object includes name, title, a short description, a direct profile_url, hourly_rate with currency, country and city for location, a skills array listing the freelancer's tagged competencies, and a job_success_score reflecting their historical client rating on the platform.
Pagination
Results are paginated using page (1-based integer) and per_page (1–50). The response also returns total_results (total matching freelancers for the query), total_pages, and results_count (records returned in the current page). This lets you walk through large result sets or build an interface that shows ranked candidates across multiple pages.
Data Coverage and Freshness
The API reflects Upwork's public freelancer marketplace. Profiles with private or restricted visibility on Upwork may not appear in results. Fields like hourly_rate and job_success_score correspond to what the freelancer has publicly set or earned on the platform at the time of the request. Availability status and recent activity are not included in the current response shape.
- Build a vendor sourcing tool that queries freelancers by skill and compares hourly rates across locations
- Aggregate job success scores to rank candidates programmatically before manual review
- Enrich a recruiter CRM with Upwork profile URLs, titles, and skills arrays pulled by keyword
- Generate a market-rate report by querying multiple skill keywords and averaging returned hourly_rate values
- Monitor how many freelancers list a given emerging skill using the total_results count across queries
- Power an internal talent finder that lets non-technical staff search Upwork without accessing the site directly
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 250 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Upwork have an official developer API?+
What does the job_success_score field represent?+
Can I filter results by hourly rate range, location, or specific skills?+
query string for filtering. Results reflect Upwork's default relevance ranking for that query. Filtering by hourly_rate range, specific country, or skills subset is not available in the current API. You can fork the API on Parse and revise it to add filter parameters targeting those fields.Are freelancer earnings or total contract history included?+
hourly_rate, job_success_score, and skills. Detailed earnings history, total contract value, or individual client review text are not currently returned. You can fork the API on Parse and revise it to add a profile-detail endpoint that exposes deeper earnings and review data.How many results can I retrieve per request and is there a cap on total pages?+
per_page accepts values from 1 to 50. The total_pages and total_results fields in each response tell you the full scope of available results for a given query. Deep pagination into very large result sets may return fewer unique profiles as Upwork's public-facing search typically surfaces the most relevant candidates in earlier pages.