Cresce nel vivaio del Livorno, squadra della sua città. Debutta in Serie A con gli amaranto il 16 maggio 2010, a 18 anni, giocando titolare nell'ultima giornata del campionato, la partita Parma-Livorno (4-1) disputata allo Stadio Ennio Tardini.
Inter
La stagione seguente, dopo la retrocessione, rimane in prima squadra fino a gennaio 2011, quando viene acquistato in compartecipazione dall'Inter. Viene quindi inserito nella Primavera nerazzurra con la quale vince il Torneo di Viareggio 2011, al termine del quale viene nominato miglior portiere della competizione.[3]
Prestiti al Livorno, Novara ed ancora Livorno
Nell'estate successiva torna al Livorno, debuttando in Serie B il 27 agosto 2011 nella partita Crotone-Livorno (1-2) e affermandosi subito come titolare.
Termina la stagione con 34 partite e 38 gol subiti in campionato.
Il 22 giugno l'Inter rileva dal Livorno l'altra metà del cartellino del giocatore (1,5 milioni di euro[4]) mentre Luca Siligardi viene rilevato completamente dai toscani insieme a Simone Dell'Agnello.[5] Il giocatore viene poi ceduto il 14 luglio al Novara con la formula del prestito.[6] A Novara giocherà in tutto 38 partite subendo 46 reti, giocando i play-off per la promozione in Serie A e venendo eletto miglior portiere del campionato cadetto.[7]
Il 30 giugno 2013 fa ritorno all'Inter, non venendo però convocato da Walter Mazzarri al ritiro pre-campionato.[8] Dieci giorni dopo torna per la terza volta in carriera tra le file del Livorno, neopromosso in Serie A, che lo ingaggia a titolo temporaneo.[9] Qui gioca 35 partite e la squadra toscana retrocede subito.
Prestiti a Chievo ed Espanyol
Il 5 luglio 2014 viene mandato in prestito al ChievoVerona.[10] Esordisce con la maglia gialloblù in occasione della partita di Coppa Italia persa 1-0 contro il Pescara. In occasione della seconda giornata di campionato contro il Napoli para un rigore a Higuaín.[11] Il 26 ottobre para un altro rigore, questa volta a Pinilla. Disputa da titolare le prime 9 giornate di campionato, venendo poi rimpiazzato dal portiere argentino Albano Bizzarri.[12][13] Torna in campo unicamente alla terz'ultima giornata contro il Torino allo Stadio Olimpico, a salvezza già conquistata.
Il 25 luglio 2015 si trasferisce in prestito con diritto di riscatto all'Espanyol, per sostituire Kiko Casilla acquistato dal Real Madrid. Tuttavia, non riesce ad ottenere la fiducia del tecnico e non disputa nemmeno un minuto nella Liga, disputando soltanto la Coppa del Re[14].
Gli anni a Frosinone
Il 28 gennaio 2016 viene ufficializzato il trasferimento in prestito al Frosinone in Serie A.[15] Si trova ad essere il secondo portiere dietro Nicola Leali, ed esordisce solo alla 36ª giornata, il 1º maggio, nella partita pareggiata 3-3 contro il Milan a San Siro nella quale para un rigore a Mario Balotelli.[16]
Il 4 luglio 2016 viene ufficialmente rinnovato il prestito al Frosinone per un'altra stagione. Il contratto prevede anche il diritto di riscatto e controriscatto da parte dei nerazzurri del cartellino del giocatore.[17]
Il 13 luglio 2017 viene ufficialmente prolungato il prestito nella squadra ciociara per un'altra stagione.[18] Al termine della stagione, vista la conquista della massima serie dopo la vittoria dei play-off, viene riscattato dai ciociari per 1 milione di euro. In A gioca però solo 3 partite mentre torna titolare nel 2018-2019, dopo la retrocessione in B.
Nella serie cadetta torna a essere titolare dei ciociari.
Bologna
Il 17 luglio 2021 viene ufficializzato il suo approdo a titolo definitivo al Bologna.[19][20] Debutta con i felsinei nel pareggio interno contro l'Udinese (risultato di 2-2) a causa dell'indisponibilità di Skorupski[21][22] e nell'ultima giornata di campionato contro il genoa al Ferraris.[23]
Nella stagione 2022-2023, dopo aver giocato titolare in Coppa Italia, gioca titolare la partita contro l'Udinese, vinta 3-0, a causa dell'indisponibilità di Skorupski, risultando uno dei migliori in campo. Dopo due anni trascorsi prevalentemente come secondo portiere riserva di Łukasz Skorupski viene svincolato dalla società felsinea.
Reggiana
Il 6 luglio 2023 viene ingaggiato dalla Reggiana, neopromossa in Serie B, con cui sottoscrive un contratto fino al 30 giugno 2025.[24]
^FRANCESCO BARDI TORNA AL FROSINONE, su frosinonecalcio.com, 4 luglio 2016. URL consultato il 4 luglio 2016 (archiviato dall'url originale il 7 luglio 2016).