正当元朝集结兵力之时,对忽必烈心怀不满的昔里吉等人发动了叛乱。至元十三年(1276年)秋,脱脱木儿发难。昔里吉奉命征讨,暗中勾结脱脱木儿等人,发兵拘捕那木罕、阔阔出和安童。叛王拥戴昔里吉为主,进攻岭北。八月,忽必烈派汉军都元帅阔阔带、李庭率侍卫军2000人西征。次年春,昔里吉分兵东进,弘吉剌万户折儿瓦台也举兵响应,将忽必烈女儿囊家真围困在应昌(今内蒙古阿巴哈纳尔旗东南)城中。忽必烈听后便急调诸王伯木儿和丞相伯颜的南征大军北上平叛。伯木儿军与叛军激战于鱼儿泊(今达赉泊)等地,大获全胜,活捉折儿瓦台。但这时昔里吉率主力已越过杭海岭(今蒙古杭爱山),渡过斡耳寒河(今蒙古鄂尔浑河)了。元将土土哈在土兀拉河(今蒙古土拉河)阻击叛军。六月,伯颜大军到达土兀拉河,大破叛军,迫其败退斡耳寒河。七月,叛军分裂,忽鲁带率部投降。伯颜挥师进击,昔里吉仓促应战,大败而逃。同年冬,南平王秃鲁在六盘山起兵响应昔里吉,很快就被平息。
至元十五年(1278年)初,元将土土哈部超过按台山(今新疆阿勒泰山)。昔里吉逃往也儿的石河(今新疆额尔齐斯河),脱脱木儿逃往吉利吉思。同年冬,元将刘国杰率侍卫军5万人戍守和林(今蒙古哈尔和林东北)。元朝重新控制了岭北。次年,脱脱木儿南下侵扰杭海山东。元军主帅别吉思迷失采用刘国杰避实就虚之计,直捣叛军巢穴,占领谦州(前苏联克孜尔西南)。脱脱木儿慌忙回师,与元军大战于谦河(叶尼塞河),大败而逃。
至元十八年(1281年),叛军内哄。先是脱脱木儿向昔里吉求援,遭拒绝,便改奉蒙哥孙子撒里蛮为帝。药木忽儿反对这一做法,将脱脱木儿击败,俘送昔里吉处。昔里吉处死脱脱木儿。撒里蛮孤立无援,被迫投奔昔里吉。昔里吉将其押送术赤后王火赤斡兀立处。行至途中,撒里蛮被旧部救走,重新旗鼓,打败昔里吉。将昔里吉、药木忽儿押送大都。药木忽儿途中行贿得以脱身,借兵突袭撒里蛮。撒里蛮兵败,投降忽必烈。后来,昔里吉被流放到海南岛。
在昔里吉叛乱期间,海都侵占阿力麻里,侵扰天山南北。忽必烈派诸王阿只吉等率10万之众驻守别失八里(今新疆奇台西北)等地,以备海都。至元十九年(1282年),海都释放那木罕等人,以求和解,但又派兵进攻斡端(今新疆和田)等地。至元二十二年(1285年),笃哇率兵12万包围哈剌火州(今新疆吐鲁番),围城六个月才退走。海都也侵扰了纳思河,在洪水山(今新疆呼图壁县西南)设伏,大败元军,乘胜经彰八里(今新疆乌鲁木齐、昌吉之间),进入哈密力(今新疆哈密),杀死元畏兀儿亦都护火赤哈的斤。元军马上派兵增援畏兀儿,海都撤走。
至元二十四年(1287年),海都准备出兵10万,呼应东北叛王十三颜。忽必烈派伯颜镇守和林,切断东、西叛王的联系。海都见东进受阻,转向西方。二十六年(1289年)春,海都在杭海山打败忽必烈之孙甘麻剌部。不久,和林元军也投降了海都。七月初一,忽必烈下诏亲征。海都闻讯而退。
至元二十九年(1292年),诏命玉昔帖木儿取代伯颜镇守和林。当年秋,元将土土哈在按台山俘海都部民3000余户,进取吉利吉思。次年春,土土哈军入谦河(叶尼塞河)流域,收复五部地区,将海都势力逐出按台山之外。
元贞元年(1295年),在别失八里设北庭元帅府,以平章合伯为都元帅,主持西北军务。不久,叛军再度内哄。次年秋,药不忽儿、兀鲁思不花等脱离笃哇,投降元朝。大德二年(1289年)十月,笃哇夜袭合剌合塔(约在今蒙古哈腊乌斯湖一带),俘元朝驸马阔里吉思。回师途中,遭到元将朵儿朵哈的袭击,损失惨重。不久,海都之子斡鲁温孙与元将床兀儿大战于阔客(疑为霍博,今新疆和布克赛尔),元军大胜。皇侄海山率兵越过按台山,直捣海都王庭海押立,重创叛军后回师按台山。接着,海都、笃哇联合诸王40余人率部大举进犯,超过按台山,直逼和林。海都率军布防于杭海山一线。八月,两军前锋激战于迭怯里古,叛军失利。两天后,海都率主力赶到,大战于合剌合塔,元军失利被困。次日再战,元军又败。同时,笃哇部与元军激战于兀儿秃,大败而逃。海都只得撤退,途中病逝。笃哇拥立海都长子察八儿。
长达几十年的战争使双方都筋疲力尽。大德七年(1303年),笃哇主动求和。元成宗遣使抚慰。大德十年(1306年),笃哇、察八儿失和,交战于忽毡(塔吉克斯坦列宁纳巴德)。察八儿大败。元怀宁王海山趁机越过按台山追击察八儿,叛王秃满等投降。察八儿投奔笃哇。笃哇善待察八儿,但收回了海都时占去的察合台领地。至此,西北诸王之乱才彻底平息。
