Born in Levski, Pleven Province, Milanov began playing football at the local club, before joined the Litex Lovech Academy, together with his twin brother Iliya, in 2005.[3] He was part of a group of young players at the club who guided the club to win the Bulgarian U-17 Championship in June 2009, with Milanov scoring in the final against Levski Sofia.[4]
On 1 August 2009, Milanov made his first team debut, at 17 years 152 days, coming off the bench in the 2009 Bulgarian Supercup against Levski Sofia, which ended in a 1–0 defeat at Vasil Levski National Stadium. A week later, he made his league debut against Lokomotiv Mezdra, scoring the opening goal in a 5–0 victory.[5] On 3 December, he scored his first ever Bulgarian Cup goal, in a 4–0 win over Pirin Gotse Delchev which sent them through to the 1/8 finals. Milanov play regularly in his first season, making 31 appearances in all competitions and collected his first A PFG title winner's medal at the end of the 2009–10 season.
On 14 August 2010, in a 2–1 home victory over Pirin Blagoevgrad, Milanov netted his first goal of 2010–11 season.[6] He ended his second season with 5 goals in 36 appearances in all competitions. Milanov helped Litex retain the A PFG title by a 3-point margin after being pushed by Levski Sofia for much of the season.
In 2011–12 season, Milanov scored 6 goals in 25 league matches. On 24 May 2012, he was credited with the ABF A PFG Young Player of the Season award, by the professional footballers association of Bulgaria.[7]
On 19 August 2012, Milanov scored his first goal of 2012–13 season in a 1–1 away draw against Lokomotiv Plovdiv. On 27 October, he scored his first ever hat-trick in the A PFG, against Montana, in a 3–1 victory at Ogosta Stadium; he scored from a penalty kick and a two free-kicks.[8] On 27 December 2012, he became the youngest ever recipient of the Bulgarian Footballer of the Year award.[9] On 30 March 2013, as a result of injuries to regular captains Nebojša Jelenković and Nikolay Bodurov, Milanov captained Litex for the first time[citation needed] against Botev Vratsa in a 5–1 home win.[10] On 14 April, he played his 100th match for Litex in the league in a 2–1 away loss against Slavia Sofia.[11]
CSKA Moscow
On 5 July 2013, Milanov signed with Russian Premier League side CSKA Moscow[12] on a five-year deal for an initial fee of 5,4 million leva, with a further 2 million leva depending on CSKA appearances in the UEFA competitions in the next two years.[13] He was given the number 23 jersey. He made his official debut on 18 August 2013, in the 1–0 home win over Kuban Krasnodar in a league match after coming on as a late substitute for Keisuke Honda.[14] Although having had trouble fitting into the club at start, Milanov is improving at a fast rate according to head coach Leonid Slutsky, resulting in him becoming a regular starter plus in him receiving playing time in important European matches in the group stages of the 2013–14 UEFA Champions League. He provided his first assist in a 4–1 home win over Terek Grozny; it was the opening goal of the match netted by teammate Seydou Doumbia.
Milanov scored his first official goal for CSKA Moscow in a game against FC Zenit Saint Petersburg on 16 March 2014 – a long range effort that eventually won the game for his team; being the only goal scored in the whole match. His classy goal didn't go unnoticed, as he was voted player of the week for matchday 21 in the Russian Premier League.
For the 2016–17 season, Milanov received the number 8 jersey upon his return from Grasshopper. He scored his first goal of the season in a 0–1 away win against FC Ural, saving his team from a 0–0 draw in the last seconds of the game.
Upon the expiration of his contract at the end of the 2017–18 season, he left CSKA as a free agent.[15]
On 3 September 2018, he joined Hungarian club Fehérvár FC.[17] He made his debut on 15 September in a 2–1 away loss against Puskás Akadémia FC. He scored his first goal for the club on 23 September in a 0–2 win against Cigánd SE, in a match for the Magyar Kupa. On 8 November 2018, he scored the only goal in a 1–0 home win against PAOK in a Europa League match.
On 21 July 2020, Milanov left Fehérvár on mutual agreement.[18]
Levski Sofia
After more than a year without a club, Milanov joined Levski Sofia on 29 July 2021, signing a one-year contract with the club.[19]
Dinamo București
On 19 January 2024, Dinamo București announced the signing of Milanov, when the club was in the Liga I relegation zone.[20] Milanov made his debut for the team on 27 January 2024, in the 1-2 loss against Rapid București, when he came in as a substitute in the 78th minute to replace Dennis Politic.[21] On 12 February 2024, he provided an assist for Darko Velkovski in the 2-0 away win against champions Farul Constanța[22] and he was selected as man of the match.[23]
International career
Milanov was called up to the Bulgaria under-21 team for the first time in February 2010, making his competitive debut on 3 March, in a 0–2 loss against Montenegro U21.
Milanov was called up to the senior Bulgaria squad for the first time in September 2011, and made his full international debut in a friendly against Ukraine at Valeriy Lobanovskyi Dynamo Stadium on 7 October, playing 24 minutes as a substitute of a 3–0 loss for Bulgaria. On 7 September 2012, Milanov scored his first international goal in a 2–2 home draw against Italy during 2014 FIFA World Cup qualifying.[24]