> For the complete documentation index, see [llms.txt](https://developer.parvenu.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.parvenu.io/enrichments/normalize-contact-names.md).

# Normalize Contact Names

Repair a contact's name — honorifics, trailing credentials, nicknames and capitalisation — one name at a time or across an entire Parvenu list. Free.

Sourced contact names arrive dirty. `Dr. Linda Silbert`, `Emily Kapit, Ms, Mrw, Acrw, Cprw`, `barbara mclean`, `Talyson O?Mahoney` — every one of those goes straight into the first line of a cold email.

Normalize Contact Names repairs them with a fixed set of rules. It strips honorifics and trailing credentials, takes a bracketed nickname as the greeting name (`Mary (Kathy) Mcdaniel` → Kathy), repairs lost apostrophes and mojibake, and fixes capitalisation (`mclean` → McLean, `o'neal` → O'Neal).

There is no model and no lookup. It is pure string work on the name you send, which is why it costs nothing.

### Endpoints

* [Individual Lookup](/enrichments/normalize-contact-names/individual-lookup.md): pass one name, get the cleaned name back in the response. Synchronous, free.
* [List Lookup](/enrichments/normalize-contact-names/list-lookup.md): pass a `listname`; the API repairs every row in place. Asynchronous, free.

### The split is rebuilt, not trusted

Send `person_name` wherever you have it. The first/last split is rebuilt from the full name rather than taken as given, because a wrong split is part of what this fixes — real rows carry a `first_name` of `Dr.` with the whole name pushed into `last_name`.

A split that already agrees with the full name is left alone, so a two-part surname such as `Carlin Boyle` is not shortened to `Boyle`.

### Use Cases

* **Stop sending "Hi Dr.,".** The greeting name is the single most visible field in an email, and a title in it is worse than no personalization at all.
* **Fix a list you bought or imported.** Run it once over an imported list before the first send, rather than finding out from a reply.

{% hint style="warning" %}
The List Lookup writes **in place**, over `person_name`, `first_name` and `last_name`. That is deliberate: a cleaned name in a new column would never reach Smartlead, Aimfox or HubSpot, which all map the existing fields. The original is preserved in `person_name_raw` and re-read on a re-run, so nothing is lost.
{% endhint %}

{% hint style="info" %}
Both endpoints are **free**. No provider call, no model call, nothing charged and, on the single-name route, nothing stored.
{% endhint %}

### What it will not do

A name it cannot resolve comes back **unchanged**, with the reason in `reasons`. Nothing is ever blanked — an empty first name does not stop an export, it sends "Hi ,".

Values that are not people (`hiring@acme.com`, `Acme Roofing LLC`, `Sarah Jones | We're hiring!`) are recognised and left exactly as they are, so a campaign can skip the row rather than greet it by a confident-looking wrong name.
