Номера с вероятностью процентов 99 остаются висеть в онлайне, даже если сделать setState?view=offline и потом endSession?invalidateToken=1. Других открытый сессий на них нет.
Единственный способ выйти в офлайн теперь это не закрывать сессию, а просто перестать запрашивать раз в минуту fetchBaseURL.
Под "онлайном" понимается
"state" : "online",
"lastseen" : 0,
"onlineTime" : xxx
Где xxx при запросе статуса контакта >0, но при создании сессии приходит список контактов где они все равны 0.
Единственный способ узнать реально ли контакт онлайн или нет это сделать RAPI запрос getUserInfo, там lastseen приходит правильный.
В оф клиентах нет вообще разделения списка контактов на онлайн/офлайн, а этот запрос отправляется каждый раз при открытии чата с контактом, чтобы показать когда он последний раз был активен.