[ docs ]Jobs & work
Upwork
Measured Upwork job data, one operation per call. ops: search (a query with Upwork's own filters — sort, hourly rate and fixed budget bounds, experience level, client hiring history, project length, hours per week, client country; every hit a full posting with budget, skills, the client's profile and spend, and live proposal counts: applicants, interviewing, invites, hired), history (stored proposal-count series of postings already held, by job id or URL, free). Fresh fetches cost credits; anything already held is free.
POST https://api.zomler.com/api/v1/platforms/upworksearch
from 58 credits for 20Search Upwork jobs with the marketplace's own filters — every hit a full posting with budget, client profile and proposal counts.
Request fields
| Field | Type | Default | Values / limits |
|---|---|---|---|
queryrequired | string | — | ≤300 chars |
sort | enum | relevance | relevancenewest |
includeHourly◆ | boolean | True | — |
hourlyMin | integer | — | 0- |
hourlyMax | integer | — | 0- |
includeFixed◆ | boolean | True | — |
budgetMin | integer | — | 0- |
budgetMax | integer | — | 0- |
experienceLevel | list of enum | [] | entryintermediateexpert |
clientHistory◆ | list of enum | [] | 01-910- |
projectLength◆ | list of enum | [] | weekmonthsemesterongoing |
hoursPerWeek◆ | list of enum | [] | part_timefull_time |
clientLocation◆ | list of string | [] | each ≤60 chars |
limit | integer | 20 | 5-100 |
Example
curl
curl -X POST https://api.zomler.com/api/v1/platforms/upwork \
-H "X-API-Key: zk_live_…" \
-H "Content-Type: application/json" \
-d '{
"request": {
"op": "search",
"query": "example"
},
"estimateOnly": false
}'JavaScript
const res = await fetch("https://api.zomler.com/api/v1/platforms/upwork", {
method: "POST",
headers: {
"X-API-Key": process.env.ZOMLER_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"request": {
"op": "search",
"query": "example"
},
"estimateOnly": false
}),
});
const envelope = await res.json();
console.log(envelope.data, envelope.cost.creditsCharged);Python
import os, httpx
res = httpx.post(
"https://api.zomler.com/api/v1/platforms/upwork",
headers={"X-API-Key": os.environ["ZOMLER_API_KEY"]},
json={
"request": {
"op": "search",
"query": "example"
},
"estimateOnly": False
},
timeout=120,
)
envelope = res.json()
print(envelope["data"], envelope["cost"]["creditsCharged"])history
free · reads what is heldStored proposal-count series of postings already held — free.
Request fields
| Field | Type | Default | Values / limits |
|---|---|---|---|
subjectsrequired | list of string | — | 1-10 items |
metric | enum | applicants | applicantsinterviewinginvites_senthired |
days | integer | 90 | 1-730 |
Example
curl
curl -X POST https://api.zomler.com/api/v1/platforms/upwork \
-H "X-API-Key: zk_live_…" \
-H "Content-Type: application/json" \
-d '{
"request": {
"op": "history",
"subjects": [
"example"
]
},
"estimateOnly": false
}'JavaScript
const res = await fetch("https://api.zomler.com/api/v1/platforms/upwork", {
method: "POST",
headers: {
"X-API-Key": process.env.ZOMLER_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
"request": {
"op": "history",
"subjects": [
"example"
]
},
"estimateOnly": false
}),
});
const envelope = await res.json();
console.log(envelope.data, envelope.cost.creditsCharged);Python
import os, httpx
res = httpx.post(
"https://api.zomler.com/api/v1/platforms/upwork",
headers={"X-API-Key": os.environ["ZOMLER_API_KEY"]},
json={
"request": {
"op": "history",
"subjects": [
"example"
]
},
"estimateOnly": False
},
timeout=120,
)
envelope = res.json()
print(envelope["data"], envelope["cost"]["creditsCharged"])