How do you implement API versioning and backward compatibility?
API versioning allows APIs to evolve without breaking existing clients. Strategies: (1) URL versioning (/api/v1/users, /api/v2/users): most explicit, easy to understand and implement, but creates URL proliferation. (2) Header versioning (Accept: application/vnd.api+json; version=2): cleaner URLs, follows HTTP content negotiation standards, but less discoverable. (3) Query parameter versioning (/api/users?version=2): easy to test in browsers, but mixes versioning with query parameters. Recommendation: URL versioning is most common and practical for most APIs. Backward compatibility rules: adding new fields to responses is backward compatible (existing clients ignore unknown fields), adding new optional request parameters is backward compatible, removing or renaming fields is a breaking change, changing field types is a breaking change, and adding required request parameters is a breaking change. Migration strategy: announce deprecation timeline (minimum 6 months for major versions), provide migration guides documenting all changes, implement usage analytics to track which clients use which versions, and maintain deprecated versions until migration is complete. Implementation: maintain separate route handlers per version, share business logic between versions (version-specific adapters transform data), implement automated compatibility testing (verify old requests still work on new versions), and document all versions in OpenAPI specifications. Deprecation process: mark deprecated in documentation and response headers (Deprecation: true, Sunset: date), log usage of deprecated features, notify consumers via email and developer portal, and eventually return 410 Gone for fully retired endpoints. API evolution without versioning: use additive changes only (new fields, new endpoints), implement optional parameters for new functionality, and use feature flags per client for selective capabilities.