search_jobs
Search nomado24's remote/hybrid job board. Read-only, free, attribution required (see structuredContent.attribution). Answers over one of two contracts, chosen by the arguments you send. Send only q/language/page/per_page and you get the legacy v1 result shape with page-based paging. Send any structured filter (country, applicant_region, work_arrangement, employment_type, seniority, skills, salary_min/max, published_after, verified_after, source, company, sort, include_total) or a cursor and you get the v2 contract: richer job objects, per-posting provenance (salaryOrigin, firstSeenAt, lastVerifiedAt, verification.method, updatedAt), a corpus changeWatermark, a snapshotId and keyset paging via pagination.nextCursor. The two are mutually exclusive: page plus a structured filter is refused rather than silently resolved. Structured results omit the posting body and the per-field dataOrigin to stay cheap to read; call get_job for those. A filter nomado24 cannot answer honestly is refused with the reason, never answered with the unfiltered corpus. For the same reason pagination.total is null (totalRelation 'not_computed') whenever a post-projection filter (skills, seniority, salary bounds, employment_type=unknown) is in play — a null total is deliberate, not an error.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text search over job title/company/tags | |
| page | No | 1-based page number, default 1 | |
| sort | No | One of published_desc, verified_desc, salary_asc, salary_desc. Default published_desc | |
| cursor | No | Continuation cursor from pagination.nextCursor. Send it ALONE (with per_page at most), never alongside filters: the cursor already carries the filter set it traverses | |
| skills | No | Skill slugs, lowercase kebab-case (react, node-js) | |
| source | No | Feed/source ids, lowercase kebab-case | |
| company | No | Company name, exact match, case-insensitive. Aggregated postings carry no verified employer identity | |
| country | No | Where the ROLE sits, ISO 3166-1 alpha-2 uppercase (DE, US) | |
| language | No | Filter by job content language | |
| per_page | No | Results per page, 1-25, default 20 | |
| seniority | No | Seniority. 'unknown' means the field is absent in the response, not a stored value | |
| salary_max | No | Upper bound in normalized ANNUAL EUR (gross) | |
| salary_min | No | Lower bound in normalized ANNUAL EUR (gross). Matches jobs whose salary interval overlaps it | |
| skills_match | No | How to combine skills. Requires skills | |
| include_total | No | Whether to compute a total. 'exact' returns a number only when the database saw the whole predicate. With a post-projection filter active (skills, seniority, salary_min/salary_max, employment_type=unknown) the total is withheld: total is null and totalRelation is 'not_computed', because the base count would answer a different question than the one asked. Only at the count ceiling does 'exact' downgrade to 'estimated'. | |
| verified_after | No | RFC 3339 date-time. Compares against the SAME value the response reports as lastVerifiedAt | |
| employment_type | No | Employment type. 'unknown' means the field is absent in the response, not a stored value | |
| published_after | No | RFC 3339 date-time, e.g. 2026-08-01T00:00:00Z | |
| salary_currency | No | ISO 4217. Only EUR: every salary is normalized to EUR at ingest and no conversion is performed | |
| applicant_region | No | Where a CANDIDATE may be: WORLDWIDE, EU or an ISO 3166-1 alpha-2 code. EEA/DACH/EMEA are refused, nomado24 does not classify them | |
| work_arrangement | No | Work arrangement. The board serves remote and hybrid postings only, so these are the only two values |