# Changelog of WhatsApp Number Validator | Bulk Phone Cleanup (`apivault_labs/whatsapp-number-validator`) Actor

- **URL**: https://apify.com/apivault\_labs/whatsapp-number-validator/changelog.md
- **Full Actor documentation**: https://apify.com/apivault\_labs/whatsapp-number-validator.md

## Changelog

All notable changes to this Actor will be documented here.

### \[0.35]

- Added an adaptive five-section input menu with an explicit `workflow` selector.
- Added the MCP-friendly `outputPreset` control while preserving
  `exportFormat` for existing saved tasks and API integrations.
- Added a stable `ERRORS` output and a structured invalid-input summary.
- Retry inputs now retain the selected output preset and explicitly use the
  number-list workflow.

### \[0.34]

#### Performance — 50 concurrent live checks

- Removed the internal 30-worker ceiling so the existing input control can
  actually request up to 50 concurrent live checks and made 50 the default.
- On the same 60-number benchmark, 50 workers completed in 21.4 seconds
  (2.81/s), versus 45.8 seconds (1.31/s) with 30 workers. All 60 checks
  completed with no rate-limit or transport errors.
- Long runs now print live progress every 10 seconds, including processed,
  resolved and remaining counts, instead of appearing idle until a pass ends.

### \[0.33]

#### Performance experiment — 30 concurrent live checks

- Raised the live worker cap and default concurrency from 10 to 30 for a
  controlled throughput test through rotating Apify Residential sessions.
- On the same 60-number benchmark, 30 workers completed in 45.8 seconds
  (1.31/s), versus 58.8 seconds (1.02/s) with 10 workers: about 28% higher
  throughput with no rate-limit or transport errors.
- The timeout-safe `RETRY_INPUT` path remains active, so throttled or unfinished
  checks are preserved for another run instead of being lost or charged.

### \[0.32]

#### Added — resumable bulk runs with rotating Apify Proxy

- Live attempts automatically use the caller's Apify Residential Proxy password
  with a fresh session for each attempt when the platform provides access.
- The Actor stops live work before `ACTOR_TIMEOUT_AT`, delivers completed rows,
  and saves unfinished numbers as a ready-to-run `RETRY_INPUT` record.
- The default run timeout is now 50 minutes instead of 5 minutes; the final
  90 seconds are reserved for flushing results and the retry file safely.
- Unfinished live checks are no longer included in the paid Dataset. Invalid
  numbers and definitive WhatsApp answers remain normal completed results.
- Run summary and status now report proxy availability, completed results and
  the exact retry count.

### \[0.31]

#### Fixed — bulk inputs are no longer silently cut to 100 rows

- The Actor now keeps every unique number supplied in large inputs, including
  runs without an Apify proxy password. Numbers that cannot finish a live check
  within the run timeout are returned honestly as `check_failed` instead of
  being dropped.
- Dataset results and charge events are delivered in batches, preventing
  thousands of per-row API requests from exhausting the run timeout.
- `UK` is now accepted as a user-friendly alias for the ISO country code `GB`.

### \[0.30]

#### Fixed — very large lists no longer fail with a timeout

- On very long lists the run could hit its time limit before any results were
  saved, ending with a timeout and an empty dataset. The Actor now finishes
  within the run's time limit and **returns every number it has already
  checked**, so you always get results instead of an empty, failed run.
- When a list is too large to finish in one run, the run status now says so and
  recommends splitting it into batches (about **500 numbers per run**) for a
  complete WhatsApp check.

### \[0.29]

#### Fixed — live check adapted to the check service's new request format

- The live registration check now uses the service's current JSON request
  format, restoring results after the previous format stopped being accepted.

#### Added — confirmed business accounts get their name in the results

- Business numbers are now confirmed directly and come with a
  `whatsappBusinessName` field (new "Business name" column), so business
  contacts resolve even when third-party check services are unavailable.

#### Added — second independent live-check source

- Registration checks now fall back to a second lookup service when the primary
  one is unavailable, so far more numbers resolve to a definitive
  registered/not-registered instead of a failed check. Numbers seen before are
  answered from the most trusted source first.

#### Fixed — failed live checks no longer show an empty result

- Numbers whose live check could not complete now show `check_failed` with a
  clear `whatsappError` explanation (new column in the results table), instead
  of an unexplained empty "On WhatsApp" cell.

### \[0.24]

#### Improved — registration accuracy and reliability

- More consistent registration results and clearer handling of unavailable data.
- Bulk-run performance and stability improvements.

### \[0.23]

#### Added — visual quick-start guide

- Added a concise 20-second walkthrough showing input, validation results and export.

#### Improved — faster and more reliable

- Speed and performance improvements, so large lists finish noticeably faster.
- Various under-the-hood updates for a smoother, more consistent run.

### \[0.22]

#### Fixed — accurate "returned" count in the run log & summary

- The run log and summary now report the number of records actually delivered
  (instead of the number checked), so the count always matches the dataset.

### \[0.21]

#### 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 numbers you paid for and never a partial, unbilled remainder.

### \[0.20]

#### Changed — every number is returned (no hidden filters)

- The Actor now returns **one row for every number you submit**, each carrying
  `valid` and `whatsapp` true/false flags — filter the list yourself in a
  spreadsheet or CRM. Removed the `onlyValid`, `onlyWhatsappCapable` and
  `onlyWhatsappRegistered` output filters that previously trimmed the results.

#### Fixed — valid registered numbers no longer marked "not registered"

- Corrected a case where genuinely registered numbers could come back as "not
  registered". Registration is now reported accurately, with the public profile
  photo returned when available.

#### Improved — faster bulk checks

- Live checks run in parallel with quicker retries, so large lists finish faster
  and more numbers resolve to a definitive true/false.

### \[0.19]

#### Improved — big lists resolve far more numbers (fewer "unknown")

- Large lists now return a definitive result for far more numbers, so fewer
  come back as "unknown".
- Numbers that genuinely can't be confirmed stay **unknown** (never a fake "no").
- **Tip:** a lower `whatsappConcurrency` (e.g. 5) can raise the resolved rate on
  very large lists.

### \[0.18]

#### Improved — higher match rate

- More numbers get a definitive registered yes/no — including accounts that hide
  their profile photo — so fewer come back "unknown", and none are silently
  downgraded to "not registered".

### \[0.17]

#### Fixed — fewer wrong "not registered" answers

- A number is now only reported "not registered" when it truly is; anything that
  can't be confirmed stays **unknown** (null) instead.
- **New field `whatsappStatus`** — `registered` / `not_registered` / `unknown`,
  so "we couldn't check this one" is never mistaken for "this number has no
  WhatsApp". Shown as "Check result" in the results table and CSV export.

### \[0.15]

#### Changed — cheaper live check, available on more plans

- The live check now costs less to run and works on more Apify plans.

### \[0.14]

#### Changed — faster live check

- **Much faster on large lists.** On the free tier the live check is skipped and
  you still get the full offline validation (validity, line type, carrier,
  country, timezone).

### \[0.13]

#### Changed — free tier limit

- **Free users limited to 100 numbers per run** until tiered pricing takes
  effect. Paid Apify users have no limit.

### \[0.12]

#### Fixed — live check reliable again

- Resolved a reliability issue that made bulk runs under-report registrations.
  The live check now works consistently.

### \[0.11]

#### Fixed — valid numbers were being marked "not registered"

- Corrected the live check: many valid, registered numbers (especially regular
  personal accounts) were incorrectly returned as not-registered. Registration
  is now reported accurately, and the public profile photo is returned when
  available.

### \[0.10]

#### Fixed — live registration check restored

- The live check is reliable again after previously returning every number as
  "not registered".

### \[0.9] — 2026-07-17

#### Fixed — far fewer "unknown" WhatsApp results

- Registrations that used to get lost are now returned correctly, pushing the
  share of definitive true/false results close to 100% on a run.

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

#### Added — optional live WhatsApp registration check (beta)

- **`checkWhatsapp`** — turn it on to verify whether each valid, mobile-capable
  number is **registered on WhatsApp right now**. Adds `whatsappRegistered`
  (true / false) and, when the account is public, a `whatsappProfilePic` URL.
  Off by default, so the Actor stays 100% offline and instant unless you ask for
  the live check.
- **Best-effort with graceful fallback** — you always get the full offline
  result, never a failed run.
- New tuning inputs `whatsappConcurrency` and `whatsappTimeout` (only used when
  the live check is on). No price change.

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

#### Fixed

- **`whatsappCapable` no longer reads `false` for every US/Canada number.**
  These plans can't be split from landline offline, so they were graded
  `maybe` and the boolean showed `false` — making a whole list of valid US
  mobiles look un-reachable. `whatsappCapable` is now `true` when a line **can
  hold a WhatsApp account** (confirmed mobile *or* mobile-capable plan), and
  `false` only for landline / VoIP / toll-free / invalid.
- **Boolean now matches the `onlyWhatsappCapable` filter.**
- The graded `whatsappCapability` field (`yes` / `maybe` / `no`) is unchanged.

#### Changed

- **`phoneNumbers` is no longer required.** You can run with just the bulk paste
  field (`numbersText`).

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

#### Fixed

- **WhatsApp capability was marking almost every number as capable.** For
  numbering plans that can't separate mobile from landline (notably US/Canada),
  every number was treated as `whatsappCapable: true`.
- Capability is now graded honestly with a **`whatsappCapability`** field:
  `"yes"` (confirmed mobile), `"maybe"` (mobile-or-landline plan — needs a live
  check), `"no"` (landline / VoIP / toll-free / invalid).
- `onlyWhatsappCapable` now keeps `yes` + `maybe` and drops `no`.
- `valid` is unchanged.

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

#### Changed

- **Renamed to "Fast WhatsApp Number Validator"** — validates thousands of
  numbers in seconds.
- **Memory capped (128–1024 MB)** to keep runs cheap and predictable.
- **Single tier: $1.5/1K, fully offline.** Removed the optional premium
  live-check tier and its inputs. The Actor is login-free and key-free end to end.

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

#### Changed

- **Price lowered to $1.5/1K** (was $2/1K).

#### Added

- **Bulk paste field** (`numbersText`) — paste a whole list / copied spreadsheet
  column; merged with `phoneNumbers`.
- **Dataset views** — "Validated numbers" + "WhatsApp-ready (clean list)".
- **Input is flattened and de-duplicated** — numbers pasted together
  (newline / comma / semicolon separated) are split apart, and duplicates
  removed so you are never charged twice for the same number.

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

#### Added — initial release

- **Offline bulk validation**: validity, E.164 / international / national
  formats, country, region, carrier, line type (mobile / landline / VoIP …) and
  time zones.
- **`whatsappCapable` flag** — true for valid mobile numbers that can hold a
  WhatsApp account.
- **Cleanup filters** — `onlyValid` and `onlyWhatsappCapable`.
- **Optional live WhatsApp-registration check.**
- **CSV export** (`exportFormat`) with spreadsheet-friendly columns.
- Per-run `SUMMARY` written to the key-value store (not billed).
