No more v1, v2, v3, v4 forever.
/v1/customers
/v2/customers
/v3/customers/customersBuild only the latest API. Versionless handles old clients.
API compatibility without a second API
Keep one API. Versionless handles old clients.
No v1 folders. No duplicate handlers. No old-shape branches.
bun add @versionless/coreOne current handler
Versionless updates the payload before your handler sees it.
Make the breaking change
Add one small translation. Old clients keep working.
export default v.change("2026-05-14", {
request: {
up: ({ name, ...user }) => {
const [firstName, ...lastName] = name.split(" ");
return { ...user, firstName, lastName: lastName.join(" ") };
},
},
response: {
down: ({ firstName, lastName, ...user }) => ({
...user, name: `${firstName} ${lastName}`,
}),
},
});Why it matters
/v1/customers
/v2/customers
/v3/customers/customersBuild only the latest API. Versionless handles old clients.
"We're deprecating v1 in 6 months." Every customer scrambles to migrate.
You own the compatibility work—not every customer.
Change the API and the architecture behind it.
Improve the implementation without being trapped by old contracts.
Your next breaking API change
Versionless adds one compatibility step to the workflow you already have.
Build the API you actually want to maintain.
name → firstName + lastNameIt tells you what old clients would lose.
bunx versionless checkRequest in. Response out. Kept at the edge.
changes/2026-05-14.tsNew clients move forward. Old clients keep working.
✓ safe to shipKeep one API