Upwork Jobs Scraper API
Search Upwork Jobs and Get Upwork Job Details cover Upwork job search end to end. Search Upwork Jobs takes a keyword and returns matching postings with their title, description, contract type, budget, publish time and a job reference to pass into the detail call. Get Upwork Job Details takes that reference — the job ciphertext, or the job URL — and returns the complete posting: the full description, required skills, budget range, how many freelancers have applied and been interviewed, and the client’s own country, feedback score, hire count and total historical spend. Both read Upwork’s public visitor GraphQL surface — no Upwork account or session cookie is required. They run over residential proxy exits specifically because Upwork’s visitor surface was measured to return zero successful reads over datacenter IPs during evaluation, where the residential pool worked; that is a documented, measured choice rather than a default. The exact price is on this page’s FAQ, generated from the catalog. Filter values (contract type, budget bands and similar enums) are independently measured against Upwork’s own API, since Upwork disables introspection on this surface — an unverified guess at an enum value fails the call loudly rather than silently returning nothing.
What data you get
Search Upwork Jobs
- jobs
- arrayrequired
- jobs[].jobId
- stringrequired
- jobs[].title
- stringrequired
- jobs[].jobUrl
- stringrequired
- jobs[].jobType
- stringrequired
- jobs[].ciphertext
- stringrequired
- jobs[].description
- stringrequired
- jobs[].publishTime
- stringrequired
- jobs[].hourlyBudgetMax
- numberrequired
- jobs[].hourlyBudgetMin
- numberrequired
- jobs[].fixedPriceAmount
- numberrequired
- page
- integerrequired
- query
- stringrequired
- hasMore
- booleanrequired
- pageSize
- integerrequired
- elapsedMs
- integerrequired
- fetchedAt
- stringrequired
- totalFound
- integerrequired
- resultCount
- integerrequired
Get Upwork Job Details
- title
- stringrequired
- jobUrl
- stringrequired
- skills
- arrayrequired
- status
- stringrequired
- jobType
- stringrequired
- postedOn
- stringrequired
- elapsedMs
- integerrequired
- fetchedAt
- stringrequired
- buyerScore
- numberrequired
- ciphertext
- stringrequired
- totalHired
- integerrequired
- description
- stringrequired
- publishTime
- stringrequired
- buyerCountry
- stringrequired
- contractorTier
- stringrequired
- buyerTotalSpent
- numberrequired
- hourlyBudgetMax
- numberrequired
- hourlyBudgetMin
- numberrequired
- totalApplicants
- integerrequired
- lastBuyerActivity
- stringrequired
- buyerTotalJobsWithHires
- integerrequired
- totalInvitedToInterview
- integerrequired
Calling Search Upwork Jobs
A schema-derived request and response shape — not a captured production call, since upAPI has none to publish. Every field is real, from the operation’s own published schema.
curl -X POST https://api.upapi.io/upwork-jobs-search.get \
-H "X-Api-Key: $UPAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"sort": "recency",
"query": "python developer",
"jobType": "any",
"pageSize": 20,
"experienceLevel": "any"
}'{
"jobs": [
{
"jobId": "example",
"title": "Alan Turing",
"jobUrl": "example",
"jobType": "example",
"ciphertext": "example",
"description": "example",
"publishTime": "example",
"hourlyBudgetMax": 1,
"hourlyBudgetMin": 1,
"fixedPriceAmount": 1
}
],
"page": 1,
"query": "typescript",
"hasMore": false,
"pageSize": 5,
"elapsedMs": 1,
"fetchedAt": "example",
"totalFound": 1,
"resultCount": 1
}Pricing
Search Upwork Jobs
10 units per call
Get Upwork Job Details
10 units per call
Every unit draws from one pooled monthly quota shared across the whole catalog. See upapi.io/pricing for what a unit costs on each plan.
Questions people actually ask
Do I need an Upwork account to search jobs?
No. Both operations read Upwork’s public visitor surface — the same job board a signed-out visitor can browse — and authenticate only with your upAPI key. Authenticated Upwork (posting proposals, messaging clients) is out of scope for this catalog.
What does the job detail call return about the client?
The client’s country, feedback score, total jobs with hires, and total historical spend, alongside the posting’s own budget, required skills, and applicant and interview counts.
How much does this cost?
Every operation in this cluster costs 10 weighted units per call, drawn from your plan’s pooled monthly quota — see upapi.io/pricing for what a unit costs on each tier.
What do I pass into Get Upwork Job Details?
The job’s ciphertext reference from a Search Upwork Jobs result, or the job’s own URL — either is accepted.
How fresh is the data — is it cached?
Search Upwork Jobs is cached for 3 minutes; Get Upwork Job Details is cached for 10 minutes. A repeat call inside a cached window returns the cached response and is billed nothing.