Schuurs maakte op 14 oktober 2016 zijn debuut in het betaald voetbal. Hij speelde die dag met Fortuna Sittard een wedstrijd in de Eerste divisie thuis tegen VVV-Venlo. Met zijn ploeggenoten won hij met 2-0. Hij kwam zelf in de 90e minuut in het veld voor Okan Kurt. Schuurs groeide dat seizoen uit tot een vaste waarde in het elftal van Fortuna. Trainer Sunday Oliseh benoemde hem in juli 2017 tot aanvoerder van de ploeg.[2]
Schuurs tekende op 7 december 2017 een contract bij Ajax met een looptijd van 1 januari 2018 tot en met 30 juni 2022. De Amsterdamse club betaalde ruim twee miljoen euro voor hem aan Fortuna Sittard, dat daarbij circa één miljoen in het vooruitzicht kreeg aan eventuele bonussen en een doorverkooppercentage bedong. Hij maakte het seizoen 2017/18 op huurbasis af bij Fortuna Sittard,[3] dat in dit seizoen meespeelde om het kampioenschap in de Eerste divisie. Uiteindelijk werd Schuurs met Fortuna tweede, achter Jong Ajax, waardoor het direct promoveerde naar de Eredivisie.[4]
Ajax
Op 8 mei 2018 maakte Ajax bekend dat Schuurs meeging naar Dubai voor het slotakkoord van het seizoen 2017/18.[5] Drie dagen later maakte Schuurs zijn officieuze debuut voor Ajax, in een verloren oefenwedstrijd tegen Al-Ahly om de Champions Golden Cup.[6]
Tijdens seizoen 2018/2019 speelde Schuurs meestal met Jong Ajax in de Keuken Kampioen Divisie. Voor het eerste van Ajax debuteerde hij op 26 september 2018 in de bekerwedstrijd tegen HVV Te Werve uit Rijswijk, waarin hij de openingstreffer maakte. Zijn debuut in de Eredivisie, op 7 oktober 2018 als invaller tegen AZ, was zijn enige Eredivisie-optreden in dat seizoen. In de Champions League kreeg hij geen speelminuten.
Voorafgaand aan seizoen 2019/20 sprak Schuurs de wens uit om de opvolger te worden van de vertrokken Matthijs de Ligt.[7] Dit lukte niet meteen, want trainer Erik ten Hag koos vaker voor Joel Veltman dan voor Schuurs op de positie van rechter centrale verdediger. Zijn eerste doelpunt in de eredivisie is de 3-1 tegen Heerenveen op 14 september. Het debuut van Schuurs in de Champions League volgde in de turbulente uitwedstrijd op 5 november tegen Chelsea. Na twee rode kaarten voor beide centrale verdedigers kwam Schuurs in de ploeg, en haalde Ajax een punt (4-4).[8] Na de winterstop kreeg Schuurs ook concurrentie van Edson Alvarez.
In seizoen 2020/21 kreeg Schuurs, mede door het vertrek van Joël Veltman, opnieuw de kans op een vaste basisplaats. Hij wist deze kans te verzilveren, en vormde samen met Daley Blind de centrale verdediging. Op 15 januari 2021 verlengde Schuurs zijn contract voor drie jaar bij Ajax tot medio 2025.[9] Met name in de tweede helft van het seizoen kreeg Schuurs concurrentie van Jurriën Timber. Hierdoor raakte Schuurs zijn vaste basisplaats kwijt.
Tijdens seizoen 2021/22, het laatste seizoen van Schuurs bij Ajax, kreeg Timber meer speeltijd dan Schuurs op de positie van rechter centrumverdediger.
Torino
In augustus 2022 vertrok Schuurs naar Torino, waar hij rugnummer 3 kreeg toegewezen. Bij deze club kreeg hij veel speeltijd. Tijdens zijn tweede seizoen bij deze club, op 21 oktober 2023, liep hij tijdens een wedstrijd met Internazionale een zware blessure op aan de kruisband van zijn linkerknie.
Schuurs kwam regelmatig uit voor de elftallen Nederland onder 19, onder 20, en Nederland onder 21.
Begin september 2020 behoorde hij voor het eerst tot de selectie van het Nederlands elftal voor een tweetal wedstrijden in de Nations League.
Perr Schuurs wordt als introvert beschouwd en moest wennen aan het leven in Amsterdam. Hij leerde in het voetbal meer voor zichzelf op te komen. Sjaak Swart zei hierover:[11]
Hij moest zich meer laten gelden, meer zelfvertrouwen hebben, meer van zich afbijten. Ik kende Perr al langere tijd, via mijn Limburgse vriend Willy Dullens. Ik zie alle duels van Jong Ajax en volgde hem dan ook met extra aandacht. Maar ik vond hem afgelopen seizoen veel te behoudend spelen. Hij werd daardoor te vaak afgetroefd. Dat vond ik niet goed. En dat heb ik hem ook verteld. Het was allemaal te lief.
— Sjaak Swart, juli 2019, voor het oefenduel met Anderlecht