Upwork Jobs API

Upwork Jobs API for public freelance posts

Search Upwork’s public job listings by keyword or paste a search URL, then open any job for its category, workload and client activity. Public job pages only, as JSON, priced per call.

  • Data from Upwork

7,500 credits, one-time. No subscription. Failed calls are free. The free trial covers the travel endpoints.

Endpoints and prices checked against the API on .

More jobs data

Upwork is where companies post contract and freelance work, with a budget or an hourly range, the skills they ask for, and a client block that says how much that client has spent. Reading those pages by hand does not scale, and Upwork’s own APIs are for approved partners.

This API reads the job search and job pages a signed-out visitor can open. Search returns one page of up to 10 jobs. The job call takes the ciphertext from a search row, or the job link, and adds the category, the workload, and how many people applied, were interviewed or were hired. Member profiles and anything behind a login are not covered.

What you get

ciphertext, job_id
Upwork’s public job id and its numeric id, from a search row or a job link
title, description, url
the posting as Upwork shows it, with match highlighting removed from the title
type, hourly_min, hourly_max
fixed or hourly, and the hourly range when the poster set one
tier, duration_label, engagement
contractor tier, how long the job is posted for, and full-time or part-time
skills
the skill list on a search row. The job page leaves this empty
published_at, created_at
when Upwork published the job and when it was created
client_payment_verified
whether the search row says the client’s payment method is verified
category, category_group, currency
the job’s category and the budget currency, on the job call
workload, duration_weeks, contract_to_hire
hours, length in weeks, and whether the post is contract-to-hire, on the job call
applicants, interviews, hired, status
client activity and whether the job is still active, on the job call

One call, structured JSON

POST /v1/upwork/jobs, 2 credits per successful call.

curl -X POST "https://api.scrapercompany.com/v1/upwork/jobs" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "job_types": [
      "fixed"
    ],
    "min_fixed_budget": 200,
    "query": "web scraping"
  }'
Response (trimmed)
{
  "search_parameters": {
    "engine": "upwork_jobs",
    "query": "python",
    "page": 1,
    "sort": "recency",
    "source_url": "https://www.upwork.com/nx/search/jobs/?q=python&sort=recency"
  },
  "jobs_results": [
    {
      "job_id": "2118540488998101506",
      "ciphertext": "~022118540488998101506",
      "title": "Python Pipeline Data Engineer: Build Sports Analytics Database & API (Punting Form Data)",
      "description": "I am looking for an expert Backend Data Engineer to design and build a private, cloud-hosted data harvesting pipeline and relational database model for a custom sports analytics platform.",
      "url": "https://www.upwork.com/freelance-jobs/apply/~022118540488998101506/",
      "type": "hourly",
      "hourly_min": 50,
      "hourly_max": 90,
      "tier": "expert",
      "duration_label": "1 to 3 months",
      "engagement": "part_time",
      "skills": [
        "Python",
        "API"
      ],
      "published_at": "2026-11-06T06:55:17.989Z",
      "created_at": "2026-11-06T03:06:28.280Z",
      "client_payment_verified": false
    }
  ],
  "total": 1732,
  "total_on_page": 1,
  "next_page": 2,
  "meta": {
    "source": "upwork",
    "elapsed_s": 1.32
  }
}

Endpoints and price per call

Credits per successful call, and what one call costs on the Starter, Growth, Scale, Business plans. Failed requests cost nothing.

EndpointWhat it returnsCreditsStarter / Growth / Scale / Business
Job search
POST /v1/upwork/jobs
One page of up to 10 jobs for a keyword or an Upwork search URL2 credits$0.0024 · $0.0020 · $0.0016 · $0.0013
Job detail
POST /v1/upwork/job
One job by ciphertext or link: category, workload and client activity2 credits$0.0024 · $0.0020 · $0.0016 · $0.0013

See all plans

Does Upwork have a public jobs API?

Not for reading other people’s job posts. Upwork’s APIs are for approved partners. This API is independent of Upwork and returns the job search and job pages Upwork shows to signed-out visitors.

How do I open one job?

Take ciphertext from a search row, or paste the job link (upwork.com/jobs/~02…). Exactly one of the two. A closed or unknown job is a 404 and is not charged.

Which filters does search apply?

Give query or an Upwork search URL, not both. The URL’s own filters take priority. sort is recency or relevance, and page is 1 to 100 with 10 jobs a page. One value in job_types or experience_levels is sent as Upwork’s own filter. Several values, min_fixed_budget and max_age_days are applied to the page that was fetched, so that page can return fewer than 10 jobs.

Why is skills empty on the job call?

The signed-out job page does not include that job’s skill list. Skills are on the search row. Use the search call when you need them.

What does a failed or empty call cost?

2 credits when the call returns jobs. An empty page, an unknown job, a block and a call that runs out of time are free. A block or a spent time budget answers 503 with a Retry-After header.

Do failed requests cost credits?

No. A failed or blocked call (any 4xx or 5xx response) costs 0 credits, and so does a search page that comes back empty. You pay only for successful results.

How do I get an API key?

Create an account on the sign-up page and verify your email. You get a free trial of 50 calls or 14 days, whichever ends first, no card needed on the travel endpoints (hotels, vacation rentals, flights, reviews; not car rental); for everything else, and after the trial, buy a credit pack (from $15) or pick a plan. You create and rotate keys yourself in the dashboard.

More APIs on the same key

All APIs
LinkedIn Jobs API

Search LinkedIn’s public job listings by keyword, place, company and posting date, then open any posting for its pay range, criteria and full description. Public job data only, as JSON, priced per call.

Indeed API

Search Indeed by keyword and place and get every listing on the page with its title, company, location, posted pay, posting date and company rating. Structured JSON, priced per page.

Web scraping API

Send a URL, get the page back as HTML, markdown or text. When a site answers with a block, a rate limit or a bot check, the request is retried automatically, and you pay only for a page that comes back with content.

Screenshot API

Send a URL, get back an image of the page as a visitor sees it, after its JavaScript has run and its images have loaded. Pick the size, the format and what to capture: the viewport, the whole page or one element.

Start with 50 free calls

Create an account and verify your email: your own API keys and a free trial of 50 calls or 14 days, whichever ends first, no card needed. Then buy a credit pack from $15 or pick a plan from $49 a month.