Born in Lisbon, Santos played youth football with three clubs, including Casa Pia A.C. from ages 13–19. He spent his first seasons as a senior in the lower leagues, scoring a career-best 17 goals in the 2009–10 season to help the team promote to the third division. Subsequently, Santos moved to the professionals after signing with Leixões S.C. from the Liga de Honra. In his second year at the Estádio do Mar, he started in 23 of his 27 appearances and the side finished in 11th position. In the summer of 2012, Santos joined Vitória de Setúbal, making his debut in the Primeira Liga on 19 August of that year by coming as a 68th-minute substitute in a 2–2 away draw against C.D. Nacional, where he won a penalty and was also booked. His first goal in the league arrived on 4 November, when he played 79 minutes and helped the hosts defeat Sporting CP 2–1.
Braga
Santos moved to S.C. Braga also in the top level in June 2013. Before the end of the transfer window he was loaned to Romanian club FC Astra Giurgiu, and scored to cap a 4–0 win at FC Oţelul Galaţi on his 15 September debut after coming on at half time for Gabriel Enache. Having made just three more appearances in all competitions, his loan was terminated in December. On 8 January 2014, Santos was loaned again to Rio Ave F.C. in Braga's league until the end of the season alongside teammate Stanislav Kritsyuk. He played 22 total games for the team from Vila do Conde, and scored once to conclude a 3–1 away defeat of S.C. Covilhã on 26 January to qualify for the semi-finals of the Taça da Liga; he started the final defeat to S.L. Benfica and the loss to the same opponent in the Taça de Portugal decider too. After returning to his parent club, Santos helped to consecutive fourth-place finishes and scored a combined 12 goals in the process. On 22 May 2016, he replaced Josué for the last minutes of regulation time in the national cup final, and converted his penalty shootout attempt in a 4–2 victory at the Estádio Nacional.
Columbus Crew
On 7 August 2017, the 29-year-old Santos signed for Major LeagueSoccer club Columbus Crew SC as a designated player. He made his debut 12 days later, playing 28 minutes in a 1–1 away draw against Orlando City SC. Santos scored his first goal for the team from Ohio on 24 March 2018, concluding their 3–1 home win over D.C. United. It was his only of the season, in which he was sent off on 5 May in a goalless draw at Seattle Sounders FC for a kick to Alex Roldan's face. In 2019, Santos recorded his best professional figures of 11 goals from 33 games, though the Crew missed the playoffs. On 28 July, he scored twice in a 3–2 victory at the New York Red Bulls.