Короткий ответ Для изменений, затрагивающих внешний контракт, стоит сочетать тесты обратной совместимости на стороне сервера (старые поля и форматы продолжают поддерживаться в переходный период) с consumer-driven contract тестами, где каждый значимый потребитель фиксирует свои реальные ожидания от API, и сервер в CI проверяет, что эти ожидания не нарушены — конкретный баланс между строгостью контрактов и скоростью эволюции API зависит от числа потребителей и их возможности быстро обновляться. Как это работает подробнее Consumer-driven contract подход (например, Pact) фиксирует для каждого потребителя набор ожидаемых запросов и ответов как отдельный контракт-файл; сервер в своём CI воспроизводит эти запросы против текущей реализации и падает, если ответ перестал соответствовать зафиксированным ожиданиям — это обнаруживает breaking change до релиза, а не после жалобы потребителя. Сравнение Компромисс. Строгие contract-тесты для всех потребителей дают максимальную защиту от breaking changes, но замедляют эволюци