API Versioning Strategies: Best Practices
API versioning maintains backward compatibility. After versioning production APIs, here are the strategies that work.
Versioning Strategies
URL Versioning
// Version in URL path
GET /api/v1/users
GET /api/v2/users
// Express.js example
app.get('/api/v1/users', (req, res) => {
// v1 implementation
});
app.get('/api/v2/users', (req, res) => {
// v2 implementation
});
Header Versioning
// Version in Accept header
Accept: application/vnd.api+json;version=2
// Express.js example
app.get('/api/users', (req, res) => {
const version = req.headers['accept']?.match(/version=(\d+)/)?.[1] || '1';
if (version === '2') {
// v2 implementation
} else {
// v1 implementation
}
});
Query Parameter
// Version in query string
GET /api/users?version=2
app.get('/api/users', (req, res) => {
const version = req.query.version || '1';
// Route to appropriate version
});
Semantic Versioning
Version Format
MAJOR.MINOR.PATCH
v1.0.0 - Initial release
v1.1.0 - New features (backward compatible)
v1.1.1 - Bug fixes
v2.0.0 - Breaking changes
Implementation
const apiVersions = {
'1.0.0': require('./v1/users'),
'1.1.0': require('./v1.1/users'),
'2.0.0': require('./v2/users'),
};
app.get('/api/users', (req, res) => {
const version = req.headers['api-version'] || '1.0.0';
const handler = apiVersions[version] || apiVersions['1.0.0'];
handler(req, res);
});
Migration Strategy
Deprecation
app.get('/api/v1/users', (req, res) => {
res.set('Deprecation', 'true');
res.set('Sunset', 'Mon, 01 Jan 2024 00:00:00 GMT');
res.set('Link', '</api/v2/users>; rel="successor-version"');
// v1 implementation
});
Gradual Migration
// Support both versions
app.get('/api/v1/users', handleV1);
app.get('/api/v2/users', handleV2);
// Redirect after deprecation period
app.get('/api/v1/users', (req, res) => {
res.redirect(301, '/api/v2/users');
});
Best Practices
- Version early - From the start
- Document versions - Clear changelog
- Deprecate gracefully - Give notice
- Maintain compatibility - Support old versions
- Monitor usage - Track version adoption
- Plan migrations - Clear timeline
- Test thoroughly - Version compatibility
- Communicate changes - Notify users
Conclusion
API versioning enables:
- Backward compatibility
- Gradual migration
- Breaking changes
- User communication
Choose URL or header versioning based on your needs. The strategies shown here maintain production APIs.
API versioning strategies from November 2021, covering URL, header, and semantic versioning.