From what I can tell, your strategy of v1.example.com and
v2.example.com work well. Another strategy is api.example.com/v1/...
and api.example.com/v2/...
I personally prefer the latter, but it means everything listening on
api.example.com must speak both protocols, or you have to have a fancy
redirector that inspects packets.
For service apis with end point on the network, it's usually preferred
to keep the end point stable as you don't want to your client apps to
change often when you start versioning. If your new version breaks
compatibility significantly, then it's ok to have a new end point but
otherwise the versioning might be better handled at the message level.
ie, your message may have a header with v=v1, etc.