Skip to main content
Three official clients are published for the jobs API. As of 4.0.0 they sit on the same version and cover the same surface, so pick whichever matches your stack. Auto Apply has its own TypeScript client, described below.
4.0.0 is a breaking release. The EmploymentType and CompensationPeriod value sets changed to the values the API actually accepts, and the retired Auto Apply sub-client was removed. Pin an exact version and read the notes below before upgrading from 3.x — or, for Node, from 1.x.
Auto Apply is not part of jobo-enterprise. The live contract is profileless and synchronous, and it has a dedicated TypeScript client: @jobo-ai/autoapply. Earlier jobo-enterprise versions exposed a create_profile / start_session / set_answers model against routes that no longer exist; 4.0.0 removes it.
You do not need a client library. Every endpoint is plain HTTPS with a single header, and the curl examples in these docs work with any language.

Upgrading to 4.0.0

Three things can change behaviour in code that already works. Filter values. EmploymentType members now serialize the canonical full-time / part-time instead of full_time / part_time. The index matches both spellings, so this changes what goes over the wire rather than what you get back. freelance and intern are new members — those values exist in the data and the old enums could not express them. CompensationPeriod members were renamed to the values the API actually emits (hourly, yearly, per-diem, …); the old ones (hour, day, year) matched nothing. Auto Apply. client.auto_apply / client.autoApply / client.AutoApply no longer exists. Nothing on it worked — every method targeted a removed route. Its replacement is the dedicated @jobo-ai/autoapply package. Node only. npm was serving 1.0.1, which exposed flat methods (searchJobs, getJobsFeed). 4.0.0 is the sub-client shape the other two clients have always had: client.search.search(...), client.feed.getJobs(...).

Python

The client is organised into sub-clients by resource. Every method takes keyword arguments only.
JoboClient(api_key, *, base_url="https://connect.jobo.world", timeout=30.0, feed_timeout=120.0, httpx_client=None). Use AsyncJoboClient for the async equivalent.

Auto-pagination

iter_jobs and iter_expired_job_ids handle pages and cursors for you.

Incremental sync

updated_after is the watermark for picking up changes after a backfill. Scans page by immutable creation time by default (stable_scan), so records cannot shift across page boundaries mid-read.

Errors

429 and 503 are retried with bounded backoff honouring Retry-After. Everything else raises, deriving from JoboError:
Every exception carries the problem code when the API supplies one, alongside status_code, detail, and the raw response_body.

Node.js / TypeScript

Zero runtime dependencies — it uses the built-in fetch, so it needs Node 18+ and also runs in Bun, Deno, and browsers. Options are camelCase; wire fields on the response objects stay snake_case.
new JoboClient({ apiKey, baseUrl?, timeout?, feedTimeout?, fetch? }). The iterators are async generators:

.NET

Targets net6.0 and net8.0. Register it with DI via services.AddJoboClient(...). Feed enumeration returns IAsyncEnumerable<Job>:
If you pass your own HttpClient instead of JoboClientOptions, its Timeout governs every request — set it to at least 120 seconds when you use the feed endpoints.

Auto Apply (TypeScript)

@jobo-ai/autoapply covers the whole Auto Apply surface and drives the synchronous application loop for you. Zero runtime dependencies; Node 20+, Bun, Deno, and edge runtimes. Properties are snake_case, matching the wire format and these docs exactly. Version 2 targets contract 2026-08-31. Its field union requires only the stable base properties and makes options, constraints, format, sensitivity, and repeating-group metadata conditional, matching their wire presence.
run() handles create, answers, correction rounds, and reconnects until the application is terminal; create / submitAnswers / get / cancel / list are available individually. The required Idempotency-Key is sent for you, list auto-paginates with for await, validation failures throw a typed JoboValidationError with per-field errors, and other errors throw JoboAPIError carrying the problem code and retryAfterSeconds. See The application loop for the underlying contract.

No SDK

Pin whichever client you use to an exact version — see Versioning for the compatibility contract, and Errors for the response shapes you will need to handle yourself.