.NET › API Versioning

How does GraphQL's approach to API evolution differ from REST's typical versioning strategies?

Intermediate

Answer

GraphQL generally avoids traditional versioning entirely, favoring a single, continuously evolving schema where new fields are added (additive, non-breaking) and old fields are marked @deprecated with a reason rather than removed immediately, since clients only request the specific fields they need -- unused deprecated fields simply don't affect clients that never query them, unlike REST where an entire response payload shape typically changes at once.
type Product {
  id: ID!
  name: String!
  price: Float! @deprecated(reason: "Use priceWithCurrency instead")
  priceWithCurrency: Money!
}

# Old clients querying 'price' keep working;
# new clients migrate to priceWithCurrency at their own pace
Real-world example A GraphQL API deprecates a poorly-designed field for over a year, monitoring query analytics to confirm zero remaining clients still request it before finally removing it from the schema entirely, without ever needing a 'v2' schema.

Common follow-ups: How do you track which clients still use a deprecated GraphQL field?;What are GraphQL's own versioning challenges (breaking changes to required fields)?