# Changelog of Waterfall Contact Enrichment — Email & Phone Lookup (`ryanclinton/waterfall-contact-enrichment`) Actor

- **URL**: https://apify.com/ryanclinton/waterfall-contact-enrichment/changelog.md
- **Full Actor documentation**: https://apify.com/ryanclinton/waterfall-contact-enrichment.md

## Changelog

### 1.6 (2026-08-27) — Better address selection, and the decision layer now reaches every output

- **The address chosen for you is more often the right one.** Where a company's own email pattern could be worked out, that evidence was being discarded during ranking, so a generic guess could beat the address there was real evidence for. Measured against a ground-truth benchmark, the corrected ranking picks the right address in 53% of those cases where the previous version picked it in 0%, and it won every case where the two versions disagreed (17 of 17, and 9 of 9 again on a separate set held back for the check).
- **An address published next to the person's name is now used to find them, not just to fill in their job title.** Where a company site lists a person and their address together, that is the strongest evidence there is that the address is theirs, and it now decides which address you get.
- Fixed: turning on the decision layer alongside a `minimal`, `standard` or `llm` output profile silently dropped it. All four profiles now carry it.
- Fixed: the `compat` profile returned an empty `confidence` on every row unless the decision layer was also switched on, which nothing told you to do. A compat run now works on its own.
- Fixed: `compat` was reporting internal source names that no other email finder uses, so anything reading the `source` field on a candidate would have seen an unrecognised value on every row. Sources are now reported in the vocabulary a migrating pipeline already expects.
- Fixed: a `compat` run returned an empty record instead of the contact. The output format declared the confidence field as an object, which is right for every other profile but not for `compat`, where it is a short text label — so every compat row was rejected before it reached your dataset. Compat runs now return the contact.
- The plain-English reason now says how many other addresses at the domain back the pattern, instead of just naming it. Where that count is not available it is left out rather than shown as zero.
- New `EVIDENCE_RANKED` and `NEEDS_WORK` run outputs in the key-value store: the same contacts ordered by strongest evidence, and just the ones that are not ready to use with the reason each is blocked. Your dataset stays in your input order.
- The run summary now reports how many contacts are actually ready to act on, not only how they scored.

### 1.5 (2026-08-27) — See why an address belongs to a person, and whether it will arrive

- New optional **Include the decision layer**. Every contact gains `identityEvidence` (how we know the address is theirs), `deliverabilityStatus` (whether it can receive mail), `contactAction` (`ready` / `verify-first` / `research-first` / `reject`), an `automationReady` flag to branch on, and a one-line plain-English reason. Identity and deliverability are reported separately, because a domain that accepts every address tells you nothing about who owns one.
- An address generated from a common pattern is never marked ready on mail-server acceptance alone. Plenty of servers accept anything, so acceptance is not evidence of identity.
- New optional **Include the evidence trail**, listing the signals behind each decision and the field each one came from.
- New `compat` output profile, emitting the field names used by other email finders so this actor can be swapped in without rewriting whatever reads the output.
- A catch-all check that could not complete is now reported as unknown rather than as "not a catch-all domain". Previously a timed-out or refused check was indistinguishable from a completed one.
- Leaving the new options off returns exactly the same fields as before.

### 1.4 (2026-08-20) — Known emails can no longer stop a run

- An incomplete entry under Known emails is now skipped with a warning, and the rest of the run continues as normal. Previously a single incomplete entry could end the run before any contact was enriched.
- The Known emails field now shows an example of the expected format.

### 1.4 (2026-06-23) — Faster first results on multi-contact runs — contacts now start enriching and appearing in the dataset right away instead of after an initial warm-up step.

### 1.4 (2026-06-19) — Cleaner empty input, upfront cost estimate

- Starting a run with no people now returns a clear "no people provided" message instead of silently enriching the sample contacts. The Console form still pre-fills sample contacts so the Try button works.
- The run status now shows a worst-case cost estimate up front, so the maximum spend is visible before any contact is charged.

### 1.4 (2026-06-04) — Faster single-contact runs and a low time-limit warning

- Single-contact runs now return and charge as soon as the contact resolves, instead of waiting on a warm-up step first
- If a run is given very little time to finish, it now warns you to allow longer, since a cold lookup can take a couple of minutes

### 1.3 (2026-05-30) — Progress and billing reliability fixes

- Status updates now refresh as each domain finishes preparing, so large lists no longer look frozen during setup
- Each contact is now charged only after its result is saved
- New actor versions now reliably promote to the build your runs use

### 1.2 (2026-05-28) — Pre-warm progress indicator

- Status now updates after each batch instead of staying frozen on 'Pre-warming N domain caches' for the full duration

### 1.2 (2026-05-23) — Fix: rare hang when cross-run history store is unavailable

### 1.2 (2026-05-19) — Reliability — cross-run history failures no longer crash the run

### 1.1 (2026-05-04) — Premium output upgrade

### 1.0 (2026-03-31) — Added domain auto-resolution from company name

### 1.0 (2026-03-30) — Major feature + reliability upgrade
