Contextflo Blog

How Many Rows Can Claude Handle in a CSV?

No fixed row limit. The real caps are the ~30MB file size and where answer quality slips as Claude reads instead of queries. Where the line is, and how to test.

July 16, 20265 min readVivek Sah

There's no fixed row limit. The real caps are file size (about 30MB per file in Claude chat, as of writing) and how much of the file fits usefully in context. In my experience, answers stay reliable up to roughly 10,000–20,000 rows. Past that, Claude is reading a wall of text and starting to approximate, and you feel it.

Let me unpack that, because “it depends” is a real answer here and the details matter.

The hard limit is file size, not rows

Claude chat caps uploads at around 30MB per file, and about 20 files per conversation. Projects are the same 30MB per file. So the first wall you hit isn't a row count, it's megabytes.

A CSV's size depends on how wide it is. Two columns of short numbers stay tiny for a long time. Forty columns with long text fields, URLs, and timestamps get heavy fast. So “how many rows” and “how many MB” aren't the same question. A 5-column file might hold a million rows under 30MB. A 50-column file might blow past it at 100k.

If you only care about the ceiling: stay under 30MB and the upload goes through.

But the upload going through isn't the same as getting a good answer.

The softer limit is where answers get fuzzy

Here's the part people miss. When you upload a CSV to a chat, Claude isn't running SQL on it. It's reading the file as text, into its context, and reasoning over what it read.

That works great when the file is small. Ask for a total, a filter, a “which region had the most orders,” and on a few thousand rows it'll nail it.

Push the row count up and two things happen. The file eats more of the context window, crowding out room to actually think. And exact aggregates over tens of thousands of rows become the kind of thing a language model estimates rather than computes. You ask for a sum across 40,000 rows and you get a number that's close. Close is fine for a gut check. Close is not fine for a board deck.

My rough rule: under ~10k rows, trust it. 10k–20k, spot-check the important numbers. Past that, don't ask it to add things up for you, ask it to describe or sample instead.

That range isn't an official Anthropic figure. It's a practical line from watching answers degrade, and it shifts with how wide your columns are. Test it on your own files.

The Files API raises the ceiling

If you're building on the API rather than uploading in chat, the numbers change. The Files API takes files up to 500MB each, with a big pool of org storage behind it. That's a much higher roof.

But a higher roof doesn't fix the reasoning problem. A 400MB CSV referenced through the Files API still has to be processed, and the model still isn't a database. Bigger files in, same question about whether the answer is exact or approximate. The API buys you room. It doesn't buy you a SQL engine.

Test it yourself

Before you trust Claude on a big CSV, spend two minutes checking it:

  • Upload the file. If it rejects, you're over the size cap. Split it or trim columns you don't need.
  • Ask for one thing you already know the answer to. A total, a row count, a specific lookup. If it's wrong, you've found your ceiling.
  • Ask the same aggregate two ways (“total revenue” and “sum the revenue column”). If the two numbers don't match, the model is approximating.
  • Do a COUNT-style check. Ask how many rows have some condition, then eyeball a filtered slice. Off? Trust it less.

If it passes all four on your file, upload away. Plenty of files are small enough that this just works.

So when is chat upload actually fine?

Most of the time, honestly. One medium file, a question or two, a number you'll sanity-check anyway. Drop it in the chat. It's free and it's faster than setting anything up. I do this constantly.

The chat upload starts to hurt in three situations:

  • Your files are consistently bigger than a chat handles well, so you're always splitting or trimming.
  • You need the answer to be exact, not approximately-right, because someone's making a decision on it.
  • You want the same file queried by your whole team, not trapped in one person's chat. (More on that in does Claude remember your CSV. Short version, it doesn't.)

When you want SQL instead of a good guess

When exactness matters, the fix is to stop making the model read the file and give it a real engine to query.

That's the bet we made with Contextflo. You upload the CSV, it lands in storage only your org can touch, and at query time we load it into DuckDB. Claude writes real SQL against it through MCP. So “revenue by region” is an actual GROUP BY over every row, not the model skimming a text dump and estimating. It's right because a database computed it, and it's right on 2 million rows the same as on 200.

The other thing you get: the file sits next to your warehouse data instead of alone in a chat. Ask one question that spans both and Claude queries each, then combines them.

That's the real split. Small file, one-off, a number you'll double-check anyway: chat upload is genuinely fine, use it. Big files, exact answers, a whole team asking, data that needs to sit next to your warehouse: that's when reading-the-file stops cutting it and you want SQL.

FAQ

What's the maximum file size Claude accepts?

Around 30MB per file in Claude chat and Projects, with roughly 20 files per conversation, as of writing. The Files API (for developers) goes up to 500MB per file. Check Anthropic's current limits before you rely on an exact figure.

How many rows is too many for Claude?

There's no official number. Uploads succeed up to the 30MB size cap, but answer quality tends to slip somewhere past 10,000–20,000 rows because Claude is reading the file, not querying it. Wide files with many columns hit the wall sooner.

Why does Claude get numbers slightly wrong on big CSVs?

Because in a chat upload it's reasoning over the file as text, not running SQL. On small files that's accurate. On large ones, exact sums and counts turn into estimates. Ask the same aggregate two ways and compare, if the answers differ, it's approximating.

How do I query a CSV that's too big for Claude?

Split it, trim columns you don't need, or move it behind a real query engine. Contextflo uploads the CSV and queries it with DuckDB, so Claude runs actual SQL over every row instead of guessing over a text dump.

Free for one user and one data source. Upload a CSV and ask a question.

Related reading