Oct 2, 2025
How Rails Handles API Versioning

Dariusz Michalski
CEO
Explore how Rails API versioning ensures stability and clarity for businesses, with practical strategies for seamless transitions and maintenance.
def matches?(req)
@default || req.headers['Accept'].include?("application/vnd.example.v#{@version}")
end
end
Basic versioning
namespace :v1 do
resources :users, :courses, :assignments
end
Nested structure for API-only apps
namespace :api do
namespace :v1 do
resources :posts, :comments
end
namespace :v2 do
resources :posts, :comments
end
end
end
namespace :v1 do
concerns :api
end
namespace :v2 do
concerns :api
end
end
Updated: app/controllers/v1/courses_controller.rb
class V1::CoursesController < ApplicationController
controller logic
end
For nested APIs: app/controllers/api/v1/users_controller.rb
module Api
module V1
class UsersController < ApplicationController
# controller logic
end
end
end
namespace :v1 do
concerns :api
end
namespace :v2 do
concerns :api
end
Default unversioned requests to v1
scope module: 'v1' do
concerns :api
end
end
private
def add_deprecation_headers
response.headers['Deprecation'] = 'true'
response.headers['Sunset'] = 'Wed, 31 Dec 2025 23:59:59 GMT'
response.headers['X-DEPRECATION-WARN'] = 'API v1 will be removed on 31 December 2025. Please migrate to v2.'
end
end