ActorStack.dev

Every field in a Workana project row, with useful-coverage rates

55 fields measured on 718 projects across 12 subcategories and 8 countries — reported as how often a field carries useful information, not how often the key exists.

By Oswaldo Carabano8 min read

Short answer

A Workana project row carries 55 fields: identity, description, budget parsed into min, max, currency, unit and type, client country and reputation signals, proposal count, publication time, skills, taxonomy, and the structured answers the client gave Workana's posting form. Coverage was measured on 718 projects across 12 subcategories and 8 countries, and it is reported as how often a field is useful rather than how often the key is present.

Key points

  • The identity, description, budget-string, country, proposal-count and publication fields are at 100%.
  • `budget_min` is 75.0% and the gap is mostly budgets that have no lower bound, not parse failures.
  • `client_rating` is 19.4% useful although present on 100% of rows, because 80.5% of values mean "no history".
  • Four fields are deliberately absent: `isUrgent`, `isCompany` and `isInvite` were false in all 718 projects, and `shortDescription` was empty.
  • The posting form's answers are extracted into their own fields, with the subcategory-specific tail in `extra_attributes`.
On this page8 sections

Fifty-five fields per project, measured on 718 projects across 12 subcategories and 8 countries. Coverage here is reported as how often a field carries useful information, which is not the same as how often the key exists — and on this dataset the difference is large.

How to read this reference

A percentage is useful coverage. `client_rating` is present on 100% of rows and reported at 19.4%, because 80.5% of its values encode “no history”. That convention is the whole reason this reference is worth reading rather than skimming.

Identity and description

FieldUsefulNotes
slug100%The join key across snapshots.
url100%Canonical project URL.
title100%As published, in the requested locale.
description_text100%Posting-form block removed, because it comes out as fields.
description_html100%Workana's original, untouched.
description_has_contact100%Flags descriptions where the client published contact details.
locale100%Which language Workana rendered. Decides how the budget parses.

description_text deliberately no longer repeats the posting-form block, because that metadata comes out as its own fields — leaving it in the text too would inflate the largest field in the dataset for no gain. description_html keeps the original for anyone who wants it.

Budget

Eight fields, and they have to be read together: budget_raw, budget_min (75.0%), budget_max (95.6%), budget_currency, budget_unit, budget_type, budget_open_ended and is_hourly (11.7% true).

The 75.0% on budget_min is not a parse failure — a quarter of budgets have no lower bound. Group by budget_type before comparing anything.

Client signals

client_name_masked (100%, masked by Workana itself), client_country_code and client_country_name (100%), client_rating (19.4% useful), client_has_rating, client_rating_raw, client_payment_verified (18.9% true) and client_plan (0.4% — too rare to build on).

Timing and competition

total_bids with total_bids_raw, posted_at with posted_at_raw, posted_at_approximate and posted_age_hours, plus deadline_days (1.9%) and last_client_message_raw (51.7%).

posted_age_hours is the field that makes total_bids usable, because competition arrives within hours and a raw count without an age is not comparable across projects.

Taxonomy and skills

category and category_name at 100%, subcategory and subcategory_name at 100%, skills and skill_slugs at 98.6%, plus matched_query and matched_skill_slug recording which query produced the row.

category is always filled even when you query by subcategory or by skill: the parent-child relationship comes from Workana's own taxonomy rather than from a lookup table that could drift.

The posting form's answers

Workana appends the client's answers to its posting form at the end of every description — structured data hiding inside prose. The Actor extracts it:

FieldPresentNotes
project_scope68%"Create a new custom site", "Small bug or change"…
project_size30.5%Small / Medium / Large.
engagement_type, required_availability, time_requiredvariesBy subcategory.
client_needs, client_currently_has, required_platformsvariesBy subcategory.
extra_attributesvariesThe subcategory-specific tail, with original labels.

extra_attributes is by design, not a gap. Workana asks questions specific to each subcategory — logo type, app type, payment processor — and that tail is endless. The cross-cutting questions get their own columns; the rest travels here with its original label, so nothing is lost and the schema does not grow columns that are almost always empty.

Fields that are deliberately absent

isUrgent, isCompany and isInvite were false in all 718 measured projects — an anonymous visitor never sees them set — and shortDescription was empty throughout.

A column with one constant value is not data, so they are not in the output. Including them would add four fields to every row and a plausible-looking filter that can only ever return nothing.

Frequently asked questions

What does "useful coverage" mean?
How often a field carries information you can act on, rather than how often the key exists. `client_rating` is present on every row and useful on 19.4% of them, and the documented figure is the second one.
Why are some fields missing from the output entirely?
Because they were constant. `isUrgent`, `isCompany` and `isInvite` were false in all 718 measured projects — an anonymous visitor never sees them set — and a column with one value is not data. `shortDescription` was empty throughout.
What is in `extra_attributes`?
The subcategory-specific tail of Workana's posting form, with its original labels. Workana asks different questions per subcategory — logo type, app type, payment processor — and that tail is endless, so the cross-cutting answers get their own columns and the rest travels here rather than adding columns that are almost always empty.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Operator claimchecked 19 Aug 2026
    Workana Projects & Client Demand Scraper — Actor README and input schemaActorStack / Apify Store
  2. Platform docschecked 18 Aug 2026
    Dataset storageApify
  3. Platform docschecked 18 Aug 2026
    Actor input schemaApify
A laptop screen showing a plain text-mode terminal with a command prompt.
WorkanaReference

Skill slugs

`react` returns zero projects with HTTP 200. `react-js` returns hundreds. A wrong slug is the worst kind of failure, so it gets checked before the run rather than after.

5 min
A white measuring tape curving across a dark background, showing the numbers 15 to 45.
WorkanaMeasured

Proposal velocity

Measured across 401 projects: competition on a freelance listing has a half-life measured in hours, which makes a stale row a wrong row.

6 min
A laptop showing lines of code on a wooden desk in a dimly lit room.
WorkanaGuide

Scrape Workana

A walkthrough of extracting LATAM freelance demand: the five filters that work, the coverage ceiling nobody can exceed, and why the language setting changes what a budget means.

9 min