Upwork APIupwork.com ↗
Search Upwork freelancers and job postings via API. Get skills, hourly rates, job success scores, budgets, experience levels, and more in structured JSON.
What is the Upwork API?
The Upwork API provides two endpoints — search_freelancers and search_jobs — covering Upwork's full talent marketplace and job board. A single search_freelancers call returns up to 50 freelancer profiles per page, each with hourly rate, currency, job success score, country, city, and earnings data. search_jobs returns structured job postings with budget type, experience level, duration, and required skills.
curl -X GET 'https://api.parse.bot/scraper/59193041-dabe-405d-8d1b-570a0b3a553e/search_freelancers?page=1&query=python+developer&per_page=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Full-text search over Upwork's freelancer talent pool. Returns paginated results with detailed profile information including skills, hourly rate, job success score, location, and earnings. Pagination via integer page counter; each page returns up to per_page results. The query matches freelancer titles, descriptions, and skills.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| query | string | Search keyword(s) to find freelancers by title, description, or skills |
| 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, portrait_url, hourly_rate, currency, country, city, state, timezone, skills, job_success_score, top_rated, top_rated_plus, total_hours, total_earnings, total_completed_jobs, vetted, id_verified, hide_earnings, hide_jss, ciphertext",
"total_pages": "integer - total number of pages available",
"results_count": "integer - number of freelancer results returned on this page",
"total_results": "integer - total matching freelancers"
}
}About the Upwork API
Freelancer Search
The search_freelancers endpoint accepts a free-text query parameter and returns paginated freelancer profiles from Upwork's talent pool. Each result object includes name, title, description, profile_url, portrait_url, hourly_rate, currency, country, city, state, and a job success score. Pagination is controlled by page (1-based integer) and per_page (1–50). The response envelope also carries total_results and total_pages so you can walk the full result set programmatically.
Job Posting Search
The search_jobs endpoint takes the same query, page, and per_page parameters and returns an array of job objects. Each job carries a uid, ciphertext, title, url, posted_date, budget_type, budget, experience_level, duration, and a description snippet. The response envelope mirrors the freelancer search, including total_results, total_pages, and results_count for the current page.
Pagination and Coverage
Both endpoints share the same pagination model: integer page counter starting at 1, with a maximum of 50 results per page via per_page. total_results reflects Upwork's count of matching records for the query, allowing clients to compute how many additional requests are needed to retrieve the full result set. Queries can target job titles, skill keywords, or descriptive phrases on both endpoints.
The Upwork API is a managed, monitored endpoint for upwork.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when upwork.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official upwork.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate freelancer hourly rates by skill keyword to benchmark contractor pricing
- Monitor new Upwork job postings by keyword to surface leads for freelancers or agencies
- Compare job success scores and earnings across freelancers in a given specialty
- Build a talent-sourcing tool that filters Upwork freelancers by location and rate
- Track budget distributions (hourly vs. fixed-price) across a category of job postings
- Pull freelancer profile URLs and portraits for a curated directory or comparison tool
- Analyze experience level and duration trends across Upwork job postings in a niche
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. 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 search_freelancers endpoint return beyond basic profile info?+
hourly_rate, currency, country, city, state, a job success score, and an earnings figure alongside name, title, description, profile_url, and portrait_url. The response envelope provides total_results and total_pages for pagination.Can I retrieve individual freelancer or job details by ID rather than keyword search?+
Does the API return client profiles or client history attached to job postings?+
How does pagination work across large result sets?+
page parameter and a per_page parameter capped at 50. The response always includes total_results and total_pages, so you can iterate through the full result set by incrementing page until you reach total_pages.