CSV statistics
A four-row sales file shows at a glance that one of its four sales cells is empty and that the rest run from 80 to 200. Paste any CSV to see, column by column, how many values, blanks and distinct entries it holds. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- CSV data
- pais,ventas ES,120 MX,80 AR,200 CL,
- Rows
- 4
- Columns
- 2
Before you clean, filter or load a dataset, you need to know what is actually in it — which columns are riddled with nulls, which numeric field has an outlier ten times the median, which supposedly categorical column has 400 distinct values instead of five.
Look at the data before you build on it
Before you clean, filter or load a dataset, you need to know what is actually in it: which columns are riddled with empty cells, which number has an outlier far above the rest, which column that should hold a handful of categories holds hundreds of different values. Almost everyone who works with data has learned this the hard way: you load a file, build something on top of it, and only later discover that a key column was 30% empty or that an amount column had negatives nobody expected.
A habit with a long history
Exploratory data analysis as a formal discipline goes back to the statistician John Tukey in the 1970s, built on the idea that you should understand the shape of a dataset before you model it or draw conclusions. What once meant computing summaries by hand or building pivot tables is now one pass over the whole file. The principle is the same: look first. An average on its own can hide the very problem you are looking for, which is why the profile shows counts, blanks, distinct values and ranges side by side.
Why you profile before you trust a dataset
Every data professional has learned this lesson the hard way at least once: you load a file, build something on top of it, and only later discover that a key column was 30% empty, or a date field had three different formats mixed together, or an amount column had a handful of negative values nobody expected.
Profiling a dataset first is not extra work, it is the step that prevents building on a foundation you have not actually inspected, and it is the difference between finding a data quality problem in five seconds versus finding it in production.
A discipline older than the tools that automate it
Exploratory data analysis as a formal discipline dates back to the statistician John Tukey's work in the 1970s, built on the idea that you should understand a dataset's shape before you model or draw conclusions from it. What used to require manually computing summary statistics or building histograms by hand is now something a single automated call can produce, but the underlying principle has not changed: look before you leap into analysis, cleaning, or a production import.
What you can do with it
Incoming file quality gate
Profile every partner CSV on arrival and automatically flag files where a required column exceeds an acceptable null percentage before it reaches an import job.
Exploratory analysis before modeling
Get column-level distributions and outlier ranges on a new dataset in seconds, instead of manually building pivot tables to understand its shape.
Data cleanup prioritization
Identify which columns actually need attention, ranked by null percentage and outlier presence, instead of cleaning every column equally.
FAQ
Does it detect outliers?
It surfaces the value distribution and range for numeric columns, including minimum and maximum, which is what makes outliers visible alongside the mean and median rather than hidden behind a single average.
Does this modify or clean my data?
No, csv-stats only analyzes and reports; it never alters the source file, so it is safe to run on production exports before deciding what to clean.
Why profile a CSV before importing it?
Because problems hide in plain sight: a key column that is 30% empty, a date field with three formats mixed together, or amounts with negatives nobody expected. Profiling first finds them in seconds instead of in production.
What does the profile report for each column?
How many values it has, how many are empty and how many are distinct, plus the minimum, maximum and average for numeric columns. A sales column with one blank out of four rows shows exactly that.
How is this different from statistics for a single column?
This profiles every column of the file at once, numbers and text alike, to show where the data needs a closer look. When you need the median and standard deviation of one numeric column, use the single-column statistics tool.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/data/csv-stats \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"csv":"n\n1\n2\n3"}'const res = await fetch("https://api.kit.forhosting.com/data/csv-stats", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"csv": "n\n1\n2\n3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/csv-stats",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"csv": "n\n1\n2\n3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/csv-stats", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"csv":"n\\n1\\n2\\n3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"csv":"n\n1\n2\n3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/csv-stats", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"csv": "n\n1\n2\n3"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_stats",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
This endpoint profiles a CSV column by column and returns exactly that picture, without you having to eyeball a spreadsheet or write throwaway analysis code.
What a profile actually reports
Call POST /data/csv-stats with your file and the task returns, for every column, its inferred type, the count and percentage of null or empty values, and type-appropriate statistics: minimum, maximum, mean and median for numeric columns; the distinct value count and the most frequent values for categorical or text columns; earliest and latest dates for date columns. It is the same census a careful analyst would run manually with a pivot table, condensed into one automated pass over the whole file.
Distributions tell a different story than averages
Reporting distribution shape and value frequency alongside the summary statistics, rather than a bare average, is what turns a profile from a vague summary into something that actually flags where a dataset deserves a closer look. A mean on its own can hide exactly the problem you are looking for — an average order value of $85 looks unremarkable until the distribution shows most orders cluster near $20 and a handful of outliers near $2,000 are dragging the mean upward.
Its place in a data pipeline
Because profiling runs asynchronously and returns a task_id right away, it fits naturally as a first step before anything else touches a new dataset — run it on an incoming partner file to catch quality issues before a transform or merge step, or run it periodically on a table export to monitor how its shape drifts over time. Results arrive by signed webhook or a 24-hour signed link, ready to drive an automated quality gate or simply inform a human deciding whether a file is trustworthy enough to load.
Integration use cases
Schema drift monitoring
Run statistics on a recurring export over time to catch when a column's distinct value count or null rate quietly shifts, signaling an upstream change.
Technical questions
What statistics does this CSV statistics API return per column?
For each column it returns inferred type, null count and percentage, plus type-appropriate stats: min, max, mean and median for numbers, distinct and most frequent values for text, and earliest/latest for dates.
Is there a free tier to try the csv-stats endpoint?
The tool above runs free in your browser. The API is paid — each call draws from your prepaid ForHosting KIT balance: top up from $10.00 (it never expires), pay each request's published price, and a call with no balance returns HTTP 402. No subscription, no tokens, and a failed task is never charged.
Can I profile a very large CSV file?
Yes, submit it as an async request and it returns a task_id immediately, so the profile is computed in the background regardless of file size.
How is this different from just opening the file in a spreadsheet?
A spreadsheet requires manually building pivot tables or formulas per column and struggles past a few hundred thousand rows; this endpoint profiles every column automatically regardless of file size.
How do I receive the statistics report?
Through a signed webhook, recommended for automated pipelines, or a signed link valid for 24 hours for manual review.
How much does the CSV statistics API cost?
$0.002 per request, charged only when the profiling task completes successfully.