# Nero Labs Dataset Diff Detector

> Nero Labs Dataset Diff Detector is a paid API for AI agents from x402-agent-tools.nerolabs.workers.dev, paid per call via x402, $0.002/call, status unknown (last checked 2026-10-22).

Compares two snapshots of JSON row arrays by key fields and returns which rows were added, removed, or changed, with field-level diff details.

## Facts

- Endpoint: POST https://x402-agent-tools.nerolabs.workers.dev/data/diff?utm_source=zero.xyz
- Price: $0.002/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-22
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/nero-labs-dataset-diff-detector-c770824a
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_ydUUV-r0Sa1rpW8lbqRCy

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability nero-labs-dataset-diff-detector-c770824a -d '<json body>'
```

Example prompt: Compare these two product catalog snapshots for me — use 'sku' as the key field, ignore the 'scrapedAt' timestamp column, and tell me which products were added, removed, or had their price changed between the two lists.

## When to prefer this

Use this endpoint when you have two JSON snapshots of the same dataset and need a structured, field-level diff — especially for price monitoring, lead tracking, inventory audits, or any scraping workflow where you need to detect adds, deletes, and changes programmatically. It is preferable over generic diff tools because it understands row identity via composite key fields, supports ignoring noisy fields like timestamps, and returns machine-readable summaries with per-field change details up to 500 rows per side.

## Known failure modes

- More than 500 rows on either side — request rejected
- No rows provided in oldRows or newRows — validation error
- keyFields specified but not present in any rows — rows counted as missing key fields and skipped
- Malformed JSON input — parse error
- Payment below $0.002 minimum — payment rejected

## How this service works

Pay-per-call tools for AI agents, 31 in all: read web pages and RSS feeds, OCR, PDF text, transcription; email, phone and domain checks; UK, Irish and Polish company lookups and UK risk reports; website contacts, tech stack and SEO audits; PageSpeed; AI review, job post and row enrichment; data cleaning, joins, dedupe and diffs; US and EU compliance rules. No account or API key: pay each call in USDC on Base over x402.

## Output

A JSON object with a 'rows' array where each entry has a 'key' object, a 'status' of 'added', 'removed', or 'changed', 'oldValues' and/or 'newValues' objects, and a 'changedFields' array for changed rows. Also includes a 'summary' with counts of added/changed/removed/unchanged rows, key fields used, record counts, duplicate and missing-key warnings, and whether unchanged rows were included.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "newRows": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "description": "The after snapshot: a JSON array of row objects, the same kind of rows as oldRows. At least one row."
  },
  "oldRows": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "description": "The before snapshot: a JSON array of row objects. At least one row. Keys may differ between rows."
  },
  "keyFields": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Field name(s) that uniquely identify a row on both sides, for example [\"sku\"] or [\"country\",\"sku\"]. Strongly recommended: without it a changed row is reported as one removed row plus one added row."
  },
  "ignoreFields": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Optional. Fields never compared, for example [\"scrapedAt\",\"lastChecked\"], so a timestamp alone does not mark a row changed."
  },
  "compareFields": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Optional. Only these fields decide whether a matched row changed. Default: every field on either row."
  },
  "includeUnchanged": {
   "type": "boolean",
   "description": "Optional, default false. Set true to also return matched rows with no difference (status \"unchanged\"). They are always counted in the summary."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "rows": [
   {
    "key": {
     "sku": "B2"
    },
    "status": "removed",
    "oldValues": {
     "sku": "B2",
     "price": 20
    }
   },
   {
    "key": {
     "sku": "A1"
    },
    "status": "changed",
    "newValues": {
     "sku": "A1",
     "price": 12
    },
    "oldValues": {
     "sku": "A1",
     "price": 10
    },
    "changedFields": [
     "price"
    ]
   },
   {
    "key": {
     "sku": "C3"
    },
    "status": "added",
    "newValues": {
     "sku": "C3",
     "price": 5
    }
   }
  ],
  "summary": {
   "counts": {
    "added": 1,
    "changed": 1,
    "removed": 1,
    "unchanged": 0
   },
   "warnings": [],
   "keyFieldsUsed": [
    "sku"
   ],
   "newRecordCount": 2,
   "oldRecordCount": 2,
   "differenceCount": 3,
   "returnedRowCount": 3,
   "duplicateRowsSkipped": {
    "new": 0,
    "old": 0
   },
   "rowsMissingKeyFields": {
    "new": 0,
    "old": 0
   },
   "unchangedRowsIncluded": false
  },
  "_example_note": "Real output, trimmed: long lists cut to their first items and long text shortened."
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/nero-labs-dataset-diff-detector-c770824a/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from x402-agent-tools.nerolabs.workers.dev](https://www.zero.xyz/host/x402-agent-tools.nerolabs.workers.dev/llms.txt)
