Filter reference
One filter object is used in three places: search_jobs takes it as filters, save_search takes it as prefilter, and check_prefilter validates one and tells you how many postings it would catch. This page is that language. There are 48 fields.
A field name that is not in the catalogue is refused, not quietly ignored — so a typo fails loudly rather than widening your filter. Read Conventions before writing your first one: three of them are not guessable and all three produce a refusal you cannot explain from the field alone.
The five value shapes
Each field has a type, and the type decides the envelope its value takes. Text is the odd one out and worth reading twice: the operator IS the key, and there is no operator field at all.
text
the operator is the key; give one or more of them
Operators: all_words, any_words, exact_phrase, none_words
{
"<field>": {
"all_words": "python scraper",
"none_words": "wordpress"
}
}numeric
{"operator": <one of operators>, "value1": "<number as string>"} — "between" also needs value2
Operators: between, equals, greater_than, greater_than_or_equals, less_than, less_than_or_equals
{
"<field>": {
"operator": "greater_than",
"value1": "1000"
}
}select
{"operator": <one of operators>, "values": [<string>, …]}
Operators: equals, equals_all, not_equals, not_equals_any
{
"<field>": {
"operator": "equals",
"values": [
"<one of options>"
]
}
}boolean
{"value": "Yes"|"No"} — no operator key
{
"<field>": {
"value": "Yes"
}
}date
{"operator": <one of operators>, "date1": "YYYY-MM-DD"} — "between" also needs date2
Operators: after, before, between, equals
{
"<field>": {
"operator": "after",
"date1": "2026-01-01"
}
}Conventions
Three rules that no single field entry could tell you, and that produce refusals which make no sense until you know them.
- type names — textnumericselectbooleandate
- numbers are strings — numeric values go in as STRINGS — value1: "1000", not 1000. This is the v1 filter format the saved-search engine reads, and a real number is refused.
- booleans are yes no — boolean values are the strings "Yes" and "No", not true and false, for the same reason.
- options are authoritative — where a field carries `options`, that list is what the validator accepts. A field's prose `description` comes from the source system and may name values this corpus does not hold — engagement_weeks and hourly_budget_type both do. Filter on `options`, never on the sentence.
- bounds are observed not enforced — `min` and `max` are the range currently present in the corpus, not a constraint. A filter outside them is accepted and matches nothing; check_prefilter warns when a clause cannot match.
Combining filters
Several fields in one object are ANDed. There is no OR across fields; to widen, loosen a clause rather than adding another. Within a text field, any_words is the OR.
{
"_combined|title|description|skills": {
"exact_phrase": "React Native"
},
"buyer_payment_verified": {
"value": "Yes"
},
"total_spent": {
"operator": "greater_than",
"value1": "5000"
}
}Run it through check_prefilter before saving. It returns matched, and a filter that is valid and matches nothing looks exactly like a quiet market — a saved search built on one fires forever without telling you it was the filter. It also returns warnings when a clause cannot match at all, such as a numeric comparison outside the range the corpus holds.
Every field
Grouped by how often they are actually useful, which the catalogue itself ranks. min and max are the values currently present in the corpus, not limits — a filter outside them is valid and matches nothing.
Most used (17)
| field | type | accepts |
|---|---|---|
avg_hourly_rateClient Avg Hourly Rate | numeric | Average hourly rate this client typically pays freelancers. Based on their historical hiring patterns. |
buyer_feedback_countBuyer Feedback Count | numeric | observed 0 to 22131 |
buyer_payment_verifiedBuyer Payment Verified | boolean | Boolean flag indicating whether the client has verified their payment method on Upwork. |
buyer_scoreBuyer Score | numeric | observed 0 to 5 |
category_nameCategory Name | select | Accounting & Consulting · Admin Support · Customer Service · Data Science & Analytics · Design & Creative · Engineering & Architecture · IT & Networking · Legal (+4 more) |
experience_levelExperience Level | select | Entry_level · Expert · Intermediate |
hire_rateClient Hire Rate | numeric | Percentage of freelancers the client has hired from total applications. Higher rates indicate clients who actively hire rather than just browse. |
hiresHires | numeric | observed 0 to 39261 |
named_buyerOnly named buyers | boolean | Keep only jobs whose client we've identified by name (resolved via BuyerLookup) — established, researchable clients, not anonymous/brand-new ones. |
priceBudget/Price - Fixed-price | numeric | observed 0 to 1000000 |
price_maxHourly Rate - Max | numeric | observed 3 to 999 |
price_minHourly Rate - Min | numeric | observed 3 to 500 |
searchKeyword search | text | Search across title + description + skills together — the main 'what work' filter. |
skillsSkills | text | Comma-separated list of required skills and technologies for the job as specified by the client. |
subcategory_nameSubcategory Name | select | 3D Modeling & CAD · AI & Machine Learning · AI Apps & Integration · Accounting & Bookkeeping · Art & Illustration · Audio & Music Production · Blockchain, NFT & Cryptocurrency · Branding & Logo Design (+57 more) |
titleJob Title | text | The job posting title as written by the client. Contains the main description of what work needs to be done. |
total_spentTotal Spent | numeric | observed 0.08 to 22117578.16 |
Situational (17)
| field | type | accepts |
|---|---|---|
active_hiresActive Hires | numeric | observed 0 to 4835 |
ai_explicit_mention_of_agencyExplicit Mention Of Agency | select | Agencies Welcome · No Agencies · No Mention |
client_locationClient Location | select | United States · United Kingdom · India · USA · Australia · Canada · Germany · Pakistan (+313 more) |
contract_to_hireContract To Hire | boolean | Whether the job has potential to convert from contract to permanent employment. |
descriptionDescription | text | Full job description text as written by the client. Contains detailed requirements, expectations, and project scope. |
engagement_labelEngagement Label | select | 1 to 3 months · 3 to 6 months · Less than 1 month · More than 6 months |
engagement_weeksEngagement Weeks | select | 3 · 9 · 18 · 52 |
industryIndustry | select | Aerospace · Agriculture & Forestry · Art & Design · Automotive · Aviation · Education · Energy & Utilities · Engineering & Architecture (+20 more) |
job_is_premiumJob Is Premium | boolean | Boolean flag indicating whether job is premium applies to this job. |
jobs_postedJobs Posted | numeric | observed 0 to 39636 |
open_jobsOpen Jobs | numeric | observed 0 to 415 |
price_typePrice Type | select | Fixed-price · Hourly |
qual_portfolio_requiredQual Portfolio Required | boolean | Whether the client requires a portfolio or work samples to apply. |
qual_pref_englishQual Pref English | select | ANY · CONVERSATIONAL · FLUENT · NATIVE |
qual_rising_talentQual Rising Talent | boolean | Whether the job is open to Upwork Rising Talent (newer freelancers with potential). |
qual_typeQual Type | select | AGENCY · ANY · INDEPENDENT |
total_hoursTotal Hours | numeric | observed 0 to 11820879 |
Advanced (14)
| field | type | accepts |
|---|---|---|
buyer_contract_dateBuyer Contract Date | date | Date when the client first registered their account on Upwork. Indicates how long the client has been active on the platform. |
category_idCategory ID | select | 531770282580668416 · 531770282580668417 · 531770282580668418 · 531770282580668419 · 531770282580668420 · 531770282580668421 · 531770282580668422 · 531770282580668423 (+4 more) |
client_invites_sentClient Invites Sent | numeric | observed 0 to 349 |
client_positions_to_hireClient Positions To Hire | numeric | observed 0 to 99 |
client_total_applicantsApplicants (this job) | numeric | observed 0 to 67 |
client_total_hiredHired (this job) | numeric | observed 0 to 41 |
client_total_invitedInvited (this job) | numeric | observed 0 to 52 |
client_unanswered_invitesUnanswered invites | numeric | observed 0 to 302 |
company_sizeCompany Size | select | 0 · 1 · 10 · 100 · 1000 · 10000 · 2 · 500 (+1 more) |
hourly_budget_typeHourly Budget Type | select | DEFAULT · MANUAL · NOT_PROVIDED |
qual_min_hoursQual Min Hours | select | 0 |
qual_min_hours_weekQual Min Hours Week | select | 0 · 10 · 30 · 40 |
qual_min_success_scoreQual Min Success Score | select | 0 · 80 · 90 |
subcategory_idSubcategory ID | select | 531770282584862724 · 531770282584862725 · 531770282584862726 · 531770282584862728 · 531770282584862730 · 531770282584862733 · 531770282589057024 · 531770282589057025 (+56 more) |