Workana Jobs Scraper
Scrape Workana freelance projects: title, brief, budget, skills, proposals, client country and rating. English, Spanish and Portuguese boards.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchQuery,languages,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export 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 for | When | Price |
|---|---|---|
| Project returned | One 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
| Field | What it does | Type |
|---|---|---|
searchQuery | Free-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 |
languages | Workana 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 |
maxItems | Hard 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 |
categories | Workana'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 |
subcategories | More 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 |
skills | Only 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 |
clientCountries | Two-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 |
startUrls | Paste 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 |
projectType | Fixed-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 |
maxProposals | Keep 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 |
minProposals | Keep only projects with at least this many proposals. Useful the other way round, for reading what a busy brief looks like. | integer |
postedWithinDays | Keep 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:
titlecategoryprojectTypebudgetTextproposalsCountclientCountryclientRatingpostedRelativeskillsprojectLanguageprojectUrlExport 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
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.
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.
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.
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.
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.
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.
Where this tool sits
- Categories
- 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.
| Input | A keyword, Workana categories, skills or client countries, or Workana search URLs |
| Output | One row per open project |
| Ceiling | 2,000 projects per run, 99 pages per search |
| Account needed | None |
| 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.
| Field | When left out | What it is |
|---|---|---|
searchQuery | no keyword | Free text, in the language of the board you pick. Empty takes the newest projects on those boards. |
languages | English | en, es, pt. Each board is searched separately. |
maxItems | 50 | 1 to 2,000. The cap on projects for the whole run, shared across its searches. |
categories | none | Top-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. |
subcategories | none | Narrower slugs such as web-development, e-commerce or wordpress-1. Searched on their own, not combined with the categories. |
skills | none | Skill slugs such as adobe-photoshop or logo-design-1. A wrong slug matches nothing rather than erroring, so try one on the site first. |
clientCountries | none | Two-letter codes for where the client is: BR, MX, AR, CO, US, ES. Each is its own search. |
startUrls | none | Workana search URLs copied from your address bar. Their filters are read from the URL, and the category, subcategory and country fields are then ignored. |
projectType | any | any, fixed or hourly. |
maxProposals | none | Keep projects with at most this many proposals. |
minProposals | none | Keep projects with at least this many. |
postedWithinDays | none | 1 to 365. Keep projects posted in the last N days. |
proxyConfiguration | not used | Optional. 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"
}
| Field | What it is |
|---|---|
projectId, projectUrl | Workana's slug for the project, and its page. projectId is stable, so it tells you which projects you already have. |
title, description | The title and the client's full brief, markup stripped, paragraphs kept. |
category, subcategory, projectDetails | Where the client filed it, and the extra questions Workana asked them, such as the scope. |
skills, skillSlugs | The skill tags as Workana shows them, and their slugs, which go straight into skills on your next run. |
projectType, budgetText, budgetMin, budgetMax, budgetCurrency, budgetUnit | Fixed or hourly, the bracket as printed, and its edges. Null on the open side of an open-ended bracket. |
proposalsCount | How many freelancers had pitched when the run read the project. |
clientCountry, clientCountryCode, clientNameMasked | The client's country, and their initials, which is all Workana shows a signed-out visitor. |
clientRating, clientHasRating, clientPaymentVerified, clientPlan | The 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, postedAtPrecision | The 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, isUrgent | Workana's own featured and urgent flags. |
projectLanguage, searchUrl, page, position, scrapedAt | Which 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.
| Row | How to spot it | Charged |
|---|---|---|
| A project | no _sample and no _diagnostic field | yes |
| The sample row | _sample: true and charged: false. Only when the input asks for nothing at all | no |
| A diagnostic | _diagnostic: true, ok: false, charged: false, and an errorCode | no |
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.
errorCode | What it means |
|---|---|
NO_RESULTS | That 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_URL | A startUrls entry is not a Workana search address. |
NO_SEARCH | Nothing was left to search after reading the input. |
RATE_LIMITED, HTTP_ERROR, CHALLENGED, BAD_RESPONSE, API_ERROR | Workana 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
projectIdto 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
budgetMinandbudgetMaxafter you export. - Nothing past page 99 of a single search. Workana stops serving there.
🧭 Which freelance scraper do you need?
| If you want | Use |
|---|---|
| Open projects on Workana, with budgets and proposal counts | This one |
| Projects on Freelancer.com, with the bid count and the average bid | Freelancer.com Scraper |
| The other side of the market: the gigs sellers offer on Fiverr | Fiverr Scraper |
| Salaried jobs in Brazil, with the salary Catho shows | Catho Jobs Scraper |
| Remote jobs, with the region you must live in | Remotive 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.