In de zomer van 2009 begon Toornstra bij ADO Den Haag.[4] Eind december 2009 tekende hij een profcontract bij de club, hetgeen hem voor 2,5 jaar aan de club verbond.[5]
Toornstra groeide uit tot een van de belangrijkste spelers in de selectie. Hij speelde dan ook alle wedstrijden in de competitie. Op donderdag 13 mei 2010 werd Toornstra uitgenodigd voor Jong Oranje voor de oefeninterlands in en tegen Portugal.[6] Er werd dat seizoen zelfs gesproken over het 'grote Oranje'. In mei 2010 werd het contract van Toornstra opengebroken, hij verlengde tot medio 2013.[7]
FC Utrecht
Op 31 januari 2013 tekende Toornstra een contract tot 2017 bij FC Utrecht. In zijn debuutwedstrijd op 3 februari, uit tegen FC Twente, viel hij meteen op: een goal en twee assists (vrije trap en corner). De eindstand werd 2-4.
Feyenoord
Toornstra tekende op 25 augustus 2014 een vierjarig contract bij Feyenoord. Dat betaalde € 3.500.000,- voor hem aan FC Utrecht. Hij maakte zijn debuut voor de club uit Rotterdam-Zuid op zondag 31 augustus, toen hij Lex Immers verving in de rust van een competitieduel in Enschede tegen FC Twente. Toornstra maakte zijn eerste competitiedoelpunt tegen Go Ahead Eagles op 27 september. Hij maakte de 0-2 bij een 0-4 overwinning. Op 24 april 2016 won Feyenoord de KNVB Beker door in de finale Toornstra's oude club FC Utrecht te verslaan. Hij speelde de gehele wedstrijd. In het seizoen 2016/17 werd Feyenoord Nederlands landskampioen. Toornstra was daarin belangrijk met 14 doelpunten en 9 assists. Hij eindigde daarmee op de achtste plaats van de topscorerslijst en op de negende plaats van de spelers met de meeste assists in dat eredivisie-seizoen. Al zijn doelpunten scoorde hij in thuiswedstrijden. Drie van zijn doelpunten maakte hij in de wedstrijd tegen Go Ahead Eagles op 5 april (8-0 winst). Toornstra was dat seizoen twee keer aanvoerder; in de beker-wedstrijd tegen SBV Excelsior en de competitiewedstrijd tegen sc Heerenveen. Die tweede keer was hij aanvoerder voor slechts een kwartier.
In het seizoen 2017/18 won Feyenoord na een strafschoppenreeks de Johan Cruijff Schaal tegen Vitesse. Toornstra scoorde het enige doelpunt voor Feyenoord en wist vervolgens ook zijn strafschop te benutten. Later dat seizoen won Feyenoord ook het bekertoernooi, door in de finale AZ met 3-0 te verslaan. Toornstra scoorde het laatste doelpunt. Ook maakte hij dat seizoen zijn Champions League-debuut tegen Manchester City. In het seizoen daarna won Toornstra zijn vijfde prijs bij Feyenoord, voor de tweede keer was het de Johan Cruijff Schaal. Door een blessure moest hij echter vroegtijdig van het veld.
In het seizoen 2021/2022 werd hij, na het vertrek van Leroy Fer, aanvoerder van Feyenoord. In datzelfde seizoen wist Toornstra met de club de eerste finale van de UEFA Europa Conference League te bereiken.[8] Feyenoord verloor de finale met 1-0 van AS Roma.[9] Toornstra begon die wedstrijd als wisselspeler en kwam na 59 minuten in het veld.[10]
Op 23 augustus 2022 verliet Toornstra Feyenoord na er acht jaar gespeeld te hebben. Mede door het feit dat hij op dat moment niet meer de garantie had op een wekelijkse basisplaats. Trainer Arne Slot betreurde zijn vertrek, maar kon Toornstra op dat moment inderdaad geen wekelijkse basisplaats garanderen.[11] Hij keerde transfervrij terug naar FC Utrecht.[12]
FC Utrecht
Bij FC Utrecht tekende hij een contract voor twee seizoenen tot medio 2024, inclusief optie voor een extra seizoen.[13] Hij was in de eerstvolgende competitiewedstrijd direct terug te vinden in de basisopstelling.
Op 9 januari scoorde uitgerekend Toornstra de Utrechtse 1-0 in het 1-1 gelijkspeelde thuisduel tegen Feyenoord.[14][15] Daarmee is hij de enige nog actieve speler die in elk van de laatste dertien voetbalseizoenen trefzeker wist te zijn.[16]
Toornstra werd op 10 november 2012 door bondscoach Louis van Gaal uitgenodigd om zich aan te sluiten bij het Nederlands voetbalelftal. Samen met zijn toenmalige ADO Den Haag-ploeggenoot Aaron Meijers werd het duo tijdelijk bij de nationale selectie gevoegd, zodat er elf tegen elf gespeeld kon worden op de training in aanloop naar de WK-kwalificatieduels met Andorra en Roemenië.[17] Toornstra had volop genoten van zijn periode als interim-international[18] en werd met een kleine kwinkslag gecomplimenteerd door Van Gaal. "Ze draaiden moeiteloos mee. (..) Ze deden wat ik van ze verlangde, ik ben zeer tevreden" zei de keuzeheer van Oranje na afloop.[19] Toornstra werd op 22 mei 2013 opgeroepen voor selectie van het Nederlands elftal voor oefenwedstrijden tegen China en Indonesië. Hij maakte op 7 juni 2013 daadwerkelijk zijn interlanddebuut, in een oefeninterland tegen Indonesië. Hij speelde ook de andere wedstrijd tegen China. In 2017 kwam Toornstra opnieuw in actie voor 'Oranje', in de oefenwedstrijden tegen Italië (28 maart) en Marokko (31 mei). Eerder werd hij al opgeroepen voor de WK-kwalificatiewedstrijden tegen Wit-Rusland en Frankrijk in oktober 2016.
Toornstra werd geboren in het ziekenhuis in Leiderdorp en groeide op in het nabijgelegen Ter Aar in een gezin dat naast Toornstra bestond uit een vader, een moeder en een zusje. Hij was sportief en zat onder andere op badminton, tennis en turnen. Later richtte hij zich enkel op voetbal, eerst bij TAVV, vanaf zijn tiende bij Alphense Boys. Hij volgde het vwo aan het Scala College in Alphen aan den Rijn. Hierna studeerde hij fiscale economie aan de Universiteit van Amsterdam. Deze studie zette hij na het behalen van zijn propedeuse stop, om zich geheel te richten op zijn voetbalcarrière. Toornstra is voornemens de studie, na het beëindigen van zijn profcarrière, weer op te nemen.[20]