У растущего бизнеса один бэкенд часто обслуживает сразу несколько клиентов: сайт, мобильные приложения на iOS и Android, Telegram-бота, интеграции с CRM и партнёрскими сервисами. Все они общаются с сервером через API, и любое изменение на бэкенде может неожиданно сломать один из них. В результате заказы перестают приходить, бот молчит, а пользователи старой версии приложения видят ошибки на экране оплаты. Версионирование API — это дисциплина, которая позволяет развивать серверную часть без ущерба для уже работающих клиентов. В статье разберём, как это устроено и что важно знать владельцу бизнеса.
Почему «просто обновить бэкенд» — риск для бизнеса
Кажется, что достаточно внести правки на сервере и обновить все клиенты. На практике мобильные приложения так обновить нельзя: релиз в App Store проходит модерацию от 24 до 48 часов, в Google Play — от нескольких часов до нескольких дней. А главное, пользователи обновляются неохотно: через месяц после релиза заметная часть аудитории всё ещё сидит на старой версии. Сайт и Telegram-бота можно передеплоить синхронно с бэкендом, а приложения — нет. Итог сломанной совместимости предсказуем: остановившиеся заказы, шквал обращений в поддержку и ночные аварийные работы разработчиков, которые обходятся в разы дороже плановой разработки.
Какие изменения API ломают клиентов
Ломающие изменения редко выглядят драматично — чаще это «мелкие» правки, о которых вспомнили в последний момент. Типичные примеры:- удалить или переименовать поле в ответе: приложение ждёт client_phone, а приходит phone — экран заказа падает;
- изменить тип данных: сумма была числом 1500.00, стала строкой «1500.00» — корзина перестала считаться;
- сделать обязательным то, что раньше было необязательным;
- поменять формат ошибок или коды ответов — клиент больше не понимает, что произошло;
- изменить логику авторизации без сохранения старой схемы;
- переименовать или удалить URL без сохранения старых адресов.
Для разработчика каждый пункт — пятиминутная правка, а для клиента API это нарушение контракта: код, который работал вчера, сегодня выдаёт ошибки. Именно поэтому такие изменения нельзя вносить тихо в существующую версию — для них нужен отдельный механизм, о котором ниже.
Версионирование через URL — самый практичный вариант
Самый распространённый и понятный способ — указывать версию прямо в адресе: /api/v1/orders и /api/v2/orders живут параллельно. Старые клиенты продолжают работать с v1, новые постепенно переводятся на v2. Существуют и другие подходы — передача версии в заголовке запроса или в параметре, — но они усложняют отладку, кэширование и документацию. Для большинства проектов версионирование через URL — оптимальный баланс простоты и надёжности. Важно другое правило: номер версии меняется только при ломающих изменениях, а не при каждой правке.Новая версия — только для ломающих изменений
Логика здесь как в семантическом версионировании, только упрощённая. Добавление нового поля в ответ, нового метода или необязательного параметра с безопасным значением по умолчанию ничего не ломает — новая версия не нужна. А вот удаление, переименование поля или смена поведения — это уже новая мажорная версия. Пример: в ответе заказа появилось поле bonus_points — ни сайт, ни приложения не пострадают. Но если переименовать его в loyalty_points, потребуется /api/v2 и план миграции. Такой подход спасает от зоопарка из двух десятков версий: каждая поддерживаемая версия — это дополнительные расходы на тесты и поддержку.Шесть правил обратной совместимости
Чтобы новые версии нужны были как можно реже, команда должна соблюдать простые правила при работе с существующим API:- Добавляйте, но не удаляйте и не переименовывайте поля в ответах.
- Новые поля делайте необязательными, с безопасными значениями по умолчанию.
- Не ужесточайте валидацию и не добавляйте обязательные параметры в старых методах.
- Новую логику выносите в новые эндпоинты, а не вшивайте в старые.
- Изменения поведения раскатывайте под feature-флагами постепенно, на части клиентов.
- Фиксируйте контракт в спецификации OpenAPI и гоняйте автотесты совместимости перед каждым релизом.
Эти правила стоят на стороне бизнеса: они означают, что бэкенд можно обновлять хоть каждый день, а сайт, бот и приложения продолжат работать как работали. Дисциплина на этапе разработки стоит на порядок дешевле инцидента в продакшене.
Deprecation: как выводить старые версии без боли
Старые версии не должны жить вечно — иначе поддержка бэкенда превратится в обслуживание музея. Обычно устанавливают окно поддержки 6–12 месяцев. Работает это так: сначала в логах смотрят, кто и насколько активно использует устаревшую версию; затем предупреждают клиентов и партнёров — письмами, документацией и заголовком Sunset в ответах API; для мобильных приложений параллельно выпускают обновление с переходом на новую версию; и только когда доля запросов к старой версии падает почти до нуля, её отключают. Для публичного API политика вывода версий должна быть опубликована заранее — это вопрос репутации и доверия партнёров.Контракт, тесты и ченджлог — страховка от сюрпризов
Чтобы совместимость не зависела от внимательности конкретного разработчика, её автоматизируют. Контракт API описывают в спецификации OpenAPI (Swagger) — она становится единственным источником правды и основой документации. Перед каждым релизом автотесты прогоняют запросы ко всем поддерживаемым версиям и проверяют, что ответы соответствуют контракту. Все изменения фиксируются в ченджлоге, доступном командам клиентов и партнёров. Такой процесс настраивается один раз — и дальше каждый релиз проходит спокойно, без ручной перепроверки в духе «а ничего ли мы не сломали».Что версионирование даёт бизнесу
Для владельца продукта версионирование — это не абстрактная «архитектурная красота», а измеримые эффекты:- релизы становятся чаще и безопаснее: бэкенд обновляется без оглядки на релизные окна App Store и Google Play;
- пользователи старых версий приложений продолжают оформлять заказы, а не видеть ошибки;
- миграция идёт постепенно: можно перевести сайт на v2, понаблюдать неделю, а потом трогать бота;
- меньше аварийных работ и инцидентов — ниже нагрузка на поддержку;
- интеграции с CRM и партнёрами строятся на стабильном контракте, без постоянных согласований.

