It's updated every time the track changes or is paused/unpaused.
In regards to rate limit concerns, per the documentation,
Discord_UpdatePresence() has a rate limit of one update per 15 seconds. Developers do not need to do anything to handle this rate limit. The SDK will queue up any presence updates sent in that window and send the newest one once the client is free to do so. If you are sending presence updates very frequently and wondering why you don't see your Discord presence changing, that's why!
It's updated every time the track changes or is paused/unpaused. In regards to rate limit concerns, per the documentation,