按照元窝阔台汗元年(1229年)宗室诸王的盟约,蒙古大汗之位世世代代由窝阔台的后代承袭。然而,从蒙哥汗开始,大汗之位转到了拖雷一系。由此埋下了宗室失和的种子。忽必烈在位期间推行汉化政策,更加剧了与保守的西北诸王的矛盾,终于爆发了长达四十年之久的海都、笃哇、昔里吉之乱。
海都是窝阔台的孙子,元宪宗蒙哥汗二年(1252年)被蒙哥汗封于海押立(今苏联塔尔迪-库尔干东北)。海都对此一直耿耿于怀,蒙哥汗六年(1256年)扣押了蒙哥汗的使臣断事官石天麟,后来又支持阿里不哥与忽必烈争位。他还结交术赤汗别儿哥,逐渐控制了窝阔台的封地叶迷立(亦称也迷里,今新疆额敏河流域),成为雄踞于察合台汗国与蒙古本土之间的强大势力。元世祖至元元年(1264年)阿里不哥失败后,忽必烈邀请海都参加库里尔台大会。海都以道远马瘦,不堪劳苦为托辞,表示只愿意在自己领地内服从大汗的命令。后忽必烈将蔡州(今河南汝南,辖今渤海西南部)分封给海都,海都仍不为所动。至元三年(1266年),察合台汗阿鲁忽去世,堂侄木八剌沙继位。忽必烈派木八剌沙的堂兄弟八剌去辅佐并监视木八剌沙。八剌回国发动兵变,自立为汗。这时,忽必烈封皇子那木罕为北平王,主持西北军务,并派使者说服术赤汗忙帖木儿进攻海都。
至元五年(1268年),忽必烈出兵击败海都,追击到阿历麻里(今新疆霍城)。忙哥帖木儿、八剌也出兵攻击海都。海都先和忙哥帖木儿讲和,然后在失儿答里牙(今苏联锡尔河)一线迎击八剌。海都失利,损失惨重。不久,得到忙哥帖木儿的五万援兵,才挽回局面,连连击败八剌。八剌退过失儿河,聚兵募饷,继续与海都周旋。海都为解除后顾之忧,主动与八剌和解,结为俺答(义兄弟)。
至元六年(1269年),海都、八剌等在塔剌思(今苏联江布尔召开大会),将察合台领地的三分之二划归八剌,三分之一分属海都和忙哥帖木儿。与会诸王宣誓恪守蒙古传统风俗制度,派遣使者质问忽必烈为何在汉地建都和采用汉法。第二年,八剌去世。海都立八剌堂叔捏古伯为汗。八剌诸子和阿鲁忽诸子不服,联兵进攻海都。
西北诸王混战给了忽必烈从容布置的时机。忽必烈先是任命刘好礼为乞儿吉里、撼合纳、廉州,益兰州等五部(今苏联叶尼塞河流域)断事官,大量迁入中原农户、军人,实行屯田,修筑道路,建立驿站,形成了进攻叛王的基地。又命北平王那木罕建节阿力麻里,作为总管西北军事的中枢。至元十年(1273年),捏古伯与海都兵戒见,元军乘机出兵察合台汗国。十二月,捏古伯阵亡。第二年,八剌诸子与海都讲和,立八剌之子笃哇为察合台汗。不久,忽必烈下令追缴颁给海都、八剌的金银符,并派中书右丞相安童辅佐那木罕,调那木罕之弟阔阔出、蒙哥之子昔里吉、忽必烈之侄脱脱木儿、阿里不哥之子明里帖木儿、药木忽儿等赴军前效力。
正当元朝集结兵力之时,对忽必烈心怀不满的昔里吉等人发动了叛乱。至元十三年(1276年)秋,脱脱木儿发难。昔里吉奉命征讨,暗中勾结脱脱木儿等人,发兵拘捕那木罕、阔阔出和安童。叛王拥戴昔里吉为席,进攻岭北。八月,忽必烈派汉军都元帅阔阔带、李庭率侍卫军2000人西征。第二年春天,昔里吉分兵东进,弘吉剌万户折儿瓦台也起兵响应,将忽必烈女儿囊家真围困在应昌(今内蒙古阿巴哈纳尔旗东南)城中。忽必烈听后便急调诸王伯木儿和丞相伯颜的南征大军北上平叛。伯木儿军与叛军激战于鱼儿泊(今达赉泊)等地,大获全胜,活捉折儿瓦台。但这时昔里吉率主力已越过杭海岭(今蒙古杭爱山),渡过斡耳寒河(今蒙古鄂尔浑河)了。元将土土哈在土兀拉河(今蒙古土拉河)阻击叛军。六月,伯颜大军到达土兀拉河,大破叛军,败退斡耳寒河。七月,叛军分裂,忽鲁带率领部队投降。伯颜挥师进攻,吉里昔仓促应战,大败而逃。同年冬,南平王秃鲁在六盘山起兵响应昔里吉,很快就被平息。
至元十五(1278年)初,元将土土哈部越过按台山(今新疆阿勒泰山)。昔里吉逃往也儿的石河(今新疆额尔齐斯河),脱脱木儿逃往吉利吉思。同年冬,元将刘国杰率侍卫军五万人戍守和林(今蒙古哈尔和林东北)。元重新控制了岭北。第二年,脱脱木儿南下侵扰杭海山东。元军主帅别吉思迷失采用刘国杰避实就虚的计策,直捣叛军巢穴,占领谦州(今苏联克孜尔西南)。脱脱木儿慌忙回师,与元军大战于谦河(今苏联叶尼塞河),大败而逃。
至元十八年(1281年),叛军内讧。先是脱脱木儿向昔里吉求援,遭拒绝,便改奉蒙哥孙子撒里蛮为帝。药木忽儿反对这一做法,将脱脱木儿击败,俘送昔里吉处。昔里吉处死脱脱木儿。撒里蛮孤立无援,被迫投奔昔里吉。昔里吉将其押送术赤后王火赤斡兀立处。途中,撒里蛮被旧部救走,重整旗鼓,打败昔里吉。将昔里吉、药木忽儿押送大都。药木忽儿途中行贿得以脱身,借兵突袭撒里蛮。撒里蛮兵败,投降忽必烈。后来,昔里吉被流放到海南岛。
在昔里吉叛乱期间,海都侵占阿力麻里,侵扰天山南北。忽必烈派诸王阿只吉等率10万之众驻守别失八里(今新疆奇台西北)等地,以防备海都。至元十九年(1282年),海都释放那木罕等人,以求和解,但又派兵进攻斡端(今新疆和田)等地。至元二十二年(1285年),笃哇率兵12万包围哈剌火州(今新疆吐鲁番),围城六个月。海都也侵扰了纳思河,在洪水山(今新疆呼图壁县西南)设埋伏,大败元军,乘胜经彰八里(今新疆乌鲁木齐、昌吉之间),进入哈密力(今新疆哈密),杀死元畏兀儿亦都护火赤哈的斤。元军马上派兵增援畏兀儿,海都撤走。
至元二十四年(1287年),海都准备出兵10万,呼应东北叛王十三颜。忽必烈派伯颜镇守和林,切断东、西叛王的联系。海都见东进受阻,转向西方。二十六年(1289年)春,海都在杭海山打败忽必烈之孙甘麻剌部。不久,和林元军也投降了海都。七月初一,忽必烈下诏亲征。海都闻讯而退。
至元二十九年(1292年),诏命玉昔帖木儿取代伯颜镇守和林。当年秋,元将土土哈在按台山俘海都部民3000余户,进取吉利吉思。第二年春天,土土哈军入谦河(今苏联叶尼塞河)流域,收复五部地区,将海都势力逐出按台山。
元贞元年(1295年),在别失八里设北庭元帅府,以平章合伯为都元帅,主持西北军务。不久,叛军再度发生内讧。第二年秋,药不忽儿、兀鲁思不花等脱离笃哇,投降元朝。大德二年(1298年)十月,笃哇夜袭合剌合塔(约在今蒙古哈腊乌斯湖一带),俘元朝驸马阔里吉思。回师途中,遭到元将朵儿朵哈的袭击,损失惨重。不久,海都之子斡鲁温孙与元将床兀儿大战于阔客(今新疆和布克赛尔),元军大胜。皇侄海山率兵越过按台山,直捣海都王庭海押立,重创叛军后回师按台山。接着,海都、笃哇联合诸王四十余人率部大举进犯,超过按台山,直逼和林。海都率军布防于杭海山一线。八月,两军前锋激战于迭怯里古,叛军失利。两天后,海都率主力赶到,大战于合剌合塔,元军失利被困。第二天再战,元军又败。同时,笃哇部与元军激战于兀儿秃,大败而逃。海都只得撤退,途中病逝。笃哇拥立海都长子察八儿。
长达几十年的战争使双方都精疲力尽。大德七年(1303年),笃哇主动求和。元成宗派遣使者招抚。大德十年(1306年),笃哇、察八儿失和,交战于忽毡(今苏联列宁纳巴德)。察八儿大败。元怀宁王海山趁机越过按台山追击察八儿,叛王秃满等投降。察八儿投奔笃哇。笃哇善待察八儿,收回了海都时占去的察合台领地。至此,西北诸王之乱才彻底平息。