Docs / Shared / Versioning & changes

Versioning & changes

What "v1 · stable" commits to, what counts as a breaking change, how much notice you get, and the newest changes.

What “v1 · stable” commits to

Three things, and they are the whole promise:

What it does not commit to: the data. Sources change what they publish, stop publishing, and get taken down. That is the product, not a version question.

What counts as breaking

Breaking — you get noticeNot breaking — ships any time
Removing a field, or changing its typeAdding a field
Removing a parameter, or narrowing what it acceptsAdding a parameter
Lowering a collection's cap on limit, or billing a route documented as unmeteredRaising a cap, or making a route unmetered
Changing what an existing parameter defaults toAdding an error code for a case that used to be a generic failure
Changing an HTTP status for an existing caseAdding an endpoint
Making a nullable field non-nullable, or the reverseChanging a message string (never branch on these — branch on code)

The line that catches people: a default is part of the contract. Changing what ?active= returns when you do not pass it changes every existing integration's result set without changing one line of their code, so it is treated as breaking even though nothing was removed.

Notice

Some changes never happen inside v1: a field's type, whether it can be null, what a parameter defaults to, and what a field or a parameter means. A change like that alters what an integration receives without anything failing, and no notice on a page makes that safe. If one is ever needed, it ships as a new path, /v2/… beside the /v1/… one, which nobody is moved onto, and /v1 keeps answering, unchanged, for at least 12 months after.

A removal gets 90 days' notice, whether it is a field, a parameter or an operation. A removed one fails loudly, so notice is enough, as long as it reaches your code and not only this page. From the day a removal is announced to the day it takes effect:

Before a release ships, its GET /v1/schema is compared with the last release's, and a release that removes something not announced here 90 days before, or changes a type, a nullability, a default published in defaults, a page cap, what a route costs or an error's status, or makes a parameter required, is stopped.

Four exceptions, and they are the only four:

If a change would break you and 90 days is not enough, say so — it is easier to hear that before the change than after.

Announced

Every removal with a date. Each is also listed in GET /v1/schema under the operations it touches, and announced in the responses it touches.

ChangeAnnouncedTakes effectWhat to do now
The birjob_source_name key is removed from facts, on GET /v1/jobs, GET /v1/jobs/{id} and GET /v1/companies/{id}/jobs 2026-10-31 2027-01-30 Only postings imported from the archive that predates this API carry it, and it names, in that archive's spelling, the source that source_name and source name. Read source_name (the source's name) or source (its id) instead: they are on every posting, not just imported ones. Nothing else in facts changes.

Withdrawn. Three changes were announced here on 2026-10-03: active becoming nullable and the 401 split, both for 2027-01-01, and the ?active= default moving to true on 2027-01-08. All three were withdrawn on 2026-10-15, before any took effect, and nothing changes on those dates. What each was for is served instead as an addition, which leaves everything an integration already reads exactly as it was:

If you prepared for the withdrawn changes, nothing you wrote breaks: active will not be null, and invalid_api_key and revoked_api_key arrive as error.reason, never as code.

Queued

Nothing is planned without a date. A removal is listed here as soon as it is planned, so that you do not learn of it from an email, and it moves up to Announced, with a date at least 90 days out, before it ships.

Changelog

The newest changes on v1. The changelog has every one since 2026-08-21, and says of each that was not an addition what it was and why.

2026-10-31

2026-10-25

2026-10-22

Earlier changes, from 2026-10-18 back to 2026-08-21, are on the changelog.