Freeman passed for over 7,000 yards at Grandview High School where he was a four-star rated prospect by both Rivals.com and Scout.com. As a sophomore, he threw for 1,946 yards and 24 passing touchdowns, leading Grandview to a 9–3 record and a spot in the quarterfinals of the Class 4 playoffs. In addition, he set 10 school records during his career at Grandview, including career passing yards (7,175), passing touchdowns (78), attempts (809), completions (385), yards passing in a game (404) and touchdowns in a game (6). As a junior, he topped 2,400 yards through the air with 23 touchdowns. As a senior, he was the #4 pro-style rated quarterback in the country by Rivals.com as well as being ranked as the #92 overall prospect in the nation by Rivals and the top player in the state of Missouri. He was the #9 quarterback nationally. He led Grandview to a 7–4 record, a district title and a berth in the sectional round of the Missouri state playoffs. He also completed 151-of-286 passes (53%) for 2,622 yards and 33 touchdowns in 2005. He also earned first team Class 4 all-state honors from the Missouri Sportswriters and Sportscasters Association. Freeman was selected to the Kansas City Star All-Metro team and was the 2005 Thomas A. Simone Award winner as the top player in the Kansas City metro area.
Despite being a highly recruited quarterback prospect, one major program wanted the 6' 5" 225 lb Freeman as a tight end, which his African-American father saw as a racial slight. Freeman said he "didn't see it the same way" at the time, as the school already had a QB recruit from his class. Nevertheless, Freeman was not interested, as his longtime goal was to become an NFL quarterback. He originally committed to Nebraska to play for former head coach Bill Callahan, but Kansas State head coach Ron Prince, convinced Freeman to enroll there instead.
As a freshman in 2006, Freeman appeared in 11 of 13 games that season, including starts in the final eight contests of 2006. He took over at quarterback during the second half at Baylor and directed the Kansas State offense the rest of the season. He passed for a Kansas State freshman record 1,780 yards on 140-of-270 passing (52%). He became the first true freshman to start a game at Kansas State since 1976. Additionally, he had consecutive 250+ yard passing games against Colorado and Texas, marking the first time a Kansas State quarterback had done so since Michael Bishop in 1998. He attempted a Kansas State freshman-record 47 passes against Nebraska, completing 23 for 272 yards. He earned his first career start against Oklahoma State and led the Wildcats to a comeback win. He finished the game 10-for-15 passing for 177 yards and ran for a game-winning 21-yard touchdown with 1:11 to go in the game. In 2007, he set new single-season school records for pass attempts, completions and yards after throwing for 3,353 yards and 18 touchdowns on 316-of-499 passing. In 2008, Freeman was 224 of 382 passing for 2,945 yards and 20 touchdowns and eight interceptions this season for a passer rating of 132.9. The 14 rushing touchdowns were the fourth-most in a single season by a Wildcat quarterback.
In his three year collegiate career, Freeman completed 680 passes for 8,078 yards and 44 touchdowns and 34 interceptions in 35 career games. He accumulated a school-record 8,427 total yards and joined Ell Roberson as the only quarterbacks in Kansas State history to score at least 60 touchdowns.
Earned three national player-of-the-week honors after a win over Texas in 2006, including Cingular All-America Player of the Week, the Walter Camp Foundation Offensive Player of the Week and the Master Coaches Survey Player of the Week.
On November 8, 2009, Freeman started his first professional game at home against the Green Bay Packers. The Buccaneers won, ending an 11-game losing streak. He completed 14 out of 31 passes for 205 yards, 3 passing touchdowns, and 1 INT, including a fourth down touchdown pass to rookie Sammie Stroughter to take the lead, 31–28 late in the game. Freeman became the youngest quarterback in Bucs history to start and win his first game. On December 27, 2009 he led his Buccaneers to a 20–17 overtime win over the 13–1 New Orleans Saints preventing them from clinching the 1st seed in the playoffs for 1 more week.
Josh Freeman began the 2010 season as the starting quarterback. He started all 16 games of the season, the first Buccaneer quarterback to do so since Brad Johnson in 2003. On December 26, 2010, Freeman completed 21 of 26 pass attempts for 227 yards and 5 touchdowns against the Seattle Seahawks, matching a franchise record for touchdowns in a game. On January 1, 2011 Freeman completed 21 of 26 pass attempts for 255 yards and 2 touchdowns against the playoff-bound New Orleans Saints. Both performances won him the FedEx Air Player of the Week. He was awarded NFC Player Of The Week on Week 5 and 17. He led the team to a winning record of 10–6, barely missing the playoffs. He was also named as an alternate for the 2011 Pro Bowl.
Freeman participated in 15 out of the 16 games in the 2011-2012 season. However, this season would prove to be very disappointing for him compared to the 2010-2011 season. He only threw 16 touchdowns with 22 interceptions, and a 74.6 quarterback rating. The Bucs finished 4-12, losing the final 10 games of the season.
After the 2011 season, head coach Raheem Morris was fired and replaced by former Rutgers head coach Greg Schiano. The Bucs also added new weapons for Freeman, signing former Indianapolis Colts tight end Dallas Clark, Pro Bowl wide receiver Vincent Jackson, and upgrading the offensive line with All-Pro left guard Carl Nicks. Freeman steadily improved, throwing 11 more touchdowns, 5 fewer interceptions, and 500 more passing yards compared to the 2011-2012 season.
The Buccaneers started the 2013 season with a surprising 18-17 loss to the New York Jets after leading 14-5 at the half. Freeman completed 15 of 31 passes (48.4%) and threw for 1 touchdown and 1 interception. After a poor performance in a week 3 loss to the New England Patriots, Freeman was benched in favor of rookie quarterback Mike Glennon. The Buccaneers began the season with a disappointing 0-3 record, and Freeman was completing 46% of his passes with a near league bottom 59.3 rating (30th). Trouble was already brewing coming into this season. Freeman missed the team photo and his teammates didn't select him as a team captain for the first time since his rookie campaign. He was released by the team on October 3, 2013 after the team tried unsuccessfully to trade him.
On October 6, 2013, Freeman signed with the Minnesota Vikings. He would begin to compete for the starting job with incumbent Christian Ponder and Matt Cassel. He changed his number to 12 after swapping with punter Jeff Locke, as Freeman had worn the number in high school. On October 16, 2013, he had been named starting quarterback for the week 7 game against the New York Giants and for all future games. However, his start for the Vikings did not go very well; Freeman completed only 20 of 53 passes and threw for only 190 yards and an interception. The Vikings ended up losing to the Giants 7-23, their only score being a punt return by Marcus Sherels. He was originally planned to start against the Green Bay Packers. However, he was having concussion-like symptoms during and following the game against the Giants and was therefore benched in favor of Ponder. Freeman would finish the rest of the season as the third-string quarterback behind Ponder and Cassel.
On April 16, 2014, Freeman was rumored to have signed a one-year deal with the New York Giants. The deal was not officially signed until April 21, 2014, when Freeman attended the Quest Diagnostics Training Center to sign the contract and participate. On May 30, 2014, Freeman was released by the Giants.
On April 2, 2015, Freeman signed a one-year deal with the Miami Dolphins On July 24, 2015, Freeman was released, but re-signed with the team four days later. He was released by the Dolphins on September 4, 2015.
On December 29, 2015, Freeman signed with the Indianapolis Colts. He started the final game of the season against the Tennessee Titans on January 3, 2016. Freeman split time with fellow recent signee Ryan Lindley and went 15/28 for 149 yards, 1 touchdown and one interception, as well as 8 rushes for 28 yards.