How to limit csv rows for api and bulk upload testing
- Step 1Export or build the full import CSV — Start from the complete file you intend to upload — the product feed, contact list, or order batch — so the test exercises the real column layout.
- Step 2Drop it onto the Row Limiter — It reads locally; nothing uploads. Free accepts files up to 2 MB, Pro up to 100 MB. Oversized files are blocked at drop before parsing.
- Step 3Set a small Row limit — Enter 10–100 (minimum
1). For a first mapping check, 10 rows is plenty; bump to 100 once mapping is confirmed and you want to test throughput. - Step 4Keep Row offset at 0 for the first batch — Offset 0 takes the rows right after the header. Use offset later to carve a second batch — e.g. offset 100, limit 100 for rows 101–200.
- Step 5Run the upload with the limited file — Submit
<name>.rows-1-N.csvto your API endpoint, Shopify import, or DB loader. Inspect the created records and any error report in the target system. - Step 6Verify, then send the full file — Once the small batch lands cleanly, run the original full file — or split it with csv-row-splitter if it exceeds the endpoint's per-request cap.
Batch sizes for common test goals
How to set the two controls for each stage of validating an integration. Counts are data rows; the header is added on top automatically.
| Test goal | Row limit | Row offset | Why |
|---|---|---|---|
| Column-mapping smoke test | 10 | 0 | 10 rows is enough to confirm every column lands in the right field and required fields are populated |
| Format / validation pass | 100 | 0 | 100 rows surfaces the occasional bad date, stray quote, or empty required cell that 10 rows might miss |
| Second non-overlapping batch | 100 | 100 | Rows 101–200 — test idempotency, retries, or a second page without re-uploading the first batch |
| Throughput / rate-limit check | 500 | 0 | Largest batch that stays within the free 500-row output cap; on Pro raise as needed |
What the Row Limiter does and does not do for API testing
Grounding expectations against the actual implementation so your test batch behaves predictably.
| Capability | Supported? | Detail |
|---|---|---|
| Take first N rows | Yes | Row limit with offset 0 — the default behavior |
| Take a middle/second block | Yes | Set Row offset to skip a leading block, then the limit counts from there |
| Random sample of rows | No | Output is always a contiguous block in file order — no randomization. Sort first if you need a different mix |
| Pick specific rows by value | No | There's no filter here. Use csv-column-filter to select rows matching a value, then limit |
| Validate field formats | No | It slices rows only. Shape-check the batch with csv-validator before uploading |
| Preserve header + column order | Yes | Header is always kept first; columns and order are untouched |
Tier limits relevant to a test batch
Row Limiter is a Pro tool with a free allowance. The free row cap applies to the OUTPUT (rows kept). From lib/tier-limits.ts.
| Tier | Max input file | Max output rows | Past the cap |
|---|---|---|---|
| Free | 2 MB | 500 rows | Test batches of ≤500 rows from a ≤2 MB file work; larger output is blocked with a Pro prompt |
| Pro | 100 MB | 100,000 rows | Cut test batches from full production feeds |
Cookbook
Real integration-testing slices using the two controls. Each block shows the source, the limit/offset, and the resulting upload file.
10-row smoke test for a Shopify product import
ExampleBefore importing a 12,000-product feed, cut 10 rows to confirm Title, SKU, and Price map to the right Shopify columns. If the mapping is wrong, you fix it after creating 10 products, not 12,000.
Source: products.csv (header + 12,000 rows) Row limit: 10 Row offset: 0 Output (products.rows-1-10.csv): Handle,Title,Variant SKU,Variant Price wid-a,Widget A,WID-A,19.98 ... (9 more) Upload these 10 → check the product pages → then import the full feed.
Second batch via offset to test idempotency
ExampleAfter the first 100 rows import cleanly, send a non-overlapping second batch to confirm the endpoint handles a follow-up load without duplicating or clobbering the first.
Batch 1: Row limit 100, Row offset 0 → contacts.rows-1-100.csv Batch 2: Row limit 100, Row offset 100 → contacts.rows-101-200.csv No overlap between batches, so any duplicate-key error in the target system is a real bug, not a test artifact.
Filter then limit for a targeted test case
ExampleTo test only a specific segment (e.g. EU customers), filter first, then cap the count. The Row Limiter has no value filter of its own.
Step 1 — csv-column-filter: country == 'DE' Step 2 — csv-row-limiter: Row limit 25, Row offset 0 Result: 25 German-customer rows for a localized-format test. (Limiting first would mostly give non-DE rows.)
Validate the batch before sending
ExampleSlicing doesn't check field formats. Run the small batch through the validator so a malformed date or missing required cell is caught before it hits the API.
Step 1 — csv-row-limiter: Row limit 50, Row offset 0
Step 2 — csv-validator: confirm required columns, no empty
required cells, consistent column count
Clean batch → upload. Validator flags → fix the source export.Keep the full file when the limit exceeds row count
ExampleA staging dataset that's already small needs no trimming — asking for more rows than exist returns the whole file safely, so you can reuse the same step in a script.
Source: staging_orders.csv (header + 40 rows) Row limit: 1000 Row offset: 0 Output: all 40 rows + header (staging_orders.rows-1-40.csv) Stats: Total rows in 40 · Rows out 40 · Rows skipped 0
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Test batch over 500 rows on free tier
Pro requiredFree caps the OUTPUT at 500 rows. A Row limit that would keep more than 500 is blocked after processing with an upgrade prompt. For API smoke tests this is rarely a problem — 10–100 rows is the norm — but throughput tests above 500 rows need Pro.
Source feed over the file-size cap
Blocked at dropFiles are gated by size before parsing: free blocks >2 MB, Pro blocks >100 MB. A large product feed may exceed 2 MB on free even though you only want 10 test rows. Upgrade, or first split the feed with csv-row-splitter and limit one chunk.
Headerless export from a legacy system
First row treated as headerThe tool always keeps row 0 as the header. If your export has no header line, the first real record is consumed as the header and won't be in the data — your 10-row test would actually carry 9 records plus a mislabeled header. Add a header row first.
Endpoint expects a delimiter the tool didn't emit
Auto / verifyPapaParse detects the input delimiter automatically, and output uses commas as separators where unparse requires them. If your API specifically wants semicolons or tabs, this tool won't convert delimiters — prepare the file in the required delimiter upstream and confirm the test file opens correctly before uploading.
Quoted field with an embedded comma
PreservedA value like "Acme, Inc." is parsed as one cell and re-emitted quoted on output, so the column count stays correct and the API sees one field, not two. This is exactly the kind of bug a 10-row smoke test is meant to catch early.
Offset overshoots the data
Empty batchIf you set an offset larger than the available data rows (e.g. building 'batch 3' on a 150-row file with offset 200), the output is header-only, Rows out 0. Check Total rows in against your offset before uploading an empty batch.
Blank rows in the export
Counted as rowsEmpty lines are not skipped (skipEmptyLines: false), so a blank row counts toward the slice and would be sent to the API as an empty record. Run csv-empty-row-remover first if blank lines would fail your endpoint's validation.
Row limit left at 0 or cleared
Run disabledThe Limit rows button is disabled until Row limit is at least 1. There's no way to run with a zero or empty limit, which prevents accidentally producing a header-only test file.
Frequently asked questions
How many rows should an API smoke test use?
Start at 10 to confirm column mapping, then 100 to catch format and validation issues. Only go above that for throughput or rate-limit testing — and remember free caps the output at 500 rows.
Does it pick the first rows or a random sample?
The first rows (with offset 0), in file order. There is no random sampling. If your edge cases cluster at the end of the file, sort with csv-sorter or filter with csv-column-filter first so they're near the top.
Can I make a second batch that doesn't overlap the first?
Yes. Use the offset: batch 1 is limit 100 / offset 0 (rows 1–100), batch 2 is limit 100 / offset 100 (rows 101–200). No overlap, so duplicate-key errors in the target are real bugs.
Will the test file keep my header so column mapping works?
Yes. The header is always row 0 and is always emitted first, uncounted by the limit. Your test file carries the exact column names the endpoint maps against.
Does it modify or upload my original file?
Neither. Only the downloaded slice is trimmed; the source stays untouched. All processing is in-browser via PapaParse, so the data isn't transmitted to any server.
Can it validate that my fields are formatted correctly?
No — it only selects rows. Run the small batch through csv-validator for shape and required-field checks, then upload the validated batch.
Can I select only rows matching a value (e.g. one country)?
Not in this tool. Filter first with csv-column-filter, then run the Row Limiter on the filtered result to cap the count.
What if my feed is bigger than 2 MB on free?
The file is blocked at drop on free (2 MB cap) regardless of how few rows you want. Upgrade to Pro (100 MB), or split the feed with csv-row-splitter and limit a single chunk.
Does it change the delimiter to match my API?
No. It detects the input delimiter automatically and re-serializes; it doesn't convert between comma, semicolon, or tab. Prepare the file in the delimiter your endpoint needs before slicing.
What does the download file get named?
<name>.rows-<start>-<end>.csv, with the range reflecting your offset. A first batch of 100 from contacts.csv is contacts.rows-1-100.csv; an offset-100 batch is contacts.rows-101-200.csv.
Is there a cap above 500 rows for testing?
Yes — on Pro the output cap is 100,000 rows and the file cap is 100 MB. Free is limited to 500 output rows and a 2 MB file.
After the test passes, how do I send the whole file?
Use the original full export. If it exceeds your endpoint's per-request row limit, chunk it with csv-row-splitter into equal files and upload them in sequence.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.