Balaj started his football career with his hometown club Vllaznia Shkodër and made his professional debut at the age of 17 before going on to score 17 goals in 38 games for the club before moving to Turkey to join Gençlerbirliği. After little success in Turkey he returned to Albania and played for KF Tirana where he scored 15 league goals in 37 games before joining Sparta Prague in the Czech Republic in January 2013. During his time at Sparta Prague he was loaned out to Polish side Jagiellonia Białystok for the entire 2013–14 campaign where he scored 9 goals in 36 games in all competition before return to his parent club for the first half of the following season. He joined current club HNK Rijeka in January 2015 for a fee of €600,000 and he scored on his debut with the club in a 4–1 win over NK Lokomotiva.
Balaj joined his hometown club Vllaznia Shkodër as an 11-year-old in 2002, and his father had told the youth team coach Astrit Premçi to initially test the player as a goalkeeper as he was tall for his age. However, after only a few training sessions with Balaj, the coach Premçi realised the player was an able outfield player as he was good with his feet, so he then played him as a centre forward.
He was invited to train with the first team by the coach Mirel Josa during the latter stages of the 2007–08 season, and he made his first team debut on 17 May 2008 at the age of 17 years, 4 months and 6 days in an away game against Besëlidhja Lezhë, coming on as a 70th-minute substitute for Albert Kaçi in the 4–2 loss. He became a first team regular the following season, and he scored his first senior goal on his first appearances of the campaign in an Albanian Cup tie against Sopoti Librazhd, before going on to make 12 appearances in all competition, 7 of which were in the league and 10 of which were substitute appearances. He was part of the Vllaznia team that finished runners-up in the Albanian Superliga, finishing 4 points behind the eventual winners KF Tirana.
With the departures of Xhevahir Sukaj and James Boadu ahead of the 2009–10 season, Balaj became the club's main striker alongside Vioresin Sinani. He made his European debut on 2 July 2009 against Irish club Sligo Rovers, coming on as an 85th-minute substitute for Vioresin Sinani in the 2–1 away win.
In April 2010 he went on trial with PSG alongside fellow Albanian youth international Odise Roshi, but neither players' trial was successful. In June, he went on another trial, this time in Turkey with Gençlerbirliği which proved to be successful as he was offered a contract to join the club immediately.
A top Turkish club had been tracking the young forward for most of the 2009–2010 season whilst he was at Vllaznia; the club was not identified in January 2010 as they did not make a bid, however following the huge interest shown by Gençlerbirliği S.K. in May and June, it became clear who the unnamed Turkish club was. Balaj signed a four-year contract with Gençlerbirliği on 17 June 2010. The transfer fee was reported to be around €200,000 to €300,000, which was all given to his previous club Vllaznia in Albania. Balaj's manager Dritan Gjyrezi had only been a licensed FIFA agent for a year before managing this deal; this was his first deal in his career as an agent and he hoped to be able to send more Albanian players to Turkey. Balaj signed the contract earning him €150,000 for the first year, making the deal to be worth around €600,000 for the full four years.
In January Balaj received offers from both KF Tirana and his former club Vllaznia for a return to Albania. But after meeting with Refik Halili he signed a two-year contract for KF Tirana on 20 January 2011, earning €70,000 a season, which was a higher offer than Vllaznia's €50,000.
He made his debut for his new club on 3 February in a home match against Skënderbeu Korçë which ended in 0–0 draw, with Balaj coming on at the start of the second half for Gilman Lika. His first Tirana goal came in the Albanian Cup semi final second leg against Besa Kavajë on 6 April, scoring the equalising goal to secure his side's place in the final. He then went on to score his first league goal just nine days later in a 6–1 thrashing of KF Elbasani. Despite good performances since his January move, new coach Mišo Krstičević did not pick him to start in the final of the Albanian Cup. Balaj came on for Gilman Lika in the 54th minute and helped his side win the trophy despite ending the game with ten men and Balaj himself missing a penalty in the shootout which ended 4–3 after heroics from the keeper Ilion Lika.
He scored the winning goal in the 2011 Albanian Supercup against the league winners Skënderbeu, in a match delayed and disrupted by crowd trouble. His first league goal of the season came on 17 September in the second week of the campaign, away at Kastrioti Krujë. Starting the game as a lone striker, he equalised for KF Tirana in the 48th minute and helped his side win the game 3–2, earning their first three points of the campaign. Following KF Tiran's first win in the league, it had become evident that Balaj and Gilman Lika had formed an effective partnership from midfield to attack, both of who are from Shkodër. His next goal came just four days later in the first round of the Albanian Cup against SK Himarë of the Albanian First Division. He scored in the 36th minute, a penalty in the 52nd minute and finally rounded off his hattrick in the 67th minute, before Julián Rubio being forced to replace the player following a strong challenge which left him with an ankle injury. After scoring four goals in as many days he hoped he could one day force his way into the Albania national team, which he said would be a dream following a good start to the season.
Balaj joined Sparta Prague on trial in July 2012 in order for the manager Vítězslav Lavička to get a closer look at the player before the deal to join the club was finalised. Lavička started with Balaj in a friendly against Graffin Vlašim on 17 July. Balaj started the game brightly, getting close to scoring with a header in the 5th minute, and eventually scoring in the 19th minute with a powerful shot on goal from just outside the 18-yard box to put Sparta Prague 3–0 up. He was substituted at half time and the game was won by Sparta Prague 5–0. After the friendly he returned to Albania to sort out his contract with KF Tirana, who did not want him to leave unless they received a fee of €100,000, with Sparta Prague only offering half that sum because Bala's deal with KF Tirana was due to expire in January 2013.
On 4 October 2012, Balaj scored an historical goal in his career at UEFA Europa League against Athletic Bilbao, a match valid for group stage finished in the victory 3–1.
On 8 July 2013 he moved on loan for a year to Polish side Jagiellonia Białystok in the Ekstraklasa. He scored his 3rd goal on 9 August 2013 against Wisła Kraków in the 90'+3 to give his team the 1–1 draw. Balaj scored twice against Ruch Chorzów on 15 September 2013 and Jagiellonia won 6–0 with Balaj scoring two last goals to sent in 5 number of goals scored in the season. Balaj scored his 5th goal on 4 November 2013 against Piast Gliwice to open the score in the 56th minute but it wasn't enough as Jagiellonia got overturned 2–1.
After being returned to Sparta Prague from Jagiellonia where he was loaned for a year, he signed for the city's rivals SK Slavia Prague on 10 July 2014. He made it his debut on 26 July 2014 in the opening 2014–15 season's match against Slovácko, also his debut brought his first goal as well, as he scored the victory goal 1–2, where the match result came from behind 1–0 of the first half. On 11 August 2014 Balaj scored the opening goal in the 17th minute of the match victory 4–1 against Slovan Liberec. On 1 November 2014 Balaj came in as a substitute in the 84th minute and scored in the 87' the goal of advantage to bring his team the 3–2 victory against Příbram.
On 7 January 2015 Balaj signed a 2 1⁄2-year contract (with a 2-year extension option) with HNK Rijeka, the runners-up in the Croatian First Football League.
On 11 February 2015 Balaj made his competitive début in Rijeka's 4–1 win against NK Lokomotiva in the first leg of the Croatian Cup quarter-final, also scoring his first goal for the club. Balaj made his league début also scoring a goal. He also scored in the Adriatic derby between Rijeka and Hajduk Split on 18 February 2015, which Rijeka won 3–0. Balaj scored his second goal in the second league game in a row and third including both championships against RNK Split in the 56th minute of the match, to give his team the 1–1 draw. During the season, Balaj scored 9 goals in 15 appearances, helping Rijeka to finished as runners-up and secure a place in the 2015–16 UEFA Europa League - Second qualifying round. Balaj also features in three 2014–15 Croatian Cup matches and scored one goal.
Balaj started a new season with Rijeka retaining his starting place on 10 July 2015 in a goalless draw against Inter Zaprešić, but got substituted off for Roman Bezjak in the 58th minute. A few days later Balaj made his European debut for Rijeka playing the full 90-minutes in the 2015–16 UEFA Europa League Second qualifying round first-leg match against Aberdeen. Balaj scored his first goal of the season in his second league appearance, against Slaven Belupo Koprivnica in a 3–3 draw. During the 2015–16 season, with 9 league goals to his account, he was one of top 10 goalscorers in the league. Balaj also scored once in the Croatian Cup.
On 8 June 2016, Balaj completed a move to Russian Football Premier League side Terek Grozny for €550,000, signing a three-year contract with the option of another year. He was presented on the same day, where he was handed squad number 18. Balaj made his debut for the club on 31 July in the opening league match against Krylia Sovetov, playing for 59 minutes in an eventual 1–0 home win. It took him four matches to open his scoring account as he netted the first in the 3–1 away win versus Ufa on 20 August. This was followed by another one eight days later in the 2–1 turnaround win against Rostov. However those two goals were to open the floodgates of the strikers scoring in Russia, as he managed to score two consecutive braces in the matches against Ural and Zenit Saint Petersburg, leading the team to the win against the latter. For his performances Balaj was named Terek Grozny Player of the Month for October. Starting from April's month Balaj became a bench player despite being an important player for the team playing 22 first matches as a starter. On 21 May 2017 Balaj came in as a 73rd-minute substitute during the match against Krylia Sovetov Samara and after 3 minutes he scored the 3rd team goal in a match finished in the 3–1 victory.
Balaj started the 2017–18 season by providing an assist for the 1–0 winning goal against Amkar Perm on 16 July 2017 scored by Léo Jabá.
Balaj was part of the Albania U-19 squad for the qualifying stage of the 2009 European Championship, where he made his debut on 8 October 2008 against England at Ballymena Showgrounds, Northern Ireland by replacing Guido Tepshi at half time and where the match finished in the 3–0 loss for Albania. He scored his first and also Albania's only goal of the qualifying campaign, against Northern Ireland on 13 October 2008 at The Oval, Belfast in a 2–1 loss.
Balaj was called up to Albania national under-20 football team by coach Artan Bushati to participate in the 2009 Mediterranean Games football tournament, which began on 25 June in Pescara, Italy.
He was part of the under-21 side in their 2011 and the 2013 UEFA European Under-21 Championship qualification campaigns, scoring four goals in 13 matches.
Balaj made his debut for Albania national football team on 17 February 2010 in the unofficial match against Kosovo, where he scored a goal. He received his first official call up by coach Gianni De Biasi for the friendly match against Cameroon on 14 November 2012.
Balaj was called up for the first time in competitive matches for Albania for the 2014 FIFA World Cup qualification two closing games against Switzerland and Cyprus on 11 and 15 October 2013. He made his competitive international debut in the final match of the 2014 FIFA World Cup qualification on 15 October 2013 against Cyprus where he came in as a substitute in place of Hamdi Salihi in the 87th minute of the match which finished 0–0.
He scored his first competitive goal for Albania on 7 September 2014 against Portugal in the opening match of the UEFA Euro 2016 qualifier, which Albania won 1–0. Odise Roshi swung in a cross from the right which was behind Balaj, but on the turn he managed to get his foot to the ball and his right-footed volley found the bottom corner from 15 yards. Balaj described his goal as a "striker" goal.
On 21 May 2016, Balaj was named in Albania's preliminary 27-man squad for UEFA Euro 2016, and in Albania's final 23-man UEFA Euro 2016 squad on 31 May.
Balaj was an unused substitute in 2 first matches against Switzerland in a 0–1 loss and hosts France where they lost 2–0, then played as a substitute in the next match against Romania for Armando Sadiku which scored the goal for the historical 1–0 Albania's win. Albania finished the group in the third position with three points and with a goal difference –2, and was ranked last in the third-placed teams, which eventually eliminated them.
In the 2018 FIFA World Cup qualification opening match against Macedonia on 5 September 2016, Balaj came in as a 60th substitute replacing the Midfielder Amir Abrashi to play in the attack line forming a duo partnership among Armando Sadiku. In the 75th minute the match was interrupted at score 1–1 due to the weather conditions and the remained 15 minutes were played in the next day. In the penultimate minute Balaj scored a goal to give Albania's the 2–1 victory.As of 10 August 2017
As of 28 March 2017
As of 18 November 2009
. Albania U19 score listed first, score column indicates score after each Balaj's goal.
As of 6 June 2012
. Albania U21 score listed first, score column indicates score after each Balaj's goal.
As of 28 March 2017
. Albania score listed first, score column indicates score after each Balaj's goal.
Albanian Cup: 2007–08; Runner-up: 2009–10
Albanian Superliga Runner-up: 2008–09
Albanian Cup: 2010–11, 2011–12
Albanian Supercup: 2011
Czech First League Runner-up: 2012–13
Croatian First Football League Runner-up: 2014–15, 2015–16
Albanian Superliga Young talent of the Season: 2011–12