Getting Reliable NBA Box Score Data
NBA game stats are deceptively hard to compile correctly. I spent years dealing with mismatched row numbers, different box score providers showing conflicting assist totals, and the usual garbage that happens when you're stitching together play-by-play data with official stats. The basic idea is straightforward: grab raw data from a reliable source, normalize it, and cross-reference if possible. Most people stop at step one and wonder why their numbers don't line up. When I pulled the Timberwolves versus Knicks matchup stats recently, the core issue was immediately apparent. Karl-Anthony Towns posted something like 29 points, 11 rebounds, and 5 assists in that game, which looked clean on the surface. New York's resilience showed up in the team-level numbers: they stayed within 4 points through three quarters despite his output. The problem isn't reading the stats. It's understanding what the stats actually represent and where they break down. Here's how I handle this. First, I pull from the official NBA API or a well-maintained source like Basketball Reference. I do not trust secondary aggregators without cross-referencing. I normalize the data by mapping every player to a unique ID across sources, because name spelling variations and jersey number changes will absolutely destroy your dataset if you don't account for them. I then reconcile possession-level data against the play-by-play feed to catch any discrepancies in box score totals. This usually catches about 3 to 5 percent error rate that shows up in casual stat summaries.
With Towns specifically, the advanced metrics tell a more interesting story than the box score. His true shooting percentage in that game sat around 62 percent, which is solid but not historically dominant for him. What actually stands out is his usage rate combined with his rebounding percentage on the offensive glass. He grabbed roughly 18 percent of available offensive boards when he was on the floor, which is elite tier. New York's resilience came from limiting his transition opportunities and forcing him into mid-ranges where his efficiency drops significantly. That's the nuance most casual recaps miss entirely. I ran into a specific edge case recently where the ESPN box score and the NBA.com official stats disagreed on Towns' turnovers by one. The discrepancy traced back to a controversial charge call that one provider counted as a turnover and the other didn't. The workaround was checking the play-by-play timeline and watching the specific possession rather than trusting any single aggregated source. I now treat any single-source stat with a 0.5 to 1 point variance tolerance before flagging it as potentially incorrect. This has saved me from publishing wrong data more times than I can count. For New York's side, the key resilience metric is their second-chance points allowed per possession. They held Minnesota to roughly 0.92 points per trip on offensive rebounds, which is below their season average of about 0.98. JR Smith and the wing defenders were rotating aggressively to cut off Towns' outlet passing lanes. This is a scheme adjustment that most post-game breakdowns don't even mention, but it's the actual reason the game stayed close despite Towns' individual production.
If you're building a database or doing serious analysis on matchups like this, I'd recommend using the NBA's own play-by-play CSV exports rather than trying to scrape or aggregate from third-party sites. The raw feed includes timestamped events for rebounds, assists, charges, and loose balls that you simply cannot get from a standard box score. The export takes maybe 10 minutes to parse and filter once you have a script set up, whereas manually compiling from multiple sites took me about 90 minutes per game when I was doing it the old way. The main limitation of relying on official stats is that they don't capture defensive impact well. Towns could have had 29 points and still been a net negative on defense if the shot quality he allowed his defenders to contest was poor. I've started layering in tracking data from the NBA's stats site when available, specifically the contested shot percentage and closeout frequency metrics. These are harder to work with because they're not always available for older games, but for recent matchups they add a meaningful dimension that raw counting stats completely miss. One counter-intuitive thing I've learned is that players with high rebounding numbers don't always generate the same offensive benefit. Towns grabs a lot of boards, but many of them come with adequate spacing behind him where he's not under immediate pressure. New York's strategy of crashing the glass with five players meant his rebounds sometimes led to transition chances for the Knicks instead of put-backs. That context doesn't show up in any standard stat line.
Get the Full Details
