Với lợi thế áp đảo về quân số, sĩ khí, lại là quân no đánh quân đói nên trận tuyến Đại Việt hoàn toàn áp đảo quân địch. Thái tử Trần Hoảng cùng vua Trần Thái Tông ngự trên lâu thuyền chỉ huy toàn trận đánh. Những chiến tướng Đại Việt như Trần Quốc Tuấn, Trần Khánh Dư, Lê Tần … chia quân làm nhiều mũi công kích giặc trên các hướng.
Đại Việt phản công, quyết chiến Đông Bộ Đầu
Quân Mông Cổ ở Thăng Long chỉ hơn một tuần thì nhuệ khí và sức chiến đấu suy giảm mạnh so với thời điểm ban đầu mới tiến sang. Một mặt quân Mông lâm vào cảnh thiếu thốn lương thực, mặt khác chúng bị các làng xóm xung quanh Thăng Long kiên quyết chống cự. Quân Mông Cổ đã mất dấu triều đình Đại Việt nên có muốn tiếp tục cuộc rượt đuổi giữa kỵ binh và thuyền chiến cũng không được. Tình hình đã dần nằm ngoài sự suy tính của Ngột Lương Hợp Thai. Viên tướng được mệnh danh bách chiến bách thắng trong quân đội Mông Cổ lần này phải đối mặt với một thế trận không giống bất cứ nơi đâu mà y từng chinh chiến.
Trong khi đó tại Thiên Mạc, quân Đại Việt hừng hực khí thế phản công. Kể từ sau trận Bình Lệ Nguyên, vua Trần Thái Tông đặc biệt tin cậy Ngự sử trung tán Lê Tần. Hằng ngày Lê Tần đều cùng vua và Thái sư Trần Thủ Độ bàn việc cơ mật, lên kế hoạch chiếm lại kinh thành. Trong lúc đại quân còn đang chuẩn bị ở Thiên Mạc, thì Nhân Huệ vương Trần Khánh Dư đã tự thống lĩnh đội gia binh của mình liên tiếp cơ động ở gần đại doanh của Mông Cổ, tổ chức những trận mai phục nhỏ tiêu diệt những toán quân đi lẻ tẻ cướp bóc. Vị tướng trẻ Trần Khánh Dư bấy giờ đương tuổi thiếu niên (1), với cách đánh xuất quỷ nhập thần cùng đội quân của mình đã làm cho quân địch thêm phần hoang mang, và càng cổ vũ nhuệ khí quân ta dâng cao. Mọi việc bàn định và chuẩn bị xong, cuối tháng 1.1258 binh thuyền Đại Việt nối tiếp nhau xuôi dòng sông Hồng tiến thẳng về thành Thăng Long, quyết chí thu phục lại kinh đô, đuổi giặc khỏi bờ cõi.
Chiến thuyền Đại Việt thời này vừa đông đảo lại vừa đa dạng về chủng loại, với nhiều chức năng chiến đấu khác nhau. Chiếm số lượng nhiều nhất trong hạm đội là những thuyền loại Mông Đồng. Loại thuyền này mạn thấp, mũi thuyền vút cao, có mái che tên, mỗi chiếc chở được khoảng 60 người. Trong đó có khoảng 30 tay chèo, 30 thủy binh. Khi lâm trận, tùy tình huống mà người chèo thuyền cũng có thể cầm vũ khí tham gia chiến đấu như binh lính. Hoàng thái tử Trần Hoảng (sau là vua Trần Thánh Tông) bấy giờ mới 18 tuổi, được vua Trần Thái Tông giao quyền đồng chỉ huy, trực tiếp thống lĩnh đội lâu thuyền (thuyền chiến có nhiều tầng lầu) đi tiên phong. Vua Trần Thái Tông đích ngự lâu thuyền dẫn toàn quân còn lại theo sau tiếp ứng.
Nửa đêm ngày 28, rạng sáng ngày 29.1.1258 (24 tháng Chạp năm Đinh Tỵ 1257 Âm lịch), quân Đại Việt tắt hết đèn đuốc, âm thầm chèo thuyền đến gần bến Đông Bộ Đầu, nơi quân Mông Cổ đóng đại doanh. Ngay sau khi tiếp cận thành công, thình lình trống trận quân Đại Việt nổi lên, đèn đuốc thắp sáng rực một khúc sông. Những làn mưa tên từ những chiến thuyền Đại Việt bắn tới tấp vào các chốt lính canh. Kế đến, hàng lớp chiến thuyền lớn nhỏ nhanh chóng đưa quân đổ bộ lên bờ, đánh sâu vào doanh trại địch. Lợi thế lớn ở chiến thuyền giúp cho quân Đại Việt có thể đổ bộ một cách dễ dàng. Quân Mông Cổ bị tấn công vào nửa đêm, sau những tổn thất ở vòng ngoài và hoảng loạn ban đầu thì gấp gáp định thần, mặc giáp cầm gươm ra chống đỡ. Ngột Lương Hợp Thai ra sức hô hào chỉnh đốn hàng ngũ. Từ các liều trại, quân Mông vội lên ngựa ùa ra kịch chiến với quân Đại Việt. Lúc này Đại Việt đã tấn công sâu lên bờ, mất đi sự yểm trợ đắc lực từ các chiến thuyền.
Tuy vậy với lợi thế áp đảo về quân số, sĩ khí, lại là quân no đánh quân đói nên trận tuyến Đại Việt hoàn toàn áp đảo quân địch. Thái tử Trần Hoảng cùng vua Trần Thái Tông ngự trên lâu thuyền chỉ huy toàn trận đánh. Những chiến tướng Đại Việt như Trần Quốc Tuấn, Trần Khánh Dư, Lê Tần … chia quân làm nhiều mũi công kích giặc trên các hướng. Quân Mông Cổ dồn quân chỗ cự mặt này thì lại hở mặt kia do thiếu quân và bất lợi ở trời tối. Trần Khánh Dư quan sát được sơ hở của địch, thúc quân đánh thọc sâu vào trận địa làm hàng ngũ Mông Cổ càng thêm rối loạn và tổn thất nặng nề. Khí thế quân Đại Việt ngút trời, dần hình thành thế bao vây quân địch. Là một tướng lão luyện, Ngột Lương Hợp Thai nhanh chóng nhận ra thế trận đã được định đoạt. Y lập tức hạ lệnh rút lui gấp về hướng bắc để bảo toàn lực lượng. Tính tổng cộng quân Mông Cổ chỉ ở Thăng Long được 9 ngày. Quân Mông Cổ rút theo đường cũ, men theo sông Nhị, sông Thao mà chạy một mạch về biên giới tây bắc Đại Việt.
Quân Mông Cổ tháo chạy, trận Quy Hóa
Thời bấy giờ lưu truyền về khả năng rút quân bảo toàn lực lượng của quân Mông Cổ ấn tượng cũng chẳng kém khả năng tấn công thủ thắng. Hắc Thát Sử Lược của học giả Bành Đại Nhã nước Tống chép về quân Mông Cổ : “ … Họ mà thắng thì đuổi theo địch chém giết, không để trốn thoát. Họ mà thua thì chạy rất nhanh, đuổi theo không kịp …”. Sẽ là một chiến thắng không triệt để nếu quân ta chỉ có thể bức rút mà không tiêu diệt được phần lớn sinh lực địch. Với quân số còn đông, quân Mông Cổ hoàn toàn có thể tạm thời lui binh để xốc lại lực lượng. Kỵ binh Mông Cổ “ngày đi vài trăm dặm”, rút lui rồi quay lại cũng sẽ chẳng mấy hồi vì chúng đã có Vân Nam (lãnh thổ Đại Lý thời bấy giờ) làm bàn đạp.
Lúc này quân Mông Cổ đã bại trận, sĩ khí tiêu tan, chỉ mong chạy thoát thân trước rồi mọi chuyện về sau mới tính kế. Quân Mông Cổ rút quân theo hàng dọc, người ngựa chạy đường dài chừng đã mệt mỏi, binh thế đứt đoạn, tốp trước tốp sau không liền lạc. Quân Mông chạy lọt vào trận địa dàn sẵn, nhất tề quân mai phục nổi lên tấn công mãnh liệt vào đoàn quân mệt mỏi của địch. Cung nỏ đồng loạt bắn ra, hàng ngàn chiến binh hăng hái xông vào giáp chiến với quân Mông Cổ. Bị tấn công bất ngờ tại địa hình hiểm trở, không kịp tập họp lực lượng chống đỡ nên quân Mông Cổ lại bị thiệt hại nặng nề. Ngột Lương Hợp Thai thúc quân cố chết phi ngựa vượt qua làn tên của đội quân dưới trướng trại chủ Hà Bổng, mạnh ai nấy giữ lấy thân, chẳng buồn đánh trả. Sự chống trả yếu ớt khác hẳn sự hung hăng, cướp phá lúc ban đầu khi tiến vào Đại Việt khiến quân dân vùng biên giới cũng không khỏi ngạc nhiên, mỉa mai gọi quân Mông Cổ là “giặc Phật”. Hà Bổng thúc quân truy kích. Quân của Ngột Lương Hợp Thai chạy đến biên giới thì một toán du binh Mông Cổ từ Vân Nam đến đón. Quân ta ngừng truy đuổi.