Duffy sloot zich in november 2008 aan bij Everton. In juli 2009 liet David Moyes hem samen met andere jongeren meetrainen met het eerste elftal. Hij scoorde in de oefenwedstrijd tegen Rochdale. Hij maakte zijn profdebuut in december 2009 in de Europa League tegen het GriekseAEK Athene, als invaller voor de geblesseerde Sylvain Distin. In Everton's volgende Europese wedstrijd, thuis tegen het Wit-RussischeBATE Borisov, speelde hij de volledige wedstrijd. Op 24 maart 2011 leende Everton hem 28 dagen uit aan Burnley. Op 2 april 2011 speelde hij zijn enige wedstrijd voor Burnley, thuis tegen Ipswich Town. Hij speelde de volledige wedstrijd. Op 1 september 2011 werd hij uitgeleend aan Scunthorpe United. Op 10 september 2011 debuteerde hij tegen Sheffield United. Hij werd meteen tot man van de wedstrijd uitgeroepen. Hij speelde 18 wedstrijden voor The Iron, totdat hij op 5 januari 2012 werd teruggeroepen door Everton na een blessure bij Phil Jagielka. Op 11 januari 2012 maakte hij zijn Premier League debuut op White Hart Lane. Hij viel in na een uur spelen tegen Tottenham Hotspur. Drie dagen later startte hij, mede door de blessures van Sylvain Distin en Phil Jagielka, voor het eerst in het basiselftal tegen Aston Villa. Hij tekende in september 2014 een driejarig contract bij Blackburn Rovers, dat hem voor een niet bekendgemaakt bedrag overnam van Everton.[2] In 2016 ging hij voor Brighton & Hove Albion spelen waarmee hij in 2017 naar de Premier League promoveerde. In het seizoen 2020/21 werd hij verhuurd aan het Schotse Celtic FC, waarmee hij als tweede eindigde achter kampioen Rangers FC.
Duffy speelde in verschillende Noord-Ierse nationale jeugdelftallen. Hij speelde drie interlands voor Noord-Ierland –21, waarin hij één doelpunt maakte. Omdat zijn vader geboren werd in het Ierse Donegal bezit Duffy ook de Ierse nationaliteit. Hij speelde zeven interlands voor Ierland –21, alvorens in 2014 zijn debuut te maken in het Iers voetbalelftal. Met Ierland nam Duffy in juni 2016 deel aan het Europees kampioenschap voetbal 2016 in Frankrijk. Ierland werd in de achtste finale uitgeschakeld door gastland Frankrijk na twee doelpunten van Antoine Griezmann.