| 1st | 2nd | 3rd | 4th | Tot | |
| SF | 13 | 12 | 10 | 6 | 41 |
| ARI | 7 | 3 | 0 | 12 | 22 |
Chances are the San Francisco 49ers would have been able to come out of Arizona on Sunday with their seventh win of the season without any extra help from the Cardinals, but they got a bunch of it anyway, and it certainly made their latest victory quite a bit easier.
The 49ers jumped out on the Cardinals early and never looked back on Sunday, cruising to a 41-22 win at State Farm Stadium in Glendale. The Cardinals committed 17 penalties in the game, an all-time record for a franchise that dates back over 100 years. 130 penalty yards came as a result of those infractions, some of which either took points off the board for the Cardinals or helped put points on the board for the 49ers. The Cardinals also chipped in three turnovers along the way to help the 49ers' cause.
The 49ers got a solid effort from quarterback Brock Purdy, who was playing in his third game of the season after missing much of the year with turf toe. Purdy finished with 200 yards and three touchdowns with zero interceptions on 19-of-26 passing before being relieved by Mac Jones late in the blowout victory.
Cardinals quarterback Jacoby Brissett completed 47 passes on 57 attempts for 452 yards, two touchdowns and two interceptions in the loss.
49ers ride fast start to halftime lead
Things couldn't have gotten off to a much better start for the 49ers, due in large part to return specialist Skyy Moore. Moore had come close to breaking a big return on multiple occasions in recent weeks, and he finally did it to start Sunday's game, returning the opening kickoff 98 yards to the Cardinals' 1-yard line. Running back Christian McCaffrey ran into the end zone from there to give the 49ers a 7-0 lead less than 30 seconds into the game.
Skyy Moore takes the opening kickoff all the way down to the ONE!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXnxV pic.twitter.com/lEVqfZCRQ3
— NFL (@NFL) November 16, 2025
The Cardinals were forced to punt after five plays on the ensuing possession, which led to the 49ers taking over at their own 30. The 49ers opened the possession facing a 3rd-and-8, but Purdy quickly reversed field position with a 25-yard completion to wide receiver Jauan Jennings and a 13-yard completion to wide receiver Demarcus Robinson. After that, Purdy found tight end George Kittle from 30 yards out for the second touchdown of the game. The point-after attempt by kicker Eddy Pineiro was blocked, leaving the score at 13-0 with just over five minutes off the clock in the first quarter.
PURDY. KITTLE. TD!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXVnt pic.twitter.com/NYJ4D5djcV
— NFL (@NFL) November 16, 2025
The Cardinals were able to respond this time with a nine-play, 72-yard drive that cut the score to 13-7 with a touchdown run from running back Bam Knight. A 34-yard completion to wide receiver Michael Wilson on the third play of the drive kept the Cardinals from a three-and-out, then they rode a series of short gains inside the 10-yard line before Knight finished things off from six yards out.
Bam Knight finds the end zone to get the @AZCardinals on the board!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXnxV pic.twitter.com/4vRRfZWl2S
— NFL (@NFL) November 16, 2025
The 49ers answered the touchdown with a three-and-out, then a 40-yard return by Greg Dortch set the Cardinals up in 49ers territory at the 44-yard line. Momentum seemed to be swinging hard in the Cardinals' favor after the return, but the 49ers held the 49ers to a 59-yard field goal attempt by kicker Chad Ryland, which missed wide left. The 49ers took over at their own 41-yard line and quickly moved deep into Cardinals territory with an 11-yard catch by Jennings and a 14-yard run from McCaffrey, then a 10-yard completion to Kittle and a short run by McCaffrey moved the ball to the 14. After a 5-yard penalty for defensive holding, Purdy connected with McCaffrey from nine yards out for each player's second touchdown of the day and a 19-7 lead. But the kicking issues continued on the PAT as Pineiro missed wide right for his second miss of the game and his fourth missed PAT of the season.
CMC all alone for his 2nd TD!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXVnt pic.twitter.com/iNXiaSARQG
— NFL (@NFL) November 16, 2025
A defensive blunder from the 49ers gave the Cardinals a boost on the next possession, and it helped lead to an uneven drive that ended in a field goal. After holding the Cardinals to what would have been a fourth down near midfield, cornerback Renardo Green got flagged for a personal foul after getting tangled up after the play with tight end Trey McBride. Brissett then hit McBride for a 28-yard gain to the 10, but the ball was moved back to the 25 after McBride was flagged for unsportsmanlike conduct after making a gesture where he swiped his fingers across his face mask. Dortch made up for the penalty with a 16-yard catch to the 8, but the Cardinals moved backwards again after a holding call on McBride. McBride corrected his error on the next play with a 12-yard catch down to the 5, but the 49ers moved the Cardinals back again with a 4-yard tackle-for-loss on Brissett by linebacker Dee Winters. Eventually the Cardinals had to settle for a 26-yard field goal from Ryland, which made the score 19-10 with 6:29 left in the half.
The 49ers got another strong kick return after the field goal, this one from Brian Robinson Jr., who broke off a 42-yard return to give the 49ers the ball at their own 47. But they were held to a three-and-out from there and punted back to the Cardinals, who took over at their own 8-yard line. The 49ers then forced a three-and-out with the help of a holding penalty and got the ball back at their own 39 after a Cardinals punt.
The 49ers began possession with 2:50 remaining in the half and opened with a 12-yard run by McCaffrey to the Cardinals' 49. An encroachment penalty by the Cardinals moved the ball to the 44 and brought the clock to the two-minute warning, but the 49ers couldn't move past the 30 and settled for a 48-yard field goal from Piniero to open up a 22-10 lead with 1:01 remaining.
There would be one more chance for the 49ers, who got the ball back with 19 seconds remaining after an interception by safety Malik Mustapha at their own 33. The 49ers got a 12-yard catch from Kittle, a five-yard illegal contact penalty on cornerback Denzel Burke, and a six-yard catch from Jennings to move the ball to the Cardinals' 44-yard line with one second remaining, then they set up a career-long 62-yard field goal attempt for Pineiro. The kick was blocked by defensive lineman Calais Campbell, but Campbell was flagged for a 15-yard penalty for colliding with a defenseless player (in this case, long snapper Jon Weeks). The penalty moved Pineiro's attempt up to a 47-yarder, which he hit to give the 49ers a 25-10 halftime lead.
The Cardinals outgained the 49ers 204 to 167 in the first half, with 178 of those coming in the air. But the glaring stat difference at the break came in the penalties category, where the Cardinals had a whopping 11 first-half infractions for 81 yards compared to just a single 15-yard penalty for the 49ers.
More errors lead to more 49ers points in the second half
It was a fitting start to the third quarter for the Cardinals considering how things went in the first half. Things opened up with a deep incompletion and an illegal shift penalty, then the Cardinals faced a 4th-and-inches from their own 40. Dortch took the fourth down handoff and ran it all the way into the end zone, but the play was negated by a holding penalty on tight end Pharaoh Brown. The penalty forced a punt to the 49ers, who took over at their own 32-yard line and turned in a nine-play, 39-yard drive that led to a 47-yard field goal from Pineiro and a 28-10 lead.
Even when things started going right for the Cardinals, they eventually went wrong, as demonstrated by the next drive. The Cardinals opened their next possession with a holding penalty, but they overcame it with a 25-yard completion to Michael Wilson. Another completion to Wilson, this one for 34 yards, moved the ball to the 49ers' 22-yard line. But after taking a five-yard penalty for an illegal shift, the Cardinals committed their second turnover of the game when Brissett was picked off by cornerback Deommodore Lenoir at the 22. Lenoir put on a show during his return, dodging tacklers while returning the ball 64 yards to the Arizona 14-yard line.
Deommodore Lenoir with the pick and a LONG return for the @49ers!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXnxV pic.twitter.com/3GXbGLIK9y
— NFL (@NFL) November 16, 2025
The 49ers cashed in on the turnover with the second touchdown catch of the day for Kittle, which opened up a 35-10 lead. A run from Robinson and a six-yard catch from Kittle moved the ball to the 4-yard line, then Purdy connected with Kittle again on a 3rd-and-Goal to finish the drive.
George Kittle with his 2nd TD of the day and 50th of his career!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXVnt pic.twitter.com/VZY3AiSQKH
— NFL (@NFL) November 16, 2025
The next drive proved once again that the Cardinals were not allowed to have nice things on this particular day. The Cardinals began at their own 30 and moved inside the 49ers' 10-yard line in seven plays, where they moved backward due to a holding penalty. They eventually faced a 3rd-and-Goal at the 8, but after a completion to tight end E Higgins, the 49ers got the ball back when defensive end Keion White recovered a fumble that was caused when cornerback Upton Stout jarred the ball loose at the 1.
The @49ers force the fumble at the goal line!
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXnxV pic.twitter.com/R8j0O5XVuI
— NFL (@NFL) November 16, 2025
The 49ers were held to a three-and-out on the next possession, then the Cardinals finally found the end zone with a 10-play, 65-yard drive that ended in a 10-yard touchdown to McBride. A two-point conversion attempt after the touchdown fell short, leaving the score at 35-16 with 8:28 remaining.
Trey McBride hauls in the TD
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXVnt pic.twitter.com/SVOrcBxc0n
— NFL (@NFL) November 16, 2025
An onside kick attempt followed the touchdown, which was recovered by fullback Kyle Juszczyk to give the 49ers the ball at the Cardinals' 45-yard line. The 49ers slammed the door shut after that with a seven-play drive that ended in the third touchdown of the day for McCaffrey, this one on a four-yard run. After making a leaping catch on a 3rd-and-15 to give the 49ers a first down at the 24, McCaffrey ran up the middle for a 20-yard gain to the 4. McCaffrey ran into the end zone on the next play, then a two-point conversion attempt fell short, leaving the score at 41-16 with less than five minutes remaining.
CMC TD x3
SFvsAZ on FOX/FOX Onehttps://t.co/HkKw7uXVnt pic.twitter.com/g1dGp4VVi2
— NFL (@NFL) November 16, 2025
The Cardinals added one more touchdown on a 17-yard pass to Dortch, then the 49ers recovered another onside kick and ran out the clock. The 49ers moved to 7-4 on the season with the win, while the Cardinals fell to 3-7 with the loss.
Game Notes
The 49ers now lead their series over the Cardinals 38-31 and have won six of the last eight games in the series. The 49ers were 3.5-point favorites coming into the game... Wide receiver Ricky Pearsall returned from a knee injury for the 49ers and saw his first action since September 28... Multiple 49ers got banged up during the game, including linebacker Tatum Bethune (ankle) and Pineiro (hamstring), whose absence led to the 49ers going for two points up 41-16... Notable injuries for the Cardinals coming into the game included quarterback Kyler Murray (foot), wide receiver Marvin Harrison Jr. (appendectomy), and wide receiver Zay Jones (torn Achilles)... The 49ers return to Levi's Stadium next week for a home matchup against the Carolina Panthers, the first of three scheduled prime time games over the next five weeks. The game will kick off at 8:15 p.m. ET/5:15 p.m. PT on Monday night (ESPN).
Scoring Summary
- Q1 14:47 — SF 7, ARI 0
C. McCaffrey 1 yd. run (E. Pineiro kick) (1 plays, 1 yds, 0:16) - Q1 09:57 — SF 13, ARI 0
G. Kittle 30 yd. pass from B. Purdy (kick blocked) (5 plays, 70 yds, 2:08) - Q1 05:03 — SF 13, ARI 7
Z. Knight 6 yd. run (C. Ryland kick) (9 plays, 72 yds, 4:53) - Q2 13:44 — SF 19, ARI 7
C. McCaffrey 9 yd. pass from B. Purdy (kick failed, wr) (5 plays, 52 yds, 2:16) - Q2 06:34 — SF 19, ARI 10
C. Ryland 26 yd. Field Goal (12 plays, 63 yds, 7:10) - Q2 01:06 — SF 22, ARI 10
E. Pineiro 48 yd. Field Goal (6 plays, 31 yds, 1:49) - Q2 00:00 — SF 25, ARI 10
E. Pineiro 47 yd. Field Goal (3 plays, 38 yds, 0:19) - Q3 07:32 — SF 28, ARI 10
E. Pineiro 47 yd. Field Goal (9 plays, 39 yds, 5:05) - Q3 02:37 — SF 35, ARI 10
G. Kittle 4 yd. pass from B. Purdy (E. Pineiro kick) (5 plays, 14 yds, 1:50) - Q4 08:32 — SF 35, ARI 16
T. McBride 10 yd. pass from J. Brissett (run failed) (10 plays, 65 yds, 3:17) - Q4 04:49 — SF 41, ARI 16
C. McCaffrey 4 yd. run (pass failed) (7 plays, 45 yds, 3:44) - Q4 02:48 — SF 41, ARI 22
G. Dortch 17 yd. pass from J. Brissett (pass failed) (8 plays, 65 yds, 2:01)
Game and Player Stats
| SF | Team Stats | ARI |
| 186 | Passing Yards | 452 |
| 95 | Rushing Yards | 36 |
| 281 | Total Yards | 488 |
| 7.69 | Avg Yards per Pass | 7.93 |
| 3.8 | Avg Yards per Run | 2.57 |
| 0 | Fumbles Lost | 1 |
| 0 | Int Thrown | 2 |
| 1 | Sacks Allowed | 0 |
| 00:25:45 | Time of Pos | 00:34:15 |
| 1 | Penalties | 17 |
| 49ers Player Stats | ||||
| Passing | Cmp/Att | Yds | TDs | INTs |
| Brock Purdy | 19/26 | 200 | 3 | 0 |
| Rushing | Att | Yds | Avg | TDs |
| Christian McCaffrey | 13 | 81 | 6.2 | 2 |
| Brian Robinson | 8 | 24 | 3 | 0 |
| Mac Jones | 3 | -3 | -1 | 0 |
| Brock Purdy | 1 | -7 | -7 | 0 |
| Receiving | Rec | Tgt | Yds | TDs |
| George Kittle | 6 | 6 | 67 | 2 |
| Jauan Jennings | 4 | 6 | 54 | 0 |
| Christian McCaffrey | 5 | 6 | 40 | 1 |
| Kyle Juszczyk | 2 | 2 | 26 | 0 |
| Demarcus Robinson | 1 | 2 | 13 | 0 |
| Brian Robinson | 0 | 1 | 0 | 0 |
| Ricky Pearsall | 1 | 3 | 0 | 0 |
| Kicking | FG | Att | Lg | XP |
| Eddy Pineiro | 3 | 3 | 48 | 2 |
| Punting | No | Avg | I20 | Lg |
| Thomas Morstead | 3 | 29.3 | 1 | 55 |
| Punt Returns | Att | Avg | TDs | Lg |
| Skyy Moore | 1 | 9 | 0 | 9 |
| Defense | T-A | Sck | INTs | FF |
| Upton Stout | 7-5 | 0 | 0 | 1 |
| Ji'Ayir Brown | 7-4 | 0 | 0 | 0 |
| Deommodore Lenoir | 7-3 | 0 | 1 | 0 |
| Renardo Green | 6-2 | 0 | 0 | 0 |
| Nick Martin | 6-2 | 0 | 0 | 0 |
| Jason Pinnock | 5-2 | 0 | 0 | 0 |
| Malik Mustapha | 4-3 | 0 | 1 | 0 |
| CJ West | 4-2 | 0 | 0 | 0 |
| Tatum Bethune | 3-3 | 0 | 0 | 0 |
| Sam Okuayinonu | 2-1 | 0 | 0 | 0 |
| Kalia Davis | 2-1 | 0 | 0 | 0 |
| Darrell Luter | 2-1 | 0 | 0 | 0 |
| Curtis Robinson | 11-6 | 0 | 0 | 0 |
| Dee Winters | 10-5 | 0 | 0 | 0 |
| Luke Gifford | 1-1 | 0 | 0 | 0 |
| Bryce Huff | 1-1 | 0 | 0 | 0 |
| Jordan Elliott | 1-1 | 0 | 0 | 0 |
| Chase Lucas | 1-1 | 0 | 0 | 0 |
| Keion White | 1-1 | 0 | 0 | 0 |
| Marques Sigle | 1-1 | 0 | 0 | 0 |
| Cardinals Player Stats | ||||
| Passing | Cmp/Att | Yds | TDs | INTs |
| Jacoby Brissett | 47/57 | 452 | 2 | 2 |
| Rushing | Att | Yds | Avg | TDs |
| Bam Knight | 5 | 24 | 4.8 | 1 |
| Emari Demercado | 5 | 8 | 1.6 | 0 |
| Michael Carter | 2 | 6 | 3 | 0 |
| Jacoby Brissett | 2 | -2 | -1 | 0 |
| Receiving | Rec | Tgt | Yds | TDs |
| Michael Wilson | 15 | 18 | 185 | 0 |
| Trey McBride | 10 | 11 | 115 | 1 |
| Greg Dortch | 6 | 6 | 66 | 1 |
| Michael Carter | 5 | 7 | 22 | 0 |
| Bam Knight | 4 | 4 | 21 | 0 |
| Xavier Weaver | 2 | 3 | 15 | 0 |
| Emari Demercado | 2 | 3 | 12 | 0 |
| Elijah Higgins | 2 | 3 | 11 | 0 |
| Andre Baccellia | 1 | 1 | 5 | 0 |
| Fumbles | Fum | Lost | ||
| Elijah Higgins | 1 | 1 | 0 | 0 |
| Kicking | FG | Att | Lg | XP |
| Chad Ryland | 1 | 2 | 26 | 1 |
| Punting | No | Avg | I20 | Lg |
| Pat O'Donnell | 3 | 37.7 | 0 | 46 |
| Punt Returns | Att | Avg | TDs | Lg |
| Greg Dortch | 2 | 25.5 | 0 | 40 |
| Defense | T-A | Sck | INTs | FF |
| Budda Baker | 8-5 | 0 | 0 | 0 |
| Darius Robinson | 5-4 | 0 | 0 | 0 |
| Jalen Thompson | 5-3 | 0 | 0 | 0 |
| Akeem Davis-Gaither | 4-3 | 0 | 0 | 0 |
| Max Melton | 4-2 | 0 | 0 | 0 |
| Garrett Williams | 3-2 | 0 | 0 | 0 |
| PJ Mustipher | 3-1 | 0 | 0 | 0 |
| Denzel Burke | 2-1 | 0 | 0 | 0 |
| Walter Nolen | 2-0 | 0 | 0 | 0 |
| Cody Simon | 12-8 | 0 | 0 | 0 |
| Calais Campbell | 1-1 | 0 | 0 | 0 |
| Dalvin Tomlinson | 1-1 | 0 | 0 | 0 |
| Zaven Collins | 1-0 | 0 | 0 | 0 |
| Dante Stills | 1-0 | 0 | 0 | 0 |
| Josh Sweat | 1-0 | 1 | 0 | 0 |