明太祖朱元璋為了鞏固統治,大封宗室二十五人為藩王,駐守全國各地。這些藩王雖無封地管治權,卻擁有護衛軍隊,少者三千人,多者一萬九千人。其中駐守北邊的九位藩王 (遼、寧、燕、谷、代、晉、秦、慶、肅) 軍權更大,對中央朝廷構成威脅。
朱元璋死後,皇太孫朱允炆繼位,是為建文帝。建文帝有感叔父們勢力難以制約,遂有削藩之意。他與齊泰、黃子澄密謀削藩,先削周王,後削齊、湘、代三王。湘王不堪受辱,為保名節,舉家自焚。齊王軟禁南京。代王軟禁大同。不久,岷王亦被削。燕王朱棣見幾位親王或貶或死,明白如此下去自己必無法逃過此劫,於是一邊爭取時間,一邊做戰爭準備。
為防燕王謀反,建文帝以張昺為北平布政使、謝貴和張信為北平都指揮使。朱棣表面裝作精神失常。暗中與僧人姚廣孝 (道衍) 等謀劃舉兵。張昺、謝貴得密詔,帶兵包圍燕王府,反被擒獲。燕王肅清府中叛變分子,攻下北平九門,控制北平。
燕王朱棣援引《皇明祖訓》,以「清君側,靖國難」為名起兵。燕軍先後破薊州、遵化、密雲、居庸關、懷來、永平。建文帝任命六十五歲老將耿炳文率兵三十萬北伐 (朱元璋晚年大殺功臣,導致建文帝無將才可用)。耿炳文與燕軍接戰,旋即兵敗。建文帝聽從黃子澄建議,以為曹國公李景隆是名將李文忠之子,有軍事才華,拜景隆為大將軍,率兵五十萬出征。結果鄭村壩、白溝河兩戰皆以兵敗告終。
燕王擊敗吳高,趁勢偷襲大寧,取朵顏三衛 (驍勇善戰的蒙古騎兵)。景隆兵敗,退守德州。燕軍攻德州,景隆逃濟南。燕軍攻濟南,景隆出逃,右參政鐵鉉、盛庸堅守。燕軍首遇挫折。
濟南是軍事戰略要地,若取得濟南,進可攻應天府,退可畫疆自守。奈何燕軍花費大量人力物力,仍然久攻不下。戰事膠著,雙方無法突破。此時建文帝遣使求和,未獲接納。隨著燕軍糧道被擾亂,朱棣下令撤兵,濟南之戰告一段落。
盛庸在東昌大敗燕軍,張玉戰死,朱棣在朱能援救下倉促突圍。燕軍經此一役,不再經山東南下,改走徐州、沛縣。由此亦見當時燕軍軍力並不足夠,與官軍只成一均勢。
朱棣欲報東昌一戰之仇,與姚廣孝商議,決定再次出兵。盛庸與燕軍交戰於夾河,譚淵被斬殺,盛庸軍也有死傷。及後天颳起強烈東北風,沙塵滿天,官軍無法作戰,燕軍則乘風大呼 (官軍多為南人,燕軍則長居北方苦寒之地,早已習慣),肆意攻擊,盛庸兵敗,退返德州。
藳城之戰,燕軍繼續靠風助致勝,《明通鑑》謂「燕師自白溝河至藳城,凡三捷,皆得風助,王以為此天授,非人力也」,建文帝見戰事失利,派人與燕王和談,被燕王以「奸臣竄逐而其計實行,不敢撤兵」拒絕。
和談終於破裂,燕軍截斷官軍補給,焚燒大量糧船,德州缺乏糧食,陷入困境。與此同時,朱棣從宦官 (建文帝將宮中宦官裁撤) 口中得到消息,京師守備空虛,遂決定直接率兵南下,不再與盛庸等糾纏。
靈璧之戰徹底擊潰官軍主力,燕軍向東南方向直線前進。盛庸在淮河設下防線阻礙燕軍渡河,未能成功。燕軍下揚州、高郵,威脅應天府。建文帝下罪己詔,號召天下勤王,又遣人許以割地求和,拖延時間。
盛庸作出最後的抵抗。朱棣初戰不利,打算議和北還,朱高煦引兵來援,率眾作殊死戰,擊敗盛庸。燕軍抵金陵。徐增壽 (徐達子,輝祖弟) 作內應,事敗,被建文帝親自誅殺。守衛金川門的朱橞和李景隆見朱棣麾蓋,開門迎降,史稱金川門之變。
靖難之變以皇宮大火、建文帝失蹤結束。朱棣誅殺齊泰、黃子澄、方孝孺 (據傳被誅十族,即九族加朋友門生),滅其族。眾多建文舊臣亦遭處決或自盡。《明史》曰:「齊、黃、方、練之儔,抱謀國之忠,而乏制勝之策。然其忠憤激發,視刀鋸鼎鑊甘之若飴,百世而下,凜凜猶有生氣。是豈泄然不恤國事而以一死自謝者所可同日道哉!由是觀之,固未可以成敗之常見論也。」對建文舊臣的道德人格及氣節予以肯定。
朱棣稱帝後,恢復了被削藩王的爵位,改元永樂,遷都北平 (防範蒙古,且金陵建文帝勢力較大,很多建文遺臣不順服朱棣統治),名順天府。
其又把大寧封賞給朵顏三衛作酬勞。後來蒙古入寇,如土木之變時,多經大寧。
南下一著,全賴宦官提供消息。故此,朱棣改變了太祖禁止宦官干政的政策,開始重用宦官,埋下了日後宦官專權亂政的禍根。