Ran v1 and v2 of Tagly's REST API side by side, because an app already on someone's phone can't be updated on demand. Every request and response shape a shipped build relied on had to keep working, even as the database behind the API changed. A whole product area was deleted from the database while its old fields stayed supported for older builds. Only the API contract was versioned, so everything behind the contract could keep changing. Every piece of compatibility code carried a marker saying when it could be removed. Retiring v1 took three steps:
- Built a minimum-version gate. Every request carries the app's version, and a build below the minimum is shown an update screen.
- Raised the minimum version so every old install had to update, then waited out a safety window.
- Deleted v1's endpoints, scanned for code that only v1 used, and dropped the database columns that only v1 wrote.
The whole cutover is written down as a repeatable procedure for the next version.