Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Workana Jobs Scraper icon

Workana Jobs Scraper

Scrape Workana freelance projects: title, brief, budget, skills, proposals, client country and rating. English, Spanish and Portuguese boards.

65 runs on Apify $0.0018 per project ($1.8 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchQuery, languages, maxItems (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0018 per project = $1.8 per 1,000

You are charged forWhenPrice
Project returnedOne project returned in the dataset. Projects dropped by your filters, diagnostics and the labelled sample row are not charged.$0.0018

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchQueryFree-text search across open Workana projects, e.g. "wordpress", "diseño de logo", "tradução". Leave it empty to take whatever is newest on the boards you selected below.string
languagesWorkana keeps three separate boards and a project sits on exactly one of them. They do not overlap: the same four pages returned 30 English projects and 32 Spanish ones with nothing in common. Spanish and Portuguese are far larger than English, so tick those if you want volume.array
maxItemsHard cap on projects returned across the whole run. You are charged per project you receive; sample and diagnostic rows are free. One search reaches at most 99 pages, so a very large number only pays off if you also tick more languages or add categories.integer
categoriesWorkana's top-level categories. Use the slug from the site's own URL ("it-programming", "design-multimedia", "sales-marketing", "writing-translation", "admin-support", "legal", "finance-management", "engineering-manufacturing"). Each category is searched separately.array
subcategoriesMore specific than a category, and again the slug from the URL: "web-development", "mobile-development", "e-commerce", "wordpress-1", "data-science-1". Searched separately from the categories above, not combined with them.array
skillsOnly return projects tagged with these skills. Use the slug Workana uses in its own skill links — "adobe-photoshop", "microsoft-excel", "logo-design-1". A wrong slug quietly matches nothing rather than erroring, so check one against a live Workana search first.array
clientCountriesTwo-letter country codes for the client who posted the project: "BR", "MX", "AR", "CO", "US", "ES". Each is searched separately. Brazil dominates the Portuguese board; Argentina, Colombia and Mexico the Spanish one.array
startUrlsPaste the address bar from a Workana search you already set up, e.g. https://www.workana.com/jobs?category=it-programming&language=es — the filters are read straight out of it. When you use this, the fields above are ignored except the keyword.array
projectTypeFixed-price projects quote a total; hourly projects quote a rate per hour. Workana has no server-side filter for this, so it is applied here after the listing is read — projects that do not match are dropped and never charged.string
maxProposalsKeep only projects with at most this many proposals. A low number finds work few people have quoted on, but on a busy keyword those are mostly older posts, so a short postedWithinDays can leave nothing.integer
minProposalsKeep only projects with at least this many proposals. Useful the other way round, for reading what a busy brief looks like.integer
postedWithinDaysKeep only projects posted in the last N days. Workana publishes an age ("5 hours ago", "2 weeks ago") rather than a timestamp, so this is accurate to the hour on fresh projects and to the week on older ones. Every row carries postedAtPrecision so you can see which.integer

What you get

A structured dataset — each result includes fields like:

titlecategoryprojectTypebudgetTextproposalsCountclientCountryclientRatingpostedRelativeskillsprojectLanguageprojectUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Workana Jobs Scraper: open freelance projects with budgets, proposal counts and client country

Give it a keyword, a Workana category or a search link, and it returns the open freelance projects that match, one row each. Every row carries the client's full brief, the budget bracket, fixed or hourly, how many freelancers have already sent a proposal, and the client's country and rating. The catch is coverage: Workana shows a signed-out visitor only part of each search, about 35 to 42% of what its own counter says, and the same part on every run.

InputA keyword, Workana categories, skills or client countries, or Workana search URLs
OutputOne row per open project
Ceiling2,000 projects per run, 99 pages per search
Account neededNone
Price$1.80 per 1,000 projects, flat on every plan

🔍 What Workana Jobs Scraper does

Workana keeps three boards, English, Spanish and Portuguese, and a project sits on exactly one of them. They do not overlap. The same four pages returned 30 English projects and 32 Spanish ones with nothing in common, and the English board is by far the smallest. If you want volume, tick Spanish and Portuguese.

Each combination of language, category, subcategory and country runs as its own search, up to 200 in one run. maxItems is shared out across them, so three boards give you roughly a third each instead of the first one taking the lot. A project that turns up in two searches is kept once. Slicing like this is also how you reach more of the board, because every search stops at page 99.

Budgets are brackets. Workana asks clients to pick one rather than type an amount, so budgetMin and budgetMax are the bracket's edges, and an open-ended bracket leaves that side null: "Less than USD 50" gives budgetMin: null and budgetMax: 50. On an hourly project the numbers are per hour, and budgetUnit says so.

Dates are an age. Workana prints "5 hours ago", never a date, so postedAt is that age turned into a timestamp and postedAtPrecision tells you how far to trust it.

📥 What you give it

{
  "searchQuery": "wordpress",
  "languages": ["es", "pt"],
  "categories": ["it-programming"],
  "clientCountries": ["BR", "AR"],
  "maxProposals": 5,
  "maxItems": 200
}

Everything is optional, but a run needs something to search. Called through the API with an empty input, it writes one free sample row and stops.

FieldWhen left outWhat it is
searchQueryno keywordFree text, in the language of the board you pick. Empty takes the newest projects on those boards.
languagesEnglishen, es, pt. Each board is searched separately.
maxItems501 to 2,000. The cap on projects for the whole run, shared across its searches.
categoriesnoneTop-level category slugs from Workana's own URLs: it-programming, design-multimedia, sales-marketing, writing-translation, admin-support, legal, finance-management, engineering-manufacturing. Each is its own search.
subcategoriesnoneNarrower slugs such as web-development, e-commerce or wordpress-1. Searched on their own, not combined with the categories.
skillsnoneSkill slugs such as adobe-photoshop or logo-design-1. A wrong slug matches nothing rather than erroring, so try one on the site first.
clientCountriesnoneTwo-letter codes for where the client is: BR, MX, AR, CO, US, ES. Each is its own search.
startUrlsnoneWorkana search URLs copied from your address bar. Their filters are read from the URL, and the category, subcategory and country fields are then ignored.
projectTypeanyany, fixed or hourly.
maxProposalsnoneKeep projects with at most this many proposals.
minProposalsnoneKeep projects with at least this many.
postedWithinDaysnone1 to 365. Keep projects posted in the last N days.
proxyConfigurationnot usedOptional. Only for sending the requests through servers of your own, which are used exactly as given.

projectType, the two proposal counts and postedWithinDays are applied after Workana answers, because the site has no filter of its own for them. Projects they drop never reach your dataset and are never charged. With one of them set, a search reads on until enough pass. It gives up after ten pages in a row with none, and a run where nothing passes stops within 25 pages; the status message says how many were read and passed.

📤 What you get back

A real row from a run on 27 September 2026, with the brief cut short:

{
  "projectId": "experienced-wordpress-developer-for-website-page-redesign-and-modernization",
  "title": "Experienced Wordpress Developer for Website Page Redesign and Modernization",
  "projectUrl": "https://www.workana.com/job/experienced-wordpress-developer-for-website-page-redesign-and-modernization",
  "description": "We are a UK-based company seeking an experienced WordPress developer to renew and modernize a specific existing page on ...",
  "category": "IT & Programming",
  "subcategory": "Wordpress",
  "projectDetails": {
    "Category": "IT & Programming",
    "Subcategory": "Wordpress",
    "What is the scope of the project?": "Custom development"
  },
  "skills": ["WordPress", "HTML", "CSS", "PHP", "Responsive Web Design", "User Interface", "Testing"],
  "skillSlugs": ["wordpress", "html", "css", "php", "responsive-web-design", "user-interface", "testing"],
  "projectType": "fixed",
  "budgetText": "USD 100 - 250",
  "budgetMin": 100,
  "budgetMax": 250,
  "budgetCurrency": "USD",
  "budgetUnit": "project",
  "proposalsCount": 45,
  "clientCountryCode": "GB",
  "clientCountry": "United Kingdom",
  "clientNameMasked": "R. S.",
  "clientRating": 0,
  "clientHasRating": false,
  "clientPaymentVerified": false,
  "clientPlan": null,
  "postedRelative": "22 hours ago",
  "postedAt": "2026-09-26T16:25:38.599Z",
  "postedAtPrecision": "hour",
  "isFeatured": false,
  "isUrgent": false,
  "projectLanguage": "en",
  "searchUrl": "https://www.workana.com/jobs?query=wordpress&language=en",
  "page": 1,
  "position": 1,
  "scrapedAt": "2026-09-27T14:25:38.599Z"
}
FieldWhat it is
projectId, projectUrlWorkana's slug for the project, and its page. projectId is stable, so it tells you which projects you already have.
title, descriptionThe title and the client's full brief, markup stripped, paragraphs kept.
category, subcategory, projectDetailsWhere the client filed it, and the extra questions Workana asked them, such as the scope.
skills, skillSlugsThe skill tags as Workana shows them, and their slugs, which go straight into skills on your next run.
projectType, budgetText, budgetMin, budgetMax, budgetCurrency, budgetUnitFixed or hourly, the bracket as printed, and its edges. Null on the open side of an open-ended bracket.
proposalsCountHow many freelancers had pitched when the run read the project.
clientCountry, clientCountryCode, clientNameMaskedThe client's country, and their initials, which is all Workana shows a signed-out visitor.
clientRating, clientHasRating, clientPaymentVerified, clientPlanThe client's rating (0, with clientHasRating: false, when they have none yet), whether their payment method is verified, and their plan badge, which is null for most clients.
postedRelative, postedAt, postedAtPrecisionThe age as Workana printed it, that age as a timestamp, and its precision: exact, hour, day, week, month or year. A week row can be days out either way.
isFeatured, isUrgentWorkana's own featured and urgent flags.
projectLanguage, searchUrl, page, position, scrapedAtWhich board and which search the row came from, where it sat, and when it was read.

🧾 Reading the output

Three kinds of row can share the dataset. Only the first one costs anything.

RowHow to spot itCharged
A projectno _sample and no _diagnostic fieldyes
The sample row_sample: true and charged: false. Only when the input asks for nothing at allno
A diagnostic_diagnostic: true, ok: false, charged: false, and an errorCodeno

Real project rows carry no charged field at all. The sample row has a projectId like a real one, so filter on the flags, not on projectId: drop any row with _sample or _diagnostic and what is left is the projects you paid for.

errorCodeWhat it means
NO_RESULTSThat search kept nothing. Workana had nothing for it, an earlier search in the same run had already turned up everything it found, or your filters kept none of what it read. error says which, and how many projects were read.
BAD_URLA startUrls entry is not a Workana search address.
NO_SEARCHNothing was left to search after reading the input.
RATE_LIMITED, HTTP_ERROR, CHALLENGED, BAD_RESPONSE, API_ERRORWorkana did not give a usable answer for that search. Worth one re-run a few minutes later.

A diagnostic about one search names it in search, and one failed search does not stop the others.

▶️ How to run it

1. Open Workana Jobs Scraper and click Try for free. 2. Type what you are after into Keyword, or leave it empty for the newest projects. 3. Tick the boards you want under Project language. 4. Set Maximum projects. To narrow it, open Narrow the search or Filter the results. 5. Click Start, then download the dataset as JSON, CSV or Excel.

The form arrives with wordpress, English and 50 already filled in, so a run started without editing it is a real search.

💰 How much does it cost?

$1.80 per 1,000 projects, flat on every Apify plan. That is $0.0018 a project.

Not charged: the sample row, diagnostic rows, projects dropped by projectType, the proposal counts or postedWithinDays, and repeats. A project that turns up in two of your searches is charged once. If you set a maximum cost for the run, it stops when that is reached.

💡 What people use it for

  • Finding projects few people have pitched on, with maxProposals. On a busy board those are mostly old posts: on

Spanish "wordpress" on 30 September 2026, 17 of the first 20 with 5 or fewer proposals were two months old or more.

  • Pricing your own services against what clients actually budget, by category and client country.
  • A daily feed of new projects in one category, with projectId to skip the ones you have already seen.
  • Reading which skills clients ask for together, straight off skillSlugs.

🚧 What it does not do

  • It does not return every project Workana counts. About 35 to 42% of each search, measured across nine searches in

September 2026, because Workana serves a signed-out visitor about 7 of the 20 projects on each page. This does not sign in.

  • No client names or contact details. Workana shows initials to signed-out visitors, and that is all there is.
  • No exact budgets. Workana only ever collects the bracket.
  • No posting timestamp, only the age Workana prints, converted and labelled with its precision.
  • No proposals, messages or freelancer profiles. Open projects only.
  • No budget filter. Filter on budgetMin and budgetMax after you export.
  • Nothing past page 99 of a single search. Workana stops serving there.

🧭 Which freelance scraper do you need?

If you wantUse
Open projects on Workana, with budgets and proposal countsThis one
Projects on Freelancer.com, with the bid count and the average bidFreelancer.com Scraper
The other side of the market: the gigs sellers offer on FiverrFiverr Scraper
Salaried jobs in Brazil, with the salary Catho showsCatho Jobs Scraper
Remote jobs, with the region you must live inRemotive Jobs Scraper

❓ Questions people ask

Do I need a Workana account or an API key? No. It reads the same public board a signed-out visitor sees.

Why do I get fewer projects than the search says it found? Because Workana shows a signed-out visitor only part of each search while counting all of it. Tick more languages and add categories or countries to reach more.

Is postedAt accurate? To the hour on anything from the last day, to the day within a week, coarser after that. postedAtPrecision says which on every row.

Can I paste a search I built on the site? Yes. Copy the address bar into startUrls and the keyword, category, skills, country and language are read out of it.

Is scraping Workana legal? These are public project listings, and Workana masks client names itself. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the input you used and the run ID, and the errorCode on any diagnostic row.