Input schema (server-provided preview — do not copy)
{
"type": "object",
"properties": {
"sort": {
"enum": [
"relevance",
"newest",
"salary"
],
"type": "string",
"description": "Default relevance."
},
"limit": {
"type": "number",
"description": "Rows per page, 1-60. Default 20."
},
"query": {
"type": "string",
"description": "Search terms. Supports exclusions: 'engineer -senior'."
},
"offset": {
"type": "number",
"description": "Paging offset — pass back the previous response's nextOffset."
},
"remote": {
"type": "boolean",
"description": "Only remote-friendly roles."
},
"vendor": {
"type": "string",
"description": "Comma list of hiring-system vendors (greenhouse, lever, ashby, …), max 8."
},
"country": {
"type": "string",
"description": "ISO-2 codes, comma-separated, max 5. E.g. 'US,GB'."
},
"category": {
"type": "string",
"description": "Comma list of category slugs (see board_stats for the live set), max 3."
},
"location": {
"type": "string",
"description": "City/state/metro, e.g. 'texas', 'NYC', 'berlin'."
},
"maxYears": {
"type": "number",
"description": "Only roles asking for at most N years of experience."
},
"payBasis": {
"enum": [
"hourly",
"salaried"
],
"type": "string",
"description": "Restrict to hourly or salaried pay."
},
"workMode": {
"type": "string",
"description": "Comma list of: remote, hybrid, onsite."
},
"companies": {
"type": "string",
"description": "Scope to specific employers: a comma list of companyToken values from job cards (or from the site's employer pages). An employer the board does not carry simply matches nothing; tokens the board drops are named in ignoredFilters."
},
"salaryMax": {
"type": "number",
"description": "Annual USD-equivalent salary ceiling."
},
"salaryMin": {
"type": "number",
"description": "Annual USD-equivalent salary floor. Note: only ~13% of postings state pay."
},
"department": {
"type": "string",
"description": "Substring match on the employer's own department/team text."
},
"experience": {
"type": "string",
"description": "Comma list of seniority bands the POSTING asks for: entry, mid, senior, expert. Rows whose band could not be read are excluded — use maxYears for the candidate's own side of the question."
},
"maxAgeDays": {
"type": "number",
"description": "Only postings from the last N days (1-30)."
},
"postedAfter": {
"type": "string",
"description": "ISO-8601 instant; only postings the EMPLOYER dated after it. Undated rows fall out of this window (unlike maxAgeDays, which falls back to when the board first saw a posting), so this is the strict form of 'new'."
},
"hasStatedPay": {
"type": "boolean",
"description": "Only postings that state a salary (excludes the ~87% that don't)."
},
"agentReadyOnly": {
"type": "boolean",
"description": "Only jobs the apply agent can submit to on the user's behalf."
},
"employmentType": {
"type": "string",
"description": "Comma list of: full_time, part_time, contract, temporary, internship."
},
"excludeAgencies": {
"type": "boolean",
"description": "Hide postings from staffing/recruiting agencies (their job cards carry agency:true). Agencies are served by default; this is an opt-in narrowing."
},
"includeUnstatedPay": {
"type": "boolean",
"description": "WIDENS an active salaryMin/salaryMax band to also admit postings that state no pay at all. Inert with no band set (unpriced rows are already included). The response says salaryStatedOnly when a band is narrowing without it."
}
}
}