The client side asks the service "Am I allowed to keep playing with you?" every five seconds and the server responds with
You store the date value that represents the last time the player "pinged" the service. Also store a single session key that is randomized and sent to the client upon logging in or at the beginning a game (if no login is needed). The client keeps polling with a packet or http request or whatever is good for you that tells the server and in turn, the database the player is connected and active.
When someone connects the server with the same identity, the server replaces the session key. When the previous player or device continues to communicate with the old session key, they get informed that they have been disconnected because someone connected the game with their identity from another device. This happens as a response to the "Are we still good packet".
The alternative is to check when was the last time the user with this identity was alive and if that date is less than say 15 seconds ago, tell the new person / device attempting to connect that this account is already active.
As you may have constraints as far as the amount of requests that could be made to the server, simply add this "You are still allowed to play" response as an answer to every request you are already making. Only save player state when they make a valid request and they are still allowed to play the game.
Like you suggested, you could store the unique session ID in the saved state, if a player logs in from another device, they will do a login request, randomize another session ID and update the DB. When the other device makes any request, the server will kindly notify them this session has been discontinues as another session was started with a different device.
This way it won't cost you any additional API calls (I think).
After reading this question once more, I wonder if you could simply save the state for multiple devices like branches, then perhaps merge the delta as needed. Instead of overwriting, load the current state that will describe the the amount of achievements and or accomplishments on each device so far and when you save back, save changes for the currently used device.