> ## Documentation Index
> Fetch the complete documentation index at: https://jobo.world/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Versioning

> There's no version in the URL. What the OpenAPI version number means, what counts as breaking, and how to write a client that survives change.

## There's no version in the path

Every route is `/api/{resource}` — `/api/jobs`, `/api/jobs/feed`, `/api/companies/{id}`. There is no `/v1/` or `/v2/` segment, and there never has been. Don't construct URLs expecting one.

The OpenAPI document that describes the API carries a date-style `info.version` — currently **`2026-07-21`**. It tracks the spec, not a set of breaking releases; a new date doesn't imply an incompatible change.

***

## The one exception: Auto Apply

[Auto Apply](/docs/api-reference/auto-apply/auto-apply) is the only surface with an explicit contract version. Every request and response — including error bodies — carries an `api_version` field, currently `2026-07-21`. Auto Apply is a preview: application creation isn't enabled yet and returns `503 auto_apply_coming_soon`. If the callback-driven contract changes before general availability, `api_version` is how you'll tell.

***

## The compatibility contract

Outside that one field, changes to the API are **additive**:

* New fields may appear on any response at any time.
* New optional request parameters may be added at any time.
* `sources` grows as platforms are added — see [Sources](/docs/sources) — so treat it as an open set, not a closed enum, and don't validate against a hardcoded list.

A client that fails on an unrecognized field or an unfamiliar `source` value is broken by design, not by our mistake.

The following count as breaking, and are announced ahead of time via the [Changelog](/docs/changelog):

* Removing or renaming a response field.
* Removing an endpoint.
* Tightening request validation that previously succeeded.
* Changing a default value.

***

## Writing a client that survives change

<Steps>
  <Step title="Ignore unknown fields">
    Deserialize permissively. A new field appearing on `Job` or `JobCompany` tomorrow should not raise an exception today.
  </Step>

  <Step title="Don't depend on field order">
    JSON object key order is not part of the contract.
  </Step>

  <Step title="Branch on error code, not prose">
    Match on the `code` field, not `title` or `detail` — those are human-readable strings and may be reworded without notice. See [Errors](/docs/errors).
  </Step>

  <Step title="Treat sources as an open set">
    New ATS platforms are added to the catalogue over time. Don't hardcode an enum of valid `source` values or reject jobs from one you don't recognize.
  </Step>

  <Step title="Pin your SDK version">
    Pin the client library version in your dependency file and upgrade deliberately, rather than always taking latest. See [Client libraries](/docs/sdks).
  </Step>
</Steps>
