curl --request POST \
--url https://api.scrapeunblocker.com/jobs/upwork \
--header 'x-scrapeunblocker-key: <api-key>'import requests
url = "https://api.scrapeunblocker.com/jobs/upwork"
headers = {"x-scrapeunblocker-key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'x-scrapeunblocker-key': '<api-key>'}};
fetch('https://api.scrapeunblocker.com/jobs/upwork', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Scrape Upwork job posts
Searches Upwork jobs for q (or lists the newest jobs without it) and returns jobs: id, ciphertext, url, title, description (full text), publishedAt, createdAt, renewedAt, jobType (hourly / fixed), hourlyMin, hourlyMax, budget (fixed price), currency, experienceLevel, duration, workload, skills, plus totalResults and nextStart. Filter with job_type, experience, budget, hourly_rate, client_hires, workload, duration, location, category, contract_to_hire; sort by relevance or recency. details=true adds, per job: proposals, interviewing, invitesSent, hired, positionsToHire, lastClientActivity, category, qualifications and client (country, city, timezone, paymentVerified, rating, reviews, totalSpent, hires, memberSince; no client names). A private listing is marked privateListing: true without those fields. Upwork shows signed-out visitors the first 5000 results of a search. Billing: one unit per results page of up to 50 jobs, plus one per job page fetched with details=true (callUnits).
curl --request POST \
--url https://api.scrapeunblocker.com/jobs/upwork \
--header 'x-scrapeunblocker-key: <api-key>'import requests
url = "https://api.scrapeunblocker.com/jobs/upwork"
headers = {"x-scrapeunblocker-key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'x-scrapeunblocker-key': '<api-key>'}};
fetch('https://api.scrapeunblocker.com/jobs/upwork', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Your ScrapeUnblocker API key. Apply on every request.
Query Parameters
What to search for, e.g. 'python' or 'logo design'. Leave empty with sort=recency for the newest jobs.
hourly or fixed.
Experience level, comma list of: entry, intermediate, expert.
Fixed-price budget in USD, comma list of ranges like '100-499', '1000-4999' or '5000-'.
Hourly rate in USD, e.g. '25-50' or '40-'.
Client's past hires, comma list of: 0, 1-9, 10-.
part_time (under 30 hrs/week) or full_time.
Project length, comma list of: week, month, semester, ongoing (under a month, 1-3 months, 3-6 months, over 6 months).
Client location, comma list of regions or countries as Upwork names them, e.g. 'Europe' or 'United States'.
Job category, comma list of names (Accounting & Consulting, Admin Support, Customer Service, Data Science & Analytics, Design & Creative, Engineering & Architecture, It & Networking, Legal, Sales & Marketing, Translation, Web, Mobile & Software Dev, Writing) or category ids.
Only contract-to-hire jobs.
relevance (default with q) or recency (default without q).
0-based position of the first job, 0-4999 (Upwork shows signed-out visitors the first 5000 results); nextStart continues.
Jobs to collect, 1-5000. Each results page (up to 50 jobs) is billed one unit.
Add each job's page: proposals, client stats, qualifications. Up to 100 jobs; one more unit per job page fetched.
Response
JSON with a jobs array.

