João Sousa fait ses premiers pas sur le circuit Future en 2007 en Espagne. En , alors classé 744e mondial, il participe à son premier tournoi ATP à Estoril. Il gagne ses trois matchs de qualifications et bat le 164e mondial, Oliver Marach (6-1, 6-3) avant de s’incliner contre son compatriote Frederico Gil (7-65, 6-2).
En 2009, il remporte son premier tournoi Future à Puerto de la Cruz, deux semaines après avoir atteint sa première finale à Telde. Début 2010, il s'adjuge sa première victoire dans un tournoi Challenger à Rabat en écartant Teymuraz Gabashvili. En mai, il remporte trois Future consécutifs en Espagne, à Valldoreix, Adeje et Lanzarote. Ces bons résultats lui permettent d’intégrer le top 300. En août, il remporte le tournoi de Tampere en double avec Leonardo Tavares.
Invité au tournoi d'Estoril, il profite de l’abandon de son compatriote Gastão Elias pour accéder aux huitièmes de finale mais il est battu par Milos Raonic (6-3, 6-3). Début juin, il remporte le tournoi Challenger de Fürth contre l'Allemand Jan-Lennard Struff (6-2, 0-6, 6-2) après avoir éliminé la tête de série no 1, Tobias Kamke (76e mondial) en quart de finale.
En 2012, après une demi finale à Meknès, il remporte son second tournoi Challenger à Mersin face à l'Espagnol Javier Martí. Lors du tournoi de Barcelone, il s'extirpe des qualifications puis bat Igor Kunitsyn au premier tour avant de s’incliner contre Frederico Gil (4-6, 6-4, 6-3). Il est ensuite quart de finaliste à Estoril, battu par Albert Ramos (6-2, 6-3), puis il se qualifie pour le tournoi de Roland Garros mais il est éliminé au premier tour par Marcel Granollers (6-2, 3-6, 6-3, 6-4). Il remporte également le tournoi de Tampere et atteint une finale à Côme.
2013 : Révélation et premier titre ATP
Il commence 2013 en jouant des tournois ATP mais ne gagne que deux matchs dont un à Acapulco contre Jürgen Melzer. En juin, il s'adjuge le tournoi de Fürth pour la deuxième fois, puis en juillet, il remporte celui de Guimarães, sa ville natale, contre Marius Copil.
C'est à l'US Open qu'il se révèle au grand public en éliminant un homme fort du moment, Grigor Dimitrov dans un match très serré (3-6, 6-3, 6-4, 5-7, 6-2). Il bat ensuite Jarkko Nieminen en cinq sets également (1-6, 6-3, 3-6, 6-3, 6-4) avant de s'incliner face au no 1 mondial Novak Djokovic (6-0, 6-2, 6-2). Il confirme sa bonne forme en atteignant les demi-finales à Saint-Pétersbourg en éliminant notamment Dmitri Toursounov. Lors du tournoi de Kuala Lumpur, il n'est classé que 77e mondial mais il élimine sans difficultés Ryan Harrison et Pablo Cuevas. Il crée ensuite la surprise en s'imposant assez aisément contre David Ferrer, no 4 à l'ATP et récent finaliste de Roland-Garros (6-2, 7-66). Il écarte également Jürgen Melzer (6-4, 3-6, 6-4) puis remporte son premier titre ATP en battant Julien Benneteau (2-6, 7-5, 6-4) en sauvant une balle de match dans le deuxième set. Cette victoire est historique pour le Portugal, puisqu'il apporte à son pays un premier titre dans un tournoi ATP[3], trois ans après la finale de Frederico Gil à Estoril. En octobre, il prend sa revanche sur Guillermo García-López à Valence qui l'avait battu à Saint-Pétersbourg.
2014-2017 : Maintien dans le top 50 et deuxième titre
Il commence l'année par un quart de finale à Rio où il est sèchement battu par Rafael Nadal (6-1, 6-0). Il réalise ensuite sa meilleure performance en Masters 1000 en atteignant le 3e tour à Miami en battant notamment Gilles Simon au second tour.
Après une saison difficile sur terre battue, il parvient à se qualifier pour les demi-finales du tournoi de Bois-le-Duc, puis profite d'un tableau relativement dégagé pour se hisser en finale de l'Open de Suède où il s'incline face à Pablo Cuevas (6-2, 6-1). En septembre, il atteint la finale du tournoi de Metz en éliminant Gaël Monfils.
Il remporte enfin le premier titre de sa saison et le 2e titre de sa carrière lors du tournoi de Valence, face à Roberto Bautista-Agut sur le score de 3-6, 6-3, 6-4[4].
En 2016, il atteint son meilleur résultat dans un Masters 1000 sur la terre battue de Madrid, en s'acheminant jusqu'en quart de finale, en battant au premier tour Nicolas Mahut (6-4, 6-4), puis Marcel Granollers (6-3, 6-3) et en huitième l'Américain Jack Sock (6-1, 63-7, 6-2) en 2 h 14. Il affronte Rafael Nadal au tour suivant[5]. Il s'incline (6-0, 4-6, 6-3) contre l'Espagnol, mais en ayant lutté jusqu'au bout[6].
2018-2019 : confirmation, troisième titre et huitième de finale à l'US Open et Wimbledon
João Sousa devient le premier Portugais à s'imposer devant son public en remportant le tournoi d'Estoril en en battant l'Américain Frances Tiafoe (6-4, 6-4) en finale[7].
À l'US Open, il se qualifie pour les huitièmes de finale, en battant notamment le 12e mondial Pablo Carreño Busta au second tour, et devient le premier joueur portugais à réaliser cette performance en Grand Chelem.
L'année suivante, il atteint le même stade lors du tournoi de Wimbledon, éliminant notamment Marin Čilić (tête de série n°13) au 2e tour, avant de perdre en trois sets contre Rafael Nadal.
2022 : quatrième titre
En janvier 2022, alors retombé à la 137e place mondiale, João Sousa décroche le quatrième titre de sa carrière sur le circuit ATP à l'occasion de l'Open de Pune, où il sauve deux balles de match contre Elias Ymer en demi-finale, puis se défait du Finlandais Emil Ruusuvuori en finale au bout du troisième set[8].