Inizia la sua carriera motociclistica da piccolo girando nei kartodromi vicino a casa, prima con la minimoto e poi con la minigp. Nel 2011, conosce Paolo Simoncelli, correndo nel 2013 per il SIC58 Squadra Corse, nella PreGP del campionato Italiano Velocità.[1]
Resta tra le file della SIC58 Squadra Corse per tre anni, due in PreGP, denominata Premoto3 125 2T nel 2014, nei quali conquista due vittorie e tre podi, chiudendo rispettivamente secondo e sesto in classifica generale, per poi passare in Moto3, sempre nel campionato Italiano Velocità nel 2015 in sella ad una FTR Honda, ottenendo come miglior risultato un settimo posto ad Imola.
Nel 2016, interrotto il rapporto con la SIC58 Squadra Corse trova un accordo per correre sempre nel CIV Moto3 con una KTM, ottenendo come miglior risultato un sesto posto nella seconda gara a Vallelunga.[2] Nel 2017, inizia la stagione sempre in Moto3 con il team 3570 MTA in sella ad una Mahindra e completa i primi due round stagionali, non andando oltre un doppio ottavo posto. Dal terzo round del Mugello, passa alla categoria Supersport 300 prendendo il posto di Simone Mazzola, infortunatosi a Misano nel round precedente, tra le file del ProGP Racing in sella ad una Yamaha, con la quale completa la stagione ottenendo una vittoria[3] e due podi, chiudendo in settima posizione nella classifica generale.
Dopo un inverno complicato tra un infortunio in allenamento ed un incidente in macchina, come passeggero[4], nel 2018 prosegue nel campionato Italiano Velocità con il ProGP Racing e conquista otto podi, giocandosi il titolo di campione italiano fino all'ultima gara, chiudendo poi in terza posizione in classifica generale. Sempre nel 2018 esordisce come wild card nel campionato mondiale Supersport 300 ad Imola, conquistando la sesta posizione in superpole e la terza posizione in gara,[5]. Nello stesso anno, partecipa anche al round di Misano, nel quale scivola nel corso del primo giro. Termina la stagione al 20º posto nel mondiale con 16 punti.[6]
L'anno seguente diventa pilota titolare nel mondiale Supersport 300, venendo ingaggiato dal team Trasimeno, sempre su Yamaha YZF-R3. Ottiene punti in quattro gare, tra le quali spicca la vittoria a Donington, in cui batte la concorrenza di Andy Verdoïa e Mykyta Kalinin per conquistare il suo primo successo mondiale. Termina la stagione al 12º posto con 41 punti.[7] Nel 2020 prosegue nel mondiale ma passa al team Kawasaki GP Project. Ottiene punti in otto gare in stagione, con il miglior risultato un 4º posto a Magny Cours. Conclude al 14º posto in classifica generale con 55 punti.[8]
Nel 2021 torna in Yamaha e viene scelto come pilota dal team Viñales Racing, diretto da Angel Viñales, padre di Maverick, pilota di MotoGP.[9] A stagione in corso si trasferisce al team Kawasaki GP Project in qualità di pilota sostitutivo. Conclude la stagione al ventisettesimo posto in classifica.[10] Nel 2022 rimane con lo stesso team con cui conclude la stagione precedente. In occasione del Gran Premio di Most ottiene la sua prima pole position.[11] Chiude la stagione al quattordicesimo posto in classifica. Nel 2023 gareggia per il team Flembbo-Pl Performances con Julio García come compagno di squadra. Con quasi cento punti si classifica al dodicesimo posto in campionato con un secondo posto a Magny-Cours come miglior risultato in gara.[12] Nel 2024 continua con la stessa squadra dell'annata precedente; il compagno di squadra è Ruben Bijman. Contestualmente al mondiale, gareggia nella stessa categoria del campionato italiano dove con due vittorie e un terzo posto su quattro prove disputate, si classifica al nono posto.[13] Nel mondiale i punti conquistati in Francia gli consentono di classificarsi ventisettesimo.[14]