Jobs namespace

Reference for job discovery, details, similar jobs, applications, and resume uploads.

Use board.jobs to read published jobs and to run the native application flow. Job discovery and detail reads are public. apply accepts either a candidate session or an allowed guest application, while myApplication requires a candidate session.

Shared behavior

Every method returns the Board API wire body without reshaping it. A non-2xx response throws BoardApiError; inspect status, code, details, and requestId instead of matching the message.

The final FetchOptions argument passes signal, headers, cache, next, cf, and other fetch options through to fetch. List and search results include object, url, hasMore, nextCursor, and data. Job catalog responses can also include count, limit, offset, and gatedCount.

board.jobs.collectionChoices

List active entries available to a collection field on the job form. A collection can be shared with company and talent profiles; this method returns choices only for fields configured on jobs.

The response contains data entries with id, name, and an optional logoUrl, plus nextCursor. Follow the cursor until it is null. Pass the selected entry IDs when saving collection values through the job posting API. Collection fields on retrieved jobs are available as resolvedCollectionFields; use those resolved names and details for display.

board.jobs.list

List published jobs. The default relevance sort uses the board’s featured ranking.

JobsListQuery accepts:

FieldTypeBehavior
cursorstringOpaque nextCursor from the previous response.
limitnumberPage size from 1 to 100.
offsetnumberJobs to skip. It takes precedence over cursor; offset + limit cannot exceed 10,000.
companyIdstring[]Up to 10 company IDs, matched with OR.
remoteOptionRemoteOption[]on_site, hybrid, or remote.
employmentTypeEmploymentType[]Built-in employment types, matched with OR. A built-in matches jobs that have no custom employment type.
customEmploymentTypestring[]Custom employment type keys from board.context().jobForm.employmentType.customTypes, matched with OR and combined with employmentType.
senioritySeniority[]Seniority levels, matched with OR.
sortJobSortrelevance, newest, or salary_high. An explicit sort unpins featured jobs.
locationstringPlace slug. Returns jobs in the place and the places inside it (a region includes its cities). An unresolvable place is ignored.
radiusnumberWidens a city or locality location to jobs whose own city or locality is within this many km of it. 1–250, decimals allowed (8.05 is 5 mi). Omit it for the place only. Ignored for region and country places and without location.
categorystringCategory slug for a programmatic jobs page. An unresolvable category returns 404.
skillstringSkill slug for a programmatic jobs page. An unresolvable skill returns 404.
fieldsstringOnly +description is supported. It adds HTML description to each otherwise-slim card.

A location search has no default distance: without radius it returns jobs in the place only. Hosted city pages and the starter apply a default by passing it: 25 mi (about 40.2 km) in miles countries, 50 km elsewhere. Use searchRadiusOptions, defaultSearchRadius, and distanceUnitForCountry from @cavuno/board/format to build the same choices; see Add a search distance to city pages.

The response is JobCardListEnvelope: data contains PublicJobCard values and relatedSearches can suggest category or skill pages. relatedSearches[].count is how many jobs in the returned page carry that term — not the board-wide total. For homepage “browse by category” tiles, use board.taxonomy.categories.list({ sort: 'jobCount' }).

Each card carries customFieldValues for the job and company.customFieldValues for its company, keyed by field key and {} when empty. Cards include only single-select, multi-select, boolean and number values; select values are option keys. Text values are only on the full job and company, and private company fields are never included. Resolve job labels against board.context().customFields.job and company labels against board.profileFields.retrieve('company'). Every method that returns job cards (list, search, similar, company jobs, embed, recommended and saved jobs) uses the same shape.

Handle pagination_invalid_cursor, pagination_offset_too_large, taxonomy not-found errors, and search_unavailable. gatedCount reports jobs hidden from the current viewer; do not present it as another page of accessible results.

Related methods: board.jobs.search, board.companies.listJobs, and paginate.

board.jobs.retrieve

Retrieve one published job by slug.

PublicJob includes job and company identity, description, application URL, employment and salary fields, resolved categories and skills, office locations, place hierarchy, remote-work requirements, custom-field values, and canonical public links. The SDK URL-encodes jobSlug and does not resolve custom-field labels; match customFieldValues keys to board.context().customFields.job. When a job uses one of the board's custom employment types, customEmploymentType is { key, label }: show its label in place of employmentType, which holds its built-in Google equivalent. It is null otherwise.

The country-gated Apply protocol is an explicit starter capability, not a global SDK default. A compatible starter passes this option when retrieving the job and throughout its Apply flow:

The method returns 404 when the board is unavailable or the slug does not identify a published job. Draft, pending-approval, expired, and archived jobs are not returned by this public read.

Related methods: board.jobs.similar, board.jobs.apply, and board.context for custom-field definitions.

board.jobs.search

Search published jobs with free text, facets, date bounds, and geo filters.

JobsSearchBody accepts optional query text up to 200 characters, sort, cursor, limit, offset, and filters. Filter arrays accept up to 10 values. filters.publishedAt accepts ISO 8601 gte and lte bounds; filters.location and filters.radius follow the list method’s geo rules.

filters.customFields matches the job's own custom fields (board.context().customFields.job) and filters.companyCustomFields matches the public profile fields of the job's company (board.profileFields.retrieve('company')). Both take CustomFieldFilter clauses of a field key and its accepted values (option keys, booleans, or numbers): clauses are AND-matched and values within one clause are OR-matched, up to 10 clauses of 10 values each. The two lists never share keys, so a job field and a company field may have the same key. An unknown or private key, or an option key the field does not define, returns invalid_filter. See Custom field filters and badges.

This is a POST request, but it is a read operation. Invalid filters or pagination return 400; an unavailable search core returns search_unavailable with status 503.

Related methods: board.jobs.list and board.taxonomy.places.list.

board.jobs.similar

Return jobs related to a published job. The result excludes the source job and jobs at the same company.

query.limit accepts 1–20 and defaults to 5.

An empty data array is a valid result. A missing source job returns 404; similarity infrastructure failure returns search_unavailable with status 503.

Related methods: board.jobs.retrieve and board.companies.similar.

board.jobs.apply

Submit a native application. Signed-in candidates can omit name and email; guests must supply them and can apply only when the board permits guest applications. Repeating the same application is idempotent and returns the existing Application.

ApplyBody contains optional name, email, and coverNote fields.

The returned Application includes its ID, candidate-facing status, timestamps, candidate facts, optional resume filename, and a job summary. Handle applications_guest_not_allowed (403), applications_job_not_found (404), and applications_external_apply_only (422). Use the job’s applicationUrl or the resolveApplyAction helper to branch between native and external apply before submitting.

Related methods: board.jobs.uploadApplicationResume and board.jobs.myApplication.

board.jobs.prepareApplyApproval

Prepare the signed-in Candidate's browser-edge country approval for a native job whose applyAction is gateway_native. Call this from the board server with Candidate authorization and a server-owned session key.

The result is either { kind: 'not_required' } or an approval_required plan containing an opaque approvalUrl and expiry. For a required plan, the Candidate browser POSTs directly to that URL with credentials: 'omit' and no body. Pass the returned receipt id and the same key to board.jobs.apply as approvalReceipt and approvalSessionKey.

Pass x-cavuno-board-capabilities: apply-gateway-v1 in options.headers when preparing and when making the final board.jobs.apply call. The SDK does not add this header automatically because doing so would activate the protocol on incompatible boards. This receipt flow is signed-in only; the current starter sends anonymous visitors through sign-in before native preparation, while guest-native API Apply retains its legacy behavior.

board.jobs.createApplyIntent

Create a short-lived opaque hand-off for gateway_external. Framework starters call this from a board-local POST and return a browser 303 to the resulting gatewayUrl; never render the gateway URL as a crawlable anchor.

The method accepts no destination. Cavuno resolves the known job's stored destination only after the dedicated gateway allows the request. Pass x-cavuno-board-capabilities: apply-gateway-v1 in options.headers; callers that do not opt in receive the legacy not-found behavior.

board.jobs.uploadApplicationResume

Attach a resume to an existing native application. The SDK creates the multipart FormData body.

Signed-in candidates target their own application and omit applicationId. A guest passes the ID returned by board.jobs.apply.

Empty or malformed files return applications_resume_invalid_file with status 400. Files over 10 MB return 413. Unsupported types or a magic-byte mismatch return 415. A missing or inaccessible application returns applications_not_found with status 404. Do not set content-type yourself; the runtime must add the multipart boundary.

Related method: board.jobs.apply.

board.jobs.myApplication

Retrieve the authenticated candidate’s application for one job.

This method requires a board-user access token. It returns 401 for a missing, invalid, or expired token; 403 when the token belongs to another board; 404 for a missing board, job, or application; and 429 when the per-user rate limit is exceeded. A 404 application is an expected “not applied” state, not necessarily a broken job page.

Related methods: board.jobs.apply and board.me.applications for the candidate’s full application history.