# Nero Labs List Merge & Deduplicate

> Nero Labs List Merge & Deduplicate 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).

Merges two or more JSON row lists and removes duplicate records by a chosen key (phone, email, website), keeping the most complete row and filling blanks from duplicates.

## Facts

- Endpoint: POST https://x402-agent-tools.nerolabs.workers.dev/data/merge-dedupe?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-list-merge-deduplicate-5119e93e
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_EhxqOeUAz8E-XWm7pgNrp

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-list-merge-deduplicate-5119e93e -d '<json body>'
```

Example prompt: Merge these three lead lists — Google Maps results, my CRM export, and a spreadsheet — into one unified list, deduplicate by phone number using normalized matching so spacing differences don't matter, keep the most complete record for each business, and fill any blanks from the duplicates.

## When to prefer this

Choose this endpoint when you need to combine multiple structured JSON row lists from different sources (CRM, scraped data, spreadsheets) into a single canonical list and remove overlapping records by a specific key field. It is especially valuable when phone or website formatting differences would fool exact matching, or when you want to enrich records by filling blanks from duplicate rows. Prefer it over generic dedup tools when you need source attribution per record and a summary of what was merged. Not suitable for more than 500 total rows or for unstructured/non-JSON data.

## Known failure modes

- Fewer than two lists provided — returns an error requiring at least two input lists
- Total rows exceed 500 — returns an error about the row limit
- dedupKeys references fields not present in the row data — no deduplication matches occur
- fuzzy mode used with more than 100 rows — returns an error or warning about the 100-row fuzzy limit
- Malformed JSON rows — parsing error returned
- similarityThreshold out of 0.5–1.0 range — validation error

## 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 containing a 'rows' array of merged, deduplicated records — each row annotated with '_source' (the primary list name), '_foundInSources' (all lists the record appeared in), and '_duplicatesMerged' (count of duplicates collapsed). Also includes a 'summary' object with counts of lists processed, rows in, rows out, mode used, blanks filled, and duplicates removed, plus a 'warnings' array for any issues encountered.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "lists": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "description": "Two or more lists to merge, each {\"name\":\"Google Maps\",\"rows\":[{...},{...}]}. Every row is a JSON object. The name is returned on each row as the list it came from."
  },
  "dedupKeys": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Fields that identify the same record, for example [\"phone\"] or [\"website\"]. Leave out to compare whole rows."
  },
  "dedupMode": {
   "enum": [
    "exact",
    "normalized",
    "fuzzy",
    "none"
   ],
   "type": "string",
   "description": "normalized (default) ignores case, spaces, punctuation and http/www, so \"0117 496 0012\" matches \"01174960012\". fuzzy also catches near matches (100 rows at most). none only merges, no dedupe."
  },
  "keepStrategy": {
   "enum": [
    "most_complete",
    "first",
    "last"
   ],
   "type": "string",
   "description": "Which duplicate to keep: most_complete (default, the row with the most filled fields), first or last."
  },
  "similarityThreshold": {
   "type": "number",
   "description": "fuzzy only, 0.5 to 1. Default 0.9."
  },
  "fillBlanksFromDuplicates": {
   "type": "boolean",
   "description": "Default true: copy values the kept row is missing from the duplicates it replaced."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "rows": [
   {
    "name": "ACME PLUMBING",
    "phone": "01174960012",
    "_source": "CRM",
    "website": "https://www.acme.co.uk/",
    "_foundInSources": [
     "Google Maps",
     "CRM"
    ],
    "_duplicatesMerged": 1
   }
  ],
  "summary": {
   "lists": 2,
   "rowsIn": 2,
   "rowsOut": 1,
   "modeUsed": "normalized",
   "blanksFilled": 0,
   "duplicatesRemoved": 1
  },
  "warnings": [],
  "_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-list-merge-deduplicate-5119e93e/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)
