Compares an old and a new list of JSON rows by a key field and returns what was
Compares an old and a new list of JSON rows by a key field and returns what was added, removed and changed, with the old and new value of every changed field. Use it to spot new leads, price changes or deleted items between two scrapes. Up to 500 rows a side. $0.001 per new row sent (old rows free), $0.002 minimum. Same engine as nerolabs/dataset-diff-detector.
Answeringour last check, 2026-10-21
1 of 1checks answered this week
41 msmedian answer time
$0.002listed price per call
$0.002price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://x402-agent-tools.nerolabs.workers.dev/data/diff
| Category | Market data |
|---|---|
| Provider host | x402-agent-tools.nerolabs.workers.dev |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 0 from 0 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-10-21 | valid payment request | 402 | $0.002 | 41 ms |
Example input (from the provider)
{
"body": {
"keyFields": [
"sku"
],
"newRows": [
{
"price": 12,
"sku": "A1"
},
{
"price": 5,
"sku": "C3"
}
],
"oldRows": [
{
"price": 10,
"sku": "A1"
},
{
"price": 20,
"sku": "B2"
}
]
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"compareFields": {
"description": "Optional. Only these fields decide whether a matched row changed. Default: every field on either row.",
"items": {
"type": "string"
},
"type": "array"
},
"ignoreFields": {
"description": "Optional. Fields never compared, for example [\"scrapedAt\",\"lastChecked\"], so a timestamp alone does not mark a row changed.",
"items": {
"type": "string"
},
"type": "array"
},
"includeUnchanged": {
"description": "Optional, default false. Set true to also return matched rows with no difference (status \"unchanged\"). They are always counted in the summary.",
"type": "boolean"
},
"keyFields": {
"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.",
"items": {
"type": "string"
},
"type": "array"
},
"newRows": {
"description": "The after snapshot: a JSON array of row objects, the same kind of rows as oldRows. At least one row.",
"items": {
"type": "object"
},
"type": "array"
},
"oldRows": {
"description": "The before snapshot: a JSON array of row objects. At least one row. Keys may differ between rows.",
"items": {
"type": "object"
},
"type": "array"
}
},
"required": [
"oldRows",
"newRows"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
},
"required": [
"input"
],
"type": "object"
}