# Company Name Cleaner & Deduplicator \[$0.30/1K 💰] (`cybermax/company-name-cleaner`) Actor

💰 $0.30 per 1,000 names; empty rows free, no start fee. Clean company names in bulk: strip Inc, LLC, Ltd, GmbH and 60+ legal forms, fix ALL CAPS, split d/b/a names, get a casual name for emails, and group duplicates by name, domain or typo. CSV, Google Sheet or dataset in.

- **URL**: https://apify.com/cybermax/company-name-cleaner.md
- **Developed by:** [CyberMax](https://apify.com/cybermax) (community)
- **Categories:** Lead generation, Automation, MCP servers
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.30 / 1,000 name cleaneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Firmcomb: Company Name Cleaner, Normalizer & Deduplicator

#### Messy company names in, clean names and duplicate groups out

Company name cleaner for CRM, lead and vendor lists: paste names or link a CSV or Google Sheet; get each company's clean name, a casual name for emails ("Acme Brick", not "THE ACME BRICK COMPANY, INC."), its legal form, any d/b/a trading name, and a duplicate group that catches "Acme Brick Co" and the typo "Acme Brik Company". **$0.30 per 1,000 names**; empty rows free, no start fee.

**[▶ Try it now with a prefilled input](https://console.apify.com/actors/VkXt3J5jT5h4vzvkR/input)** · $0.0003 per name (1,000 names = $0.30) · Apify's free plan includes $5 of credit a month, enough for more than 15,000 names

**Built for:** RevOps teams cleaning CRM accounts before a merge · SDRs personalising emails with the name people actually say · Procurement teams deduplicating vendor lists · List builders cleaning names before paying to enrich them

**Real output** (real run on Apify, 11 Nov 2026, 12 names in 1.5 s):

| Input | cleanName | casualName | legalForm | Status | Group |
|---|---|---|---|---|---|
| THE ACME BRICK COMPANY, INC. | Acme Brick Company | Acme Brick | Inc. | unique | g1 (3 rows) |
| Acme Brick Co | Acme Brick | Acme Brick | Co. | duplicate (same name) | g1 |
| Acme Brik Company | Acme Brik | Acme Brik | Co. | duplicate (similar name, 0.978) | g1 |
| Smith Holdings LLC d/b/a Joe's Pizza | Smith Holdings | Joe's Pizza | LLC | unique | g5 |
| HSBC HOLDINGS PLC | HSBC Holdings | HSBC | PLC | unique | g11 |
| Delta Air Lines / Delta Faucet Company | Delta Air Lines / Delta Faucet | | – / Co. | both unique | kept apart |

**Plug it in (copy-paste):**

- **Make:** Apify → *Run an Actor* · Actor `cybermax/company-name-cleaner` · Run synchronously: Yes · Input `{"companies": ["{{1.company}}"]}` → Apify → *Get Dataset Items* (`{{2.defaultDatasetId}}`) → write `cleanName` and `casualName` back.
- **Zapier:** Apify → *Run Actor* · Actor `cybermax/company-name-cleaner` · Input `{"listUrl": "{{Google Sheet URL}}", "onlyDuplicates": true}` · Wait for run to finish: Yes → *Find Dataset Items* → a duplicate report.
- **n8n:** HTTP Request · POST `https://api.apify.com/v2/acts/cybermax~company-name-cleaner/run-sync-get-dataset-items` · Header `Authorization: Bearer YOUR_APIFY_TOKEN` · JSON body `{"companies": ["ACME BRICK COMPANY, INC.", "Acme Brick Co"]}`.
- **MCP (Claude, Cursor, any agent):** server `https://mcp.apify.com/?tools=cybermax/company-name-cleaner` with header `Authorization: Bearer YOUR_APIFY_TOKEN`, then ask "clean and dedupe the company names in this sheet".

### What you get (one row per input row)

| Field | Example | Meaning |
|---|---|---|
| `cleanName` | Acme Brick Company | Legal forms stripped (60+: Inc, LLC, Ltd, PLC, GmbH, GmbH & Co. KG, AG, S.A., SAS, S.r.l., B.V., Pty Ltd, Pvt. Ltd., K.K., Sp. z o.o.…), "The" dropped, ALL CAPS fixed, acronyms kept. |
| `casualName` | Acme Brick | What people say: the trading name if there is one, without trailing "Company", "Technologies", "Holdings"… Use it in email openers. |
| `legalForm`, `entityType`, `legalFormCountry` | Inc., corporation, us | Normalised legal form, what kind of entity it is, and where that form is used. |
| `dbaName`, `formerName` | Joe's Pizza | Split out of "d/b/a", "t/a", "trading as", "aka" and "(formerly …)". |
| `domain` | figma.com | From "Name | domain", or a website/email column; equal domains group as one company. |
| `matchKey` | acme brick | The comparison key (lowercase, no accents, punctuation or legal forms). |
| `groupId`, `groupSize`, `duplicateOf`, `canonicalName`, `matchReason` | g1, 3, 0, Acme Brick Company, same name | Duplicate groups: the first row of a group is `unique`, the rest are `duplicate` with the reason (same name, same domain, or similar name with its score). |
| `input`, `rowNumber` | your whole row | Sheet and dataset rows come back whole, so results line up with your list. |

### Input

| Field | Default | What it does |
|---|---|---|
| `companies` | – | One name per line, or `"Name \| domain"`, or JSON objects (CRM rows). |
| `listUrl` | – | A CSV file or a Google Sheet shared as "anyone with the link". |
| `datasetId` | – | Another Actor's dataset (a Google Maps or directory scrape, say). |
| `nameColumn`, `domainColumn` | auto | Detected when called company / name / account name / organization / vendor, and domain / website / url / email. |
| `fuzzy`, `threshold` | true, 0.92 | Group near-duplicates (typos, spacing). 0.92 merges "Microsoft"/"Microsfot" but keeps "Delta Air Lines" and "Delta Faucet" apart; short names must match exactly. |
| `keepLegalForm` | false | "Monzo Bank Ltd" instead of "Monzo Bank" in `cleanName`. |
| `onlyDuplicates` | false | Return (and pay for) only rows that have duplicates. |

### Pricing

**$0.0003 per name cleaned ($0.30 per 1,000)**, no start fee. Empty or unreadable rows are free, and with `onlyDuplicates` the unique rows are free. Store rivals for the same job (Apify Store API, 11 Nov 2026): $0.0005 per row plus a start fee (ultimatemc/company-name-canonicalizer), $0.0004 per row plus a start fee (javitax47/lead-cleaner), $0.0003 per row on the free tier (webdata_labs/lead-list-deduplicator).

### Why Firmcomb

- **A casual name for personalisation**, not just a stripped legal name: "HSBC" from "HSBC HOLDINGS PLC", "Joe's Pizza" from a d/b/a.
- **Safe fuzzy matching:** typos and spacing merge ("Acme Brik", "Face Book"), different companies with a shared first word don't ("Delta Air Lines" vs "Delta Faucet"), and every merge says why.
- **Matches on domains too**, so "Stripe Payments" and "Stripe, Inc." group when they share stripe.com.
- **Your rows stay whole** from a sheet or dataset; no re-joining afterwards.
- Pure text processing: 100,000 names run in seconds, nothing is looked up online, nothing leaves the run.

### FAQ

**Why clean names before enriching them?** Duplicates cost money in every paid lookup after this step, and clean names match better. Clean and dedupe here, then look up domains with [Namewhere](https://apify.com/cybermax/company-to-domain).

**Does it change my CRM?** No. It returns rows; you decide what to write back (Make, Zapier, n8n or a CSV export).

**Which languages and countries?** Latin-script names worldwide; accents are kept in `cleanName` and ignored for matching. Legal forms from the US, UK, EU, Nordics, Australia, India, Singapore, Malaysia, Japan, Brazil, Mexico, Poland and Czechia.

**Can an AI agent use it (MCP)?** Yes. Add `https://mcp.apify.com/?tools=cybermax/company-name-cleaner` as an MCP server in Claude, Cursor, VS Code or any MCP client.

**Can I call it from Python, JavaScript or plain HTTP?** Yes. POST your input JSON to `https://api.apify.com/v2/acts/cybermax~company-name-cleaner/run-sync-get-dataset-items` with your Apify token, or use the `apify-client` package.

### Start now

**[▶ Try Firmcomb with a prefilled input](https://console.apify.com/actors/VkXt3J5jT5h4vzvkR/input)** · $0.30 per 1,000 names. Questions or a missing legal form? Open an issue on the [Store page](https://apify.com/cybermax/company-name-cleaner) and it gets answered the same day.

### Also from CyberMax

- [Namewhere — company name to domain](https://apify.com/cybermax/company-to-domain): the official website domain for each clean name, with a confidence score.
- [Firmfold — company enrichment by domain](https://apify.com/cybermax/company-enrichment): company data for each domain.
- [Hollerdex — website emails, phones & socials](https://apify.com/cybermax/website-contacts): public contact details from each company's site.
- [Logolark — company logo API](https://apify.com/cybermax/logo-finder): the logo for each domain.
- [Picpail — bulk image downloader](https://apify.com/cybermax/bulk-image-downloader): every image from a list of pages or a whole site, in one ZIP.

### Changelog

- 11 Nov 2026: first release: clean, casual and canonical names, 60+ legal forms, d/b/a and former names, exact, domain and fuzzy duplicate groups, CSV / Google Sheet / dataset input.

© 2026 CyberMax. All rights reserved.

Found Firmcomb useful? A quick rating helps others find it.

# Actor input Schema

## `companies` (type: `array`):

One company per line, as messy as they come: "ACME BRICK COMPANY, INC.", "Smith Holdings LLC dba Joe's Pizza". Add a domain or email after a bar to match on it too: "Acme | acme.com". In JSON you can also pass objects (CRM rows).

## `listUrl` (type: `string`):

Link to a CSV file or a Google Sheet shared as "Anyone with the link can view" (CRM, vendor or event export). Every row comes back whole in `input`, with the clean name and duplicate group next to it.

## `datasetId` (type: `string`):

ID of a dataset from another Actor's run (e.g. a Google Maps or directory scraper).

## `nameColumn` (type: `string`):

For a sheet, dataset or objects: the column with company names. Leave empty to detect it (company, name, account name, organization, vendor…).

## `domainColumn` (type: `string`):

Optional: rows with the same domain are grouped as one company even when the names differ. Detected when called domain, website, url or email.

## `fuzzy` (type: `boolean`):

Also group names that are spelled almost the same ("Acme Brik" and "Acme Brick"). Exact matches after cleaning are always grouped.

## `threshold` (type: `number`):

0.8 (loose) to 0.99 (strict). 0.92 catches typos without merging different companies like "Delta Air Lines" and "Delta Faucet".

## `keepLegalForm` (type: `boolean`):

"Monzo Bank Ltd" instead of "Monzo Bank" (normalised spelling). The legal form is always in its own `legalForm` field.

## `onlyDuplicates` (type: `boolean`):

For a quick dedupe report: unique rows are left out (and not charged).

## Actor input object example

```json
{
  "companies": [
    "THE ACME BRICK COMPANY, INC.",
    "Acme Brick Co",
    "Acme Brik Company",
    "Figma Technologies Inc | figma.com",
    "Smith Holdings LLC d/b/a Joe's Pizza",
    "Société Générale S.A."
  ],
  "fuzzy": true,
  "threshold": 0.92,
  "keepLegalForm": false,
  "onlyDuplicates": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "THE ACME BRICK COMPANY, INC.",
        "Acme Brick Co",
        "Acme Brik Company",
        "Figma Technologies Inc | figma.com",
        "Smith Holdings LLC d/b/a Joe's Pizza",
        "Société Générale S.A."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cybermax/company-name-cleaner").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "THE ACME BRICK COMPANY, INC.",
        "Acme Brick Co",
        "Acme Brik Company",
        "Figma Technologies Inc | figma.com",
        "Smith Holdings LLC d/b/a Joe's Pizza",
        "Société Générale S.A.",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cybermax/company-name-cleaner").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "THE ACME BRICK COMPANY, INC.",
    "Acme Brick Co",
    "Acme Brik Company",
    "Figma Technologies Inc | figma.com",
    "Smith Holdings LLC d/b/a Joe'\''s Pizza",
    "Société Générale S.A."
  ]
}' |
apify call cybermax/company-name-cleaner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cybermax/company-name-cleaner"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VkXt3J5jT5h4vzvkR/builds/Vad8b0atJ6PFQZByb/openapi.json
