CSV Diff & Per-Cell Change Report avatar

CSV Diff & Per-Cell Change Report

Pricing

Pay per usage

Go to Apify Store
CSV Diff & Per-Cell Change Report

CSV Diff & Per-Cell Change Report

Compare two CSV snapshots keyed on one or more columns and emit per-row added/removed/changed rows with a per-cell before/after view. Pairs with sitemap / price / product delta monitors that emit CSV-shaped snapshots.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Nikita S

Nikita S

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

Compare two CSV snapshots keyed on one or more columns and emit per-row added/removed/changed rows with a per-cell before/after view. Pairs with the public sitemap-delta-monitor, shopify-delta-monitor, schema-product-delta-monitor, and other delta Actors that emit CSV-shaped snapshots.

  • Per-row output:
    • _kind: "added" — present in right only, with key and row.
    • _kind: "removed" — present in left only, with key and row.
    • _kind: "changed" — present in both, with key, cells[] (column, before, after), plus before and after full rows.
    • _kind: "unchanged" — present in both with no tracked-cell differences.
  • Output (SUMMARY): counts (left, right, added, removed, changed, unchanged), leftName/rightName labels, key, ignoreColumns.

Quick start

apify call stellar_ballet_0bu/csv-diff -i '{
"left": { "name": "products_jul_1", "headers": ["sku","price","stock"],
"rows": [{"sku":"A-1","price":"9.99","stock":"12"},
{"sku":"A-2","price":"14.50","stock":"0"},
{"sku":"A-3","price":"5.00","stock":"3"}] },
"right": { "name": "products_jul_8", "headers": ["sku","price","stock"],
"rows": [{"sku":"A-1","price":"9.99","stock":"8"},
{"sku":"A-2","price":"12.00","stock":"0"},
{"sku":"A-4","price":"7.00","stock":"5"}] },
"key": ["sku"]
}'

The default dataset will have ~6 items (1 unchanged, 1 added, 1 removed, 3 changed-style or vice versa depending on direction). SUMMARY.counts returns {left:3, right:3, added:1, removed:1, changed:1, unchanged:0} in this example.

Inputs

  • left / right — provide either text (raw CSV) or headers[] + rows[] (array of objects). Optional name labels the side in the report.
  • key — array of one or more column names that uniquely identify a row in both CSVs.
  • ignoreColumns — columns to skip when computing per-cell diffs (e.g. timestamps, run ids). Defaults to none.
  • caseSensitiveKeys — default false (case-insensitive).
  • maxChangesPerRow — cap on per-row changed-cells array length (default 100).
  • outputFormatrows (default, one dataset item per diff result) or table (single dataset item with the full side-by-side table for small inputs).

Use cases

  • Delta-monitor verification: feed the previous and current dataset exports of any delta Actor in, get a precise added/removed/changed tally.
  • Migration QA: did the new system preserve every row of the old CSV, and which fields drifted?
  • CRM/data-warehouse CDC without a full ETL pipeline.
  • Price/stock reconciliation between two Shopify/CSV exports.
  • Sitemap delta verification: pair with the public sitemap-delta-monitor to assert that the expected URLs are present.

API notes

  • Pure data utility, no HTTP, no auth, no anti-bot, no scraping.
  • Composite keys supported (key: ["store", "sku"]).
  • Multiple rows on either side with the same composite key are compared in a cross-product (left × right) to surface all permutations.
  • Identical values on a column are not included in the per-cell diff (cells[] only has the columns that actually changed).

Pricing (Pay per event)

EventDescriptionUSD
apify-actor-startBuilt-in start charge, per Apify platform usageper pricing tier
row_diffedOne charge per dataset row emitted (added + removed + changed). Unchanged rows are not charged.$0.0001

currentPricingInfo activates on 2026-07-22T00:00:00Z. The Actor's code calls Actor.charge({ eventName, count }) only for meaningful diff rows; runs that produce no diffs are free aside from the start charge.

Cost expectations

A 1k-row vs 1k-row diff with ~50 added/removed/changed rows will cost roughly $0.005 of usage credits on top of the standard start charge. Use ignoreColumns to suppress noisy timestamp/run-id cells and keep the dataset lean.

FAQ

Does it support key: ["col1", "col2"] composite keys? Yes — any array of column names is treated as a composite key.

What happens if the same key appears more than once on one side? Pairs are compared in a cross-product; every left row with that key is compared to every right row with that key, surfacing all permutations.

Why are unchanged rows in the output but not charged? They are useful for downstream consumers that want to confirm "this key was processed and nothing changed". They cost nothing.

Can I get a single side-by-side table item instead of one row per diff result? Yes — set outputFormat: "table". The default dataset will then have exactly one item with the full before/after table.

Does it strip trailing whitespace or normalise line endings? Yes — both text inputs are trimmed and CRLF/LF are normalised before parsing.

Is there a hard cap on input size? No hard cap, but each input row is materialised in memory. For multi-million-row diffs, run two csv-dedupe-normalizer passes first to shrink the inputs.

Limits

  • Best for inputs up to a few hundred thousand rows. Past that, split into shards.
  • Per-row cells[] is capped at maxChangesPerRow (default 100). The full row is still emitted; only the explicit cell-level diff is truncated.
  • shopify-delta-monitor — emit a CSV-shaped snapshot of Shopify product deltas
  • schema-product-delta-monitor — Schema.org JSON-LD price/availability deltas (CSV-shaped)
  • product-feed-delta-monitor — Google Merchant / JSON / XML / CSV feed deltas
  • sitemap-delta-monitor — public sitemap.xml URL deltas
  • csv-dedupe-normalizer — pre-process to remove obvious duplicates before diffing
  • csv-join-enricher — enrich a CSV with a second CSV by key (different use case but same family)

Support

  • Source: hidden (paid Actor pattern; not exposed by default).
  • Issues / feature requests: open a thread on the public Apify Store Actor page (button on the right of the Store listing) or message the maintainer through the Apify Console.
  • For paid-pilot bulk runs (multi-GB CSVs, scheduled reconciliation, custom output formats), contact the maintainer via the Apify Console.

License

MIT-style Apify Actor Source-Available License. You may use the public Actor output and integrate the public results; you may not re-host the Actor source or re-publish it as a competing Actor.