Upwork API endpoint
Returns an Upwork job posting: title, full description, employment type, budget (hourly range or fixed amount), location/remote type, experience level, duration, project type, proposal count, allowed applicant countries, and a summary of the posting client (member since, location, total spend, hires, hours, industry, company size).
/upwork/job/{id}Path parameters:
id (required) — Upwork's own opaque job identifier, as returned by
GET /upwork/search's jobs[].id field (the full
digit string embedded in the job's URL after ~, including its leading
region/shard digits — a shorter unprefixed id does not resolve).Notable response behavior:
budget_type is hourly (with hourly_min/hourly_max populated) or
fixed (with fixed_budget populated), read from the page's schema.org
JobPosting structured data.duration, experience_level, and project_type are omitted when
Upwork doesn't render them for a given posting.client fields are individually omitted (not "unknown") when Upwork
itself doesn't show them for a given client — not every client displays
every field (e.g. some hide location or industry).| Field | In the sample | Value in the sample |
|---|---|---|
| id | Has a value | |
| url | Has a value | upwork.com |
| title | Has a value | |
| description | Has a value | 6,356 characters |
| posted_at | Has a value | 2026-10-02 |
| employment_type | Has a value | 2 entries |
| location_type | Has a value | |
| country | Has a value | |
| experience_level | Has a value | |
| duration | Has a value | |
| project_type | Has a value | |
| proposals | Has a value | |
| applicant_countries | Has a value | 233 entries |
| client.member_since | Has a value | |
| client.country | Has a value | |
| client.location | Has a value |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id (path) | string | Yes | Upwork job id, e.g. from a search result's id field | 022085006288356888767 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/upwork/job/022085006288356888767" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"id": "022085006288356888767",
"url": "https://www.upwork.com/freelance-jobs/apply/Python-full-stack-developer_~022085006288356888767/",
"title": "Python full stack developer, python automation - Contract to Hire",
"description": "We are seeking a python full stack developer to join our team...",
"posted_at": "2026-08-05T14:13:31.761Z",
"employment_type": [
"CONTRACTOR",
"TEMPORARY"
],
"location_type": "TELECOMMUTE",
"country": "US",
"budget_type": "hourly",
"currency": "USD",
"hourly_min": 60,
"hourly_max": 75,
"experience_level": "Expert",
"duration": "1 to 3 months",
"project_type": "Ongoing project",
"proposals": "50+",
"applicant_countries": [
"United States",
"Canada"
],
"client": {
"member_since": "Aug 30, 2023",
"country": "UKR",
"location": "Olexandria, 10:03 AM",
"total_spent": "$9K total spent",
"hires": "32 hires, 1 active",
"total_hours": "207 hours",
"industry": "Engineering & Architecture",
"company_size": "Small company (2-9 people)"
}
}
}Request schema
No body schema
Response schema
#/definitions/upwork.jobResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | upwork.JobResponse | No | ||||
| data.applicant_countries | array | No | Countries the client accepts applicants from. | |||
| data.budget_type | string | No | Budget type of the job: `hourly` or `fixed`. | |||
| data.client | object | No | Summary of the client who posted the job. | |||
| data.client.company_size | string | No | Size of the client's company, as Upwork shows it, such as `Small company (2-9 people)`. | |||
| data.client.country | string | No | Client's country, as Upwork shows it: either a short code such as `UKR` or the full country name. | |||
| data.client.hires | string | No | Client's hiring history, as text such as `32 hires, 1 active`. | |||
| data.client.industry | string | No | Industry of the client's company, as Upwork shows it. | |||
| data.client.location | string | No | City of the client, as Upwork shows it. | |||
| data.client.member_since | string | No | Date the client joined Upwork, as text such as `Aug 30, 2023`. | |||
| data.client.total_hours | string | No | Total hours shown for the client, as text such as `207 hours`. | |||
| data.client.total_spent | string | No | Total amount the client has spent on Upwork, as text such as `$9K total spent`. | |||
| data.country | string | No | Country of the job's location, as a code such as `US`. | |||
| data.currency | string | No | Currency of the job budget, such as `USD`. | |||
| data.description | string | No | Full text of the job description. | |||
| data.duration | string | No | Expected length of the project, such as `1 to 3 months`. | |||
| data.employment_type | array | No | Employment types of the posting, such as `CONTRACTOR` or `TEMPORARY`. | |||
| data.experience_level | string | No | Experience level the client asks for, such as `Expert`. | |||
| data.fixed_budget | number | No | Fixed price of the job, in `currency`. Set when `budget_type` is `fixed`. | |||
| data.hourly_max | number | No | Highest hourly rate offered, in `currency`. Set when `budget_type` is `hourly`. | |||
| data.hourly_min | number | No | Lowest hourly rate offered, in `currency`. Set when `budget_type` is `hourly`. | |||
| data.id | string | No | Upwork job id, as returned by the search endpoint. | |||
| data.location_type | string | No | Where the work is done, such as `TELECOMMUTE` for remote work. | |||
| data.posted_at | string | No | Time the job was posted, in ISO 8601. | |||
| data.project_type | string | No | Project type, such as `Ongoing project`. | |||
| data.proposals | string | No | Number of proposals the job has received, as text such as `50+`. | |||
| data.title | string | No | Title of the job posting. | |||
| data.url | string | No | Upwork URL of the job posting. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/upwork/job/022085006288356888767" \
-H "x-api-key: $CRAWLORA_API_KEY"