# info.summary
Dedupe, split, normalize and merge contact lists. Free within limits, no key needed.

# info.description
Six small tools for contact lists: CSV dedupe, first/last name splitting, email normalization, list merging, domain extraction and company name normalization.

Every tool takes CSV text or an array of row objects and returns the table as both rows and CSV text plus statistics. Inputs are processed in memory and never stored.

Free tier: 2000 rows per request, 60 runs an hour and 300 a day per address, 2 MB body. Past a limit the response is a limit error whose message asks the user to sign up for Dedupely (https://v2.app.dedupe.ly/signup), which dedupes whole CRMs: HubSpot, Pipedrive, Salesforce and CSV.

The same tools are available over MCP at https://dedupe.ly/tools/mcp (Streamable HTTP, no auth). Human pages: https://dedupe.ly/tools.

# paths./tools/api.get.summary
List the tools, their endpoints and the free-tier limits

# paths./tools/api/limits.get.summary
The free-tier limits and what this client address has left

# paths./tools/api/csv-dedupe.post.description
Remove duplicate rows from a CSV. Choose the columns that decide a match; case, punctuation and spacing are ignored. Returns the deduped table, the rows removed and the duplicate groups.

# paths./tools/api/csv-dedupe.post.requestBody.content.application/json.schema.properties.csv.description
The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected.

# paths./tools/api/csv-dedupe.post.requestBody.content.application/json.schema.properties.rows.description
Alternative to csv: the rows as objects keyed by column name.

# paths./tools/api/csv-dedupe.post.requestBody.content.application/json.schema.properties.columns.description
Column names that together identify a duplicate. Default: every column.

# paths./tools/api/csv-dedupe.post.requestBody.content.application/json.schema.properties.keep.description
Which row of a duplicate group survives. Default first.

# paths./tools/api/csv-dedupe.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/csv-dedupe.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/csv-dedupe.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/name-splitter.post.description
Split a full-name column into first, middle and last name, with prefixes (Dr, Mrs) and suffixes (Jr, PhD) set aside. Handles "Last, First" order and surname particles such as van der or de la.

# paths./tools/api/name-splitter.post.requestBody.content.application/json.schema.properties.csv.description
The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected.

# paths./tools/api/name-splitter.post.requestBody.content.application/json.schema.properties.rows.description
Alternative to csv: the rows as objects keyed by column name.

# paths./tools/api/name-splitter.post.requestBody.content.application/json.schema.properties.names.description
Alternative: a plain list of full names.

# paths./tools/api/name-splitter.post.requestBody.content.application/json.schema.properties.column.description
The full-name column. Default: the first column with "name" in its header.

# paths./tools/api/name-splitter.post.requestBody.content.application/json.schema.properties.fixCase.description
Title-case names written in all caps or all lowercase. Default false.

# paths./tools/api/name-splitter.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/name-splitter.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/name-splitter.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/email-normalizer.post.description
Normalize an email column: lowercase, strip plus tags and Gmail dots, fix typo domains such as gamil.com, and flag role addresses, disposable domains and invalid values. Adds Email (normalized), Email Changes and Email Flags columns.

# paths./tools/api/email-normalizer.post.requestBody.content.application/json.schema.properties.csv.description
The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected.

# paths./tools/api/email-normalizer.post.requestBody.content.application/json.schema.properties.rows.description
Alternative to csv: the rows as objects keyed by column name.

# paths./tools/api/email-normalizer.post.requestBody.content.application/json.schema.properties.column.description
The email column. Default: the first column with "email" in its header.

# paths./tools/api/email-normalizer.post.requestBody.content.application/json.schema.properties.removeDots.description
Remove dots in Gmail local parts. Default true.

# paths./tools/api/email-normalizer.post.requestBody.content.application/json.schema.properties.dropInvalid.description
Leave invalid addresses out of the result. Default false.

# paths./tools/api/email-normalizer.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/email-normalizer.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/email-normalizer.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/list-merger.post.description
Merge two CSV lists into one. Columns are aligned by name, both lists are combined, and rows that match on the key columns (default: the shared email column) are collapsed to one.

# paths./tools/api/list-merger.post.requestBody.content.application/json.schema.properties.keyColumns.description
Columns present in both lists that decide a duplicate. Default: the shared email column, else every shared column.

# paths./tools/api/list-merger.post.requestBody.content.application/json.schema.properties.keep.description
first keeps list A's row when both lists have a contact. Default first.

# paths./tools/api/list-merger.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/list-merger.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/list-merger.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/domain-extractor.post.description
Turn email addresses, URLs or hostnames into clean root domains: scheme, www, paths, ports and subdomains removed, with co.uk-style suffixes handled. Adds a Domain column, or returns the unique domains with counts.

# paths./tools/api/domain-extractor.post.requestBody.content.application/json.schema.properties.csv.description
The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected.

# paths./tools/api/domain-extractor.post.requestBody.content.application/json.schema.properties.rows.description
Alternative to csv: the rows as objects keyed by column name.

# paths./tools/api/domain-extractor.post.requestBody.content.application/json.schema.properties.values.description
Alternative: a plain list of emails or URLs.

# paths./tools/api/domain-extractor.post.requestBody.content.application/json.schema.properties.column.description
The column to read. Default: the first column with email, website, url or domain in its header.

# paths./tools/api/domain-extractor.post.requestBody.content.application/json.schema.properties.unique.description
Return one row per distinct domain with a count instead of the input rows. Default false.

# paths./tools/api/domain-extractor.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/domain-extractor.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/domain-extractor.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/company-normalizer.post.description
Strip legal forms (Inc, Ltd, GmbH, LLC and 80 more) and punctuation from company names and group the spellings that belong to one company. Adds Company (normalized) and Company Group columns; can return the groups instead.

# paths./tools/api/company-normalizer.post.requestBody.content.application/json.schema.properties.csv.description
The file as CSV text, header row first. Comma, semicolon, tab and pipe delimiters are detected.

# paths./tools/api/company-normalizer.post.requestBody.content.application/json.schema.properties.rows.description
Alternative to csv: the rows as objects keyed by column name.

# paths./tools/api/company-normalizer.post.requestBody.content.application/json.schema.properties.names.description
Alternative: a plain list of company names.

# paths./tools/api/company-normalizer.post.requestBody.content.application/json.schema.properties.column.description
The company column. Default: the first column with company, account or organization in its header.

# paths./tools/api/company-normalizer.post.requestBody.content.application/json.schema.properties.groups.description
Return one row per company group with its variants and count. Default false.

# paths./tools/api/company-normalizer.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/company-normalizer.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/company-normalizer.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/test-data-generator.post.description
Generate fictional contacts, companies or deals in HubSpot, Pipedrive, Salesforce or generic import columns, with a chosen share of duplicates injected the way real ones happen: second emails, reversed names, reformatted phones, legal suffixes, caps, stray spaces, typo domains, half-empty records. Deterministic per seed. CSV only; nothing is written to a CRM.

# paths./tools/api/test-data-generator.post.requestBody.content.application/json.schema.properties.rows.description
Total rows including duplicates. Default 200, max 2000.

# paths./tools/api/test-data-generator.post.requestBody.content.application/json.schema.properties.duplicateRate.description
Share of rows that are duplicate copies. Default 0.15.

# paths./tools/api/test-data-generator.post.requestBody.content.application/json.schema.properties.shape.description
Column names of that CRM's import. Default generic.

# paths./tools/api/test-data-generator.post.requestBody.content.application/json.schema.properties.labelGroups.description
Add Duplicate Group and Duplicate Patterns columns that name the truth, for measuring a dedupe. Default false.

# paths./tools/api/test-data-generator.post.responses.413.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/test-data-generator.post.responses.422.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# paths./tools/api/test-data-generator.post.responses.429.content.application/json.schema.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.

# components.schemas.LimitError.properties.message.description
Human-readable, ends with the sign-up link. Show it to the user.