Born in Amsterdam, Kluivert came through the AFC Ajax youth program, and had his first professional contract with Ajax. He made his Eerste Divisie debut with Jong Ajax on 16 September 2016 in a game against MVV, replacing Vince Gino Dekker in the 67th minute, in a 1–0 away loss. He also played in the 2016–17 UEFA Youth League, in which he scored in a 2–0 group stage win at PAOK on 2 November.
Kluivert made his first team debut in the Eredivisie on 15 January 2017 in a 1–3 away win against PEC Zwolle, when he replaced Amin Younes in the 39th minute. He scored his first Eredivisie goal on 19 March in an away match against SBV Excelsior, exactly 10 years and one day after his father's last career goal. The match ended in a 1–1 draw. He made six appearances in the 2016–17 UEFA Europa League, and was an unused substitute in the final, a 2–0 loss to Manchester United in Stockholm.
On 26 November 2017, Kluivert opened his account for the season with a hat-trick in a 5–1 home win over Roda JC.
On 12 June 2018, Kluivert moved to Italian club Roma, following a telephone call made by Roma legend Francesco Totti to his father, for €18.75 million. He became the fifth Dutch player ever to represent the Italian side. Kluivert chose the number 34 shirt number at Roma as a support for his good friend and former teammate Abdelhak Nouri, who wore it at Ajax; Nouri suffered a career-ending cardiac arrhythmia attack in 2017.
Kluivert became the youngest Roma player to score in the UEFA Champions League after scoring the fourth goal in 5–0 home victory against Viktoria Plzeň on 3 October 2018. It was his first goal for the Giallorossi, and he dedicated it to Nouri. On 16 December, he scored for the first time in the Serie A in a 3–2 home win over Genoa.
For the 2019–20 season, Kluivert changed his shirt number to 99, representing the year he was born.
Loan to RB Leipzig
On 5 October 2020, Kluivert joined Bundesliga club RB Leipzig on a season-long loan. On 5 December, he scored his first Bundesliga goal in a 3–3 away draw against Bayern Munich. On 8 December, he scored a goal in a 3–2 win over Manchester United in the 2020–21 UEFA Champions League.
Loan to Nice
On 20 July 2021, Kluivert joined French Ligue 1 club Nice on season-long loan with an option to buy.
At the 2016 Under 17 Euros held in Azerbaijan, Kluivert played throughout the tournament in which the Netherlands reached the semi finals.
Kluivert earned his first full international call up in Ronald Koeman’s first Dutch national football team squad in March 2018 for the friendlies against England and Portugal. He made his senior debut on 26 March, in a 3–0 win over the reigning European champions Portugal, at the Stade de Genève, replacing Memphis Depay for the final 12 minutes of the match.
Justin Kluivert is the son of former Dutch international football player Patrick Kluivert, and grandson of former Surinamese football player Kenneth Kluivert. He is also of Curaçaoan descent through his paternal grandmother. Kluivert has four brothers, including footballer Ruben Kluivert who is currently playing for the Jong Utrecht.
On 29 August 2020, he tested positive for COVID-19.