Dataset Cleaner & Exporter avatar

Dataset Cleaner & Exporter

Pricing

from $2.00 / 1,000 cleaned records

Go to Apify Store
Dataset Cleaner & Exporter

Dataset Cleaner & Exporter

Returns a deduplicated, flattened and cleaned copy of any Apify dataset, file or Google Sheet by URL, or JSON array, plus CSV and Excel files, named-dataset append and webhook delivery. Inputs: source, dedup keys, flatten, cleaning options. Agent-ready: pay per event (x402, MCP), per cleaned record.

Pricing

from $2.00 / 1,000 cleaned records

Rating

0.0

(0)

Developer

Adam Pearce

Adam Pearce

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

5

Monthly active users

an hour ago

Last modified

Share

Turn any messy Apify dataset into a clean spreadsheet

Just finished a scrape and got back a pile of nested JSON with duplicate rows, inconsistent casing, and half-empty fields? Dataset Cleaner & Exporter takes any Apify dataset, a CSV, Excel or JSON file or Google Sheet by URL, or your own JSON, and hands back a deduplicated, flattened, cleaned dataset plus a ready-to-open CSV and Excel file, no manual export-and-tidy-up step required.

Point it at a sourceDatasetId from any other Actor's run, paste a file or Google Sheet link into fileUrl, or paste inline JSON, and it will:

  • Deduplicate exact, normalized, or fuzzy near-duplicates, keeping the most complete record
  • Flatten nested objects into spreadsheet-ready columns (address.city becomes address_city)
  • Clean emails, phone numbers and URLs, strip HTML, trim whitespace, coerce types
  • Explode one named array field (e.g. offers or variants) into multiple rows, if you want that
  • Export a real downloadable CSV and XLSX file, not just a dataset you have to know how to export yourself
  • Append to a named dataset that accumulates across scheduled runs, so a pipeline lands in one place
  • Push to a webhook the moment a run finishes, so you don't have to come back and check

Why use this instead of exporting manually?

Apify's own dataset export already gives you a raw CSV or JSON, but it's still the dataset you started with: duplicates and all, nested fields collapsed into unreadable JSON strings, no cleanup. This Actor is the step most people do by hand in Excel or a spreadsheet formula afterwards, done automatically, and chainable straight after any scraper in a pipeline or schedule.

  • Data teams: standardize scraper output before loading into a database or BI tool
  • Lead generation: dedupe and normalize contact lists from multiple scraper runs
  • Automation builders: drop this in as a cleanup step between a scraper and a Google Sheets/Slack/webhook integration
  • AI agents: a deterministic, no-hallucination-risk primitive for "clean this data" as part of a larger pipeline

How to use it

  1. Run any scraper or data-producing Actor and copy its dataset ID from the Storage tab (or grab defaultDatasetId from its API response).
  2. Run this Actor with that dataset ID in Source dataset, paste a link into File URL (CSV, TSV, Excel, JSON, JSON Lines, or a Google Sheet), or paste your own JSON array into Inline data.
  3. Pick the cleaning options you want (deduplication mode, flatten, field cleaning) or leave the sensible defaults.
  4. Download the CSV or Excel file from the run's Output tab, read the cleaned dataset via the API, let it accumulate in a named dataset, or have it POSTed to your webhook.

Bringing in a file or a Google Sheet

Set File URL to any public link. The format is detected from the extension, the content type and the content itself, or force it with File format:

  • CSV / TSV: header row required; quotes, embedded newlines and semicolon or tab delimiters are handled.
  • Excel (.xlsx): the first sheet, header row in row 1; dates come out as ISO strings, formulas as their computed values.
  • JSON: an array, an object wrapping an array ({"items": [...]}, {"data": [...]}), or one object per line (JSON Lines).
  • Google Sheets: paste the normal sheet link. Set sharing to "Anyone with the link can view" (or File > Share > Publish to the web); the Actor converts it to the CSV export link for you, including the specific tab if the link carries a gid.

Up to 100 MB per run. Downloading the file is never charged, only the cleaned records written out are. A CRM export or a shared sheet full of duplicates and inconsistent emails is exactly what this is for.

Input

The full list of options is in the Input tab. The two you'll use most:

  • Source dataset: pick an existing Apify dataset from any of your runs.
  • File URL: a CSV, TSV, Excel, JSON or JSON Lines file, or a Google Sheet link (see above).
  • Inline data: paste a JSON array instead, for ad-hoc or piped data.
  • Also append to a named dataset: optional; the cleaned records are also appended to a dataset of that name in your account (created on the first run), so a scheduled pipeline accumulates into one place. Not charged again.

Everything else (deduplication mode, flatten, field cleaning, column keep/remove/rename, export formats) has a sensible default, so you can run it with just a dataset picked and get a good result.

Output

Three things land in every run:

  1. Cleaned dataset (the Actor's own dataset): the same records, deduplicated, flattened and cleaned.
  2. CSV and/or Excel file, in the run's key-value store, linked directly from the Output tab.
  3. Quality report (QUALITY_REPORT in the key-value store): where the records came from, input/output counts, duplicates removed, per-field fill rates, and any warnings from the run.

With Also append to a named dataset set, the same cleaned records are also appended to a dataset of that name in your account, so every scheduled run lands in one place.

Example cleaned record:

{
"Company Name": "Acme Corp",
"Email": "sales@acme.com",
"Phone": "+15551234567",
"Website": "https://acme.com",
"Details_hq_city": "Austin",
"Details_hq_state": "TX"
}

Webhook destination

Set Webhook URL in the input and the cleaned result (items, download links, and a summary) is POSTed there as JSON the instant the run finishes, no need to poll the dataset or remember to check back. Works with a Zapier/Make/n8n catch-hook, your own API endpoint, or a Slack incoming webhook, so this Actor can be the last step in someone else's pipeline instead of a tool they have to run manually. A failed or unreachable webhook never breaks the run, it's reported as a warning in the output and costs nothing. Charged only on a confirmed delivery (see Pricing).

Pricing

Pay per event, no subscription:

  • $0.002 per cleaned record written to the output dataset
  • $0.01 per exported file (CSV and Excel each count once, so both together is $0.02 per run)
  • $0.02 per confirmed webhook delivery (only when the endpoint responds 2xx; a failed delivery costs nothing), effective 15 September 2026, free before that

A realistic run cleaning 2,000 scraped leads with both CSV and Excel export costs roughly $4.02. A quick one-off cleanup of 50 records with just a CSV export costs about $0.11. There's no charge for records removed as duplicates, only for what actually ends up in your cleaned output. Downloading a file by URL and appending to a named dataset are never charged.

Tips

  • If you're not sure what a source dataset looks like, run it with Max output records set low (e.g. 20) first to check the result before running the full dataset.
  • Combining Field to expand into rows with deduplication needs a small adjustment: if you explode an array field (like offers) into multiple rows and then deduplicate, make sure your Deduplication keys include a field that varies per exploded row (like plan or sku), not just a field shared across every row of that record (like email). Otherwise rows that only differ in the exploded field will be treated as duplicates of each other.
  • Fuzzy deduplication is recommended for datasets under 5,000 records. Above that, it automatically falls back to normalized matching so the run still completes reliably, and the quality report tells you when that happened.

Works with the rest of the Nero Labs dataset toolkit

A common pipeline: a scraper, then Cleaner, then Filter & Transform, then Join to enrich from a sheet, then Aggregate for the weekly summary, with Diff watching what changed and Charts & Report turning the numbers into the Monday PDF. Pipeline Runner runs that whole chain in one call.

FAQ

Does this work with the output of any Actor, or just specific ones? Any Actor's dataset. It makes no assumptions about field names or shape, it works on whatever JSON structure your source dataset actually has.

Will it invent or guess data? No. Every operation is deterministic (no AI/LLM in the loop), and anything it can't confidently interpret (an unparseable phone number, an array it wasn't told to expand) is left as-is or reported in the quality report rather than guessed at.

What happens to duplicate records, are they billed? No, you're only billed for records that end up in the cleaned output. Records removed as duplicates cost nothing.

Can I run this on a schedule after another Actor? Yes, that's the intended pattern: schedule your scraper, then schedule this Actor a few minutes later pointed at the same dataset, or chain them via an integration, and set a named output dataset so every run lands in one place.

My Google Sheet link gives an HTTP 401 or 403. The sheet isn't public. Set sharing to "Anyone with the link can view", or use File > Share > Publish to the web and paste that CSV link.

If this saved you a manual export-and-clean-up pass, a review on this page helps a lot. Found a bug or have a request? Use the Issues tab, replies are personal, not automated.