API versioning is a technique used to manage changes in your API without breaking existing clients.
When an API evolves, introducing new features or modifying existing ones, older versions should still work for users relying on them.
URI Versioning (most popular):
/api/v1/users
/api/v2/users
Header Versioning
Query Parameter Versioning
Directory Structure
src/
├── controllers/
│ ├── v1/
│ │ └── user.controller.ts
│ └── v2/
│ └── user.controller.ts
├── routes/
│ ├── v1/
│ │ └── user.routes.ts
│ └── v2/
│ └── user.routes.ts
└── app.ts
📁 controllers/v1/user.controller.ts
import { Request, Response } from 'express';
export const getUsersV1 = (req: Request, res: Response) => {
res.send("Response from API v1 - User List");
};
📁 controllers/v2/user.controller.ts
import { Request, Response } from 'express';
export const getUsersV2 = (req: Request, res: Response) => {
res.send("Response from API v2 - Enhanced User List");
};
📁 routes/v1/user.routes.ts
import express from 'express';
import { getUsersV1 } from '../../controllers/v1/user.controller';
const router = express.Router();
router.get('/users', getUsersV1);
export default router;
📁 routes/v2/user.routes.ts
import express from 'express';
import { getUsersV2 } from '../../controllers/v2/user.controller';
const router = express.Router();
router.get('/users', getUsersV2);
export default router;
📁 app.ts