# Changelog of Skip Trace | People Search, Address, Phone & Email (`apivault_labs/skip-trace-people-finder`) Actor

- **URL**: https://apify.com/apivault\_labs/skip-trace-people-finder/changelog.md
- **Full Actor documentation**: https://apify.com/apivault\_labs/skip-trace-people-finder.md

## Changelog

All notable changes to this Actor will be documented here. All data comes from
**free, publicly available public-records sources**.

### \[1.2.0] — 2026-09-19

#### Added — adaptive MCP menu

- Added workflow routing for name, address, phone, email, or combined lookups.
- Added Contacts, Flat, and Full output presets; Full remains the legacy default.
- Grouped inputs into six sequential Console/MCP sections and added an AI-ready
  contacts Dataset view.

#### Safer cost contract

- Empty API and MCP calls now succeed with `INVALID_INPUT`, SUMMARY and ERRORS,
  and return zero paid rows.
- The James Smith demo is now explicit opt-in (`useDemoOnEmpty: true`) and is
  capped at one result.
- Existing `flatOutput` remains a backwards-compatible override.

### \[1.1.0] — 2026-09-11

#### Added — AI agent and MCP contract

- Explicit output and typed dataset schemas for reliable structured-tool use.
- Every run writes a machine-readable `SUMMARY` and `ERRORS` array with stable
  error codes and retry guidance.
- AI-agent documentation now explains lookup routing, independent OR inputs,
  billing semantics, confidence limits, and prohibited use.

#### Improved

- The default result limit is now 10 per lookup for safer first runs; callers
  can still explicitly request up to 1,000.
- Runtime errors no longer expose raw transport or backend details in outputs.
- Legacy no-match and invalid status rows remain in the dataset and stay free.

### \[0.21.4] — 2026-08-22

#### Fixed — address search returns identified residents again

- Restored live address-result pages to the standard search cascade instead of
  relying on incomplete archived coverage.
- Protected address pages are now retrieved through a direct HTTP request path,
  while confirmed no-matches and unavailable lookups remain free.

### \[0.21.3] — 2026-08-22

#### Fixed — accurate bulk address jobs

- Removed the sample name from the input form and safely ignore that legacy
  sample when it is still present in a bulk address-only input.
- Address matches without a person's name, phone, or email are now returned as
  free no-result statuses and are never charged.
- Every submitted lookup is represented in the output, including free statuses
  for inputs that could not finish within the run budget.
- The main table now shows the search type and original input, and the input
  documentation clearly explains that fields are independent OR searches.
- Large batches stop retrying a temporarily unavailable route after repeated
  failures, allowing the remaining inputs to finish quickly and predictably.

### \[0.21.2] — 2026-08-15

#### Fixed — large batches now run fast and reliably

- Big multi-name batches complete in seconds instead of failing: result merging
  was heavily optimized and parallel fetching is now capped, so large runs stay
  stable.
- Empty records (no name, phone or address) are never delivered or charged.

### \[0.21.1] — 2026-08-15

#### Fixed — no more timed-out runs on slow sources

- Every fetch path now strictly respects the run's time budget, which ends well
  before the platform timeout. A slow or temporarily unreachable source can no
  longer stretch a run until it times out with nothing delivered — you always
  get the results that were found, and unprocessed lookups are skipped (free)
  instead of failing the whole run.

### \[0.21.0] — 2026-08-08

#### Fixed — result delivery now respects the run's charge limit

- Result delivery now stops exactly at the run's charge limit, so you always get
  the full set of records you paid for and never a partial, unbilled remainder.
  No-match, blocked and duplicate lookups remain free as before.

### \[0.20.0] — 2026-08-03

#### Stable, complete result sets

- Results for the same query are now pooled across runs, so the delivered set is
  stable and complete instead of varying between runs.
- Raised the max results per query so large lookups aren't capped early.
- Faster lookups with the same coverage.

### \[0.18.0] — 2026-07-24

#### Reverse email / phone / address fixed

- Reverse **email**, **phone** and **address** lookups were returning empty due
  to a fetch-path issue — added a dedicated route for these three modes, and
  they now return full records reliably.
- Also fixed parsing of source pages that return HTTP 404 while still serving
  full resident data — these were being dropped.
- Reverse-email lookups now also pull public profile data (name, location, job
  title, linked accounts) from an additional free source — so an email lookup
  isn't empty when a public profile exists even if other sources are
  unavailable.

### \[0.17.0] — 2026-07-23

#### Cleaner dataset

- Removed the standalone compliance-notice row and the review-request row from
  the dataset output. The output now contains **only person records** — the
  compliance text still travels with every record in its `complianceNotice`
  field, and the review nudge moved to the run log.

### \[0.16.0] — 2026-07-22

#### Cleaner output

- **Neutral source attribution.** `dataSources` now reports how many independent
  public-records sources corroborated each record (e.g. "public records
  (3 sources cross-referenced)") instead of naming individual providers. The
  match-confidence score still reflects the real number of corroborating sources.
- Removed the per-record `profileUrl` field from the output.

### \[0.15.0] — 2026-07-21

#### Wider coverage & richer records

- **More public-records sources per lookup.** Each name search now cross-references
  additional free public-records sources in parallel (with automatic fallback),
  so you get more unique people per query and more complete records.
- **More phone numbers, addresses, aliases and relatives** merged into each
  matched person, and better age coverage.
- On common names this returns noticeably more distinct individuals; on rare
  names the extra sources corroborate matches for higher confidence.
- Same output fields and the same flat $6.5/1K pricing — you still only pay for
  unique matched records. Reliability and run time are unchanged.

### \[0.14.7] — 2026-07-21

#### More results, faster and more reliable

- **~30% more results per search.** Fixed a matching issue where distinct people
  were sometimes merged together and dropped — a single lookup now returns
  noticeably more matched individuals.
- **Broader coverage.** Each lookup now cross-references more public-records
  sources in parallel (with automatic fallback), so fewer people are missed and
  records are more complete.
- **Higher result cap.** The default number of results per query was raised so
  common names return the full set of matches out of the box.
- **Faster & more stable fetching.** Reworked fetch path with automatic retries
  and IP rotation means far fewer empty or failed runs.
- Same output fields and the same flat $6.5/1K pricing — you still only pay for
  matched records.

### \[0.14.3] — 2026-07-09

#### Cost control

- **Leaner fetch path.** The fetch strategy was streamlined so lookups cost
  less to run and finish faster. A lookup that can't be served simply returns
  no result (never charged). The legacy proxy-fallback option has been removed.

### \[0.14] — 2026-07-03

#### More complete results per lookup

- **Fuller match lists.** Name, phone and address lookups now return a more
  complete set of people per query — matches that were previously left out are
  merged in, and details for the same person are combined into a single richer
  record instead of being split or dropped. Expect noticeably more results on
  common names.
- **Same output shape and price.** Fields are unchanged and you still only pay
  for matched records at the flat $6.5/1K rate.

### \[0.13] — 2026-07-02

#### Even fewer empty results

- **Broader default fetch coverage.** Lookups now try an additional low-cost
  fetch route before falling back, so more name and reverse-phone searches
  return a match on the first try. No change to fields, output, or the flat
  $6.5/1K pricing.

### \[0.12] — 2026-07-02

#### Faster, more reliable lookups — far fewer empty results

- **Fewer failed / empty lookups.** The public-records sources started blocking
  the old fetch path, so many runs were coming back empty. The fetch strategy
  was reworked (best-IP-first with a smart retry fallback) so a single transient
  block or timeout no longer kills a lookup — you get a result where you
  previously got nothing.
- **Faster.** Removed a wasted first fetch attempt that almost always failed and
  added ~10s of dead time per lookup, plus a lighter, more direct fetch path.
  Lookups that used to stall now return noticeably quicker.
- **Same data, same price.** No change to the fields you get, the output shape,
  or the flat $6.5/1K pricing — you still only pay for matched records.

### \[0.11] — 2026-06-26

#### Added — best-match flag, numeric confidence & flat export

- **`mostLikely`** — the single best record per lookup is flagged `true` (best
  match confidence, tie-broken by data richness). Filter `mostLikely=true` for
  one clean row per person.
- **`matchConfidence` (0-100)** — a numeric score alongside the existing
  high/medium/low `confidence`, so you can sort/filter by match strength (e.g.
  keep only `> 60`).
- **`flatOutput`** — optional flattened output: nested fields (phones, emails,
  relatives, geo, emailsDetailed…) become single underscore/semicolon-joined
  columns for a clean CSV / Excel / Google Sheets / CRM export.
- All additive; pricing unchanged, you still only pay for matches.

### \[0.10] — 2026-06-23

#### Fixed — ReDoS hardening (stability under load)

- **Catastrophic regex backtracking eliminated.** Email and address patterns
  used unbounded quantifiers that could hang a run for 60+ seconds on a large or
  malformed page (e.g. a 50k-character junk block). Replaced with bounded,
  RFC-realistic limits so parsing stays linear — adversarial input now processes
  in milliseconds instead of minutes. Applies across all source parsers.
- **HTML size cap** (3 MB) before regex parsing as defense-in-depth against a
  pathologically large response tarpitting the run.

### \[0.9] — 2026-06-23

#### Fixed — input validation (anti-abuse hardening)

- **Name search**: Rejects two single letters (e.g. "A B") that were being
  accepted as valid names. Prevents abuse through gibberish name inputs.
- **Name search**: Accepts names with apostrophes (O'Brien, de la Cruz) and
  hyphens (Jean-Paul) by improving token extraction regex.
- **Phone search**: Accepts extensions (x123, ext. 123) alongside the main
  number. Previously "202-555-0182 x123" was rejected.
- **Address search**: Now requires either a state abbreviation (e.g. NY) or
  5-digit ZIP code to prevent partial/street-only inputs from triggering
  expensive lookups. More precise validation, fewer wasted requests.

### \[0.8.7] — 2026-06-22

#### Added — opt-out / removal from results

- You can now ask to be **excluded from this Actor's results**. People who
  request removal (email in the Legal & Acceptable Use section) are added to a
  suppression list, and the Actor **stops returning them in any search** — they
  are dropped before any result is delivered or charged. We can't delete records
  at the original public sources, but we no longer surface opted-out people here.

### \[0.8.6] — 2026-06-22

#### Added — input validation (faster, no wasted lookups)

- Inputs are now validated instantly before any lookup runs: clearly invalid
  phone numbers, malformed or non-existent email domains, and inputs that aren't
  real names are reported as "no match" right away instead of triggering a
  search. This makes runs faster and means you are never charged for junk input.

### \[0.8.5] — 2026-06-22

#### Added — phone spam/scam flag

- Premium reverse-phone lookups now also check community spam reports and tag
  the number with `spamReport` (true/false) plus sample `spamComments`, so you
  can tell at a glance whether a phone is reported as spam/scam. Applied to
  every record for that phone.

### \[0.8.4] — 2026-06-22

#### Added — another premium source

- Premium mode (`useUnblocker`) now pulls one more premium public-records
  source (name & phone — each result gives full name, a phone and a current
  address). Six premium sources total alongside the free ones.

### \[0.8.3] — 2026-06-22

#### Added — even more premium sources

- Premium mode (`useUnblocker`) now pulls two more premium public-records
  sources (name — full street addresses, many phones, relatives; reverse-phone
  — owner name, city and **carrier**). Five premium sources total alongside the
  free ones.
- Added `carrier` to records when a reverse-phone source provides it.

### \[0.8.2] — 2026-06-22

#### Added — more premium sources

- Premium mode (`useUnblocker`) now pulls two more premium public-records
  sources (name/phone — adding age, current + prior cities, relatives, many
  phone numbers and emails). All merged per person into one enriched record.

### \[0.8.0] — 2026-06-22

#### Added — optional premium coverage

- **New opt-in "Premium sources" mode** (`useUnblocker`) can use a customer-provided
  compatible access credential to broaden public-record coverage. Provider and
  transport details are intentionally not part of the public release notes.
- Off by default. Any third-party service is billed directly to the customer's
  account, so the Actor's per-result price is unchanged.
- Added `geo` (lat/lng) to records when a source provides coordinates.

### \[0.7.3] — 2026-06-22

#### Added — more sources per search mode (higher hit rate)

- **Reverse-phone now queries multiple sources** in parallel, merged into one
  record per person (with an automatic fallback). More sources mean a higher
  chance of a match and a fuller contact record.
- Name, address and phone lookups all run their sources as a parallel cascade
  and merge results, so one slow or empty source never blocks the others.

### \[0.7.0] — 2026-06-22

#### Added — match confidence, source attribution, reverse-email & verified contacts

- **Match confidence** on every record — `confidence: high | medium | low`, based
  on data completeness, multi-source corroboration and how well the result matches
  your query. Triage strong matches at a glance.
- **Source attribution** — `dataSources` shows how many independent
  public-records sources corroborated each record.
- **Reverse-email search (4th mode)** — look up the person behind an email address
  via the new **Emails** input. Search by name, address, phone *or* email.
- **MX-verified emails** — each email's domain is checked for mail (MX/A) records;
  results add `bestEmail`, `emailsVerified` and `emailsDetailed` (with a
  `deliverable` flag). Free and fast (DNS only), can be turned off.
- **Best contact surfaced** — top-level `bestPhone` and `bestEmail` so you don't
  have to pick from a list.
- **Phone E.164 normalization** — `phonesE164` gives every number in a single
  `+1XXXXXXXXXX` format, de-duplicated across formats.
- Pricing unchanged — one flat price, you only pay for matches.

### \[0.6.30] — 2026-06-22

#### Fixed — cleaner logs, no false-alarm "errors"

- Removed a backend source that is permanently blocked on cloud infrastructure
  and never returned data — it only produced noisy "HTTP 403" log lines that
  looked like errors. Lookups are unaffected (the working sources already cover
  the same data) and runs are slightly faster with one less wasted request.
- Source fallbacks are now logged as plain informational messages, so a single
  source being momentarily unavailable no longer reads like a failure.
- Reverse phone search (look up a person by their US phone number) confirmed
  working end-to-end — provide numbers in the **Phone numbers** input field.

### \[0.6] — 2026-06-17

#### Added — richer address & phone lookups + cross-reference mode

- **Address and reverse-phone lookups now return full records**, not just a list
  of names — current/previous addresses, phones, emails, relatives, aliases and,
  when available, date of birth / job title / education / profile link.
- **New "Maximum" coverage mode** (`source: merge`) cross-references several
  public-records sources and merges them into the most complete record per
  person. "Comprehensive" (default) and "Standard" modes unchanged.
- **Faster and more reliable** — lookups are time-bounded so a run never hangs.
- Pricing unchanged — one flat price, you only pay for matches.

### \[0.5] — 2026-06-17

#### Added — multi-source coverage (richer results)

- **Lookups now draw from several public-records sources** and return far more
  complete records in a single run: current + previous addresses, phone numbers,
  **emails**, relatives, aliases, and — when available — date of birth, job
  title, education and a professional profile link.
- New **Data coverage** input: *Comprehensive* (default) or *Standard*. If a
  source is momentarily unavailable, the Actor falls back automatically, so
  results are more reliable.
- Pricing unchanged — one flat price, you only pay for matches.

### \[0.4] — 2026-06-17

#### Changed — single flat price

- **One simple flat price: $6.50 / 1,000 matched records** (down from the old
  $7 / $15 two-tier setup). Every run is a full people lookup — name, age,
  current + previous addresses, phones, relatives, aliases and a profile link.
- You only pay for matched records; empty lookups are always free.

### \[0.3] — 2026-06-11

#### Improved — more results & better accuracy

- **More matched people per query** (default raised to 10, up to 50).
- **Per-person accuracy** — relatives, aliases and address history belong to the
  correct individual, never copied across results.

### \[0.2] — 2026-06-08

#### Improved — listing & docs

- Clearer title, description and README around real search use cases
  (skip tracing, people search, reverse phone lookup, address lookup).

### \[0.1] — 2026-06-03

#### Added

- Richer per-person extraction: detailed phones, address history, relatives,
  aliases, and a free `SUMMARY` aggregate in the run's key-value store.

### \[0.0] — 2026-06-03

#### Added

- Initial release.
- Three search modes: by name, by address, by phone (reverse lookup).
- Per person: full name, age, current + previous addresses, phones, emails,
  aliases, and a public profile link.
- Bulk input (arrays) with `max_results` per query.
- No API key required.
