Start here. This is the direct spoken answer to practice first.
Why this question matters
A C# refactor can silently become an API breaking change because serializers expose names, shapes, defaults, and conversion rules. The wire contract needs deliberate ownership separate from convenient internal models.
I use explicit API DTOs and treat their serialized JSON shape as part of the contract. Renaming a C# property, changing camel-case policy, switching an enum between number and string, altering null omission, or tightening a converter can break clients even when the endpoint and CLR types still compile. Additive optional response fields are usually safer than removing or reinterpreting existing fields. Request changes need defaults and validation that let older payloads retain their previous meaning.