# Changelog of VIES VAT Validator – Bulk EU VAT Number Check (`lwsdjfls/vies-vat-validator`) Actor

- **URL**: https://apify.com/lwsdjfls/vies-vat-validator/changelog.md
- **Full Actor documentation**: https://apify.com/lwsdjfls/vies-vat-validator.md

## Changelog

### 0.1

- Bulk EU VAT number validation through the documented VIES REST API, for all 27 member states and Northern Ireland, with normalization of what people type (spaces, dots, GR as EL, missing Belgian leading zero).
- A hard line between answers and outages: `invalid` only when VIES answered; every error, time-out and throttle becomes `unavailable` with the VIES error code, attempts, VIES status and, for known maintenance windows, when to retry. Never charged.
- Per member state concurrency, backoff and maximum wait; VIES-wide errors pause every check; unknown error codes count as outages.
- "Invalid" answers from a member state that failed during the run are checked a second time.
- Saved tasks check unavailable numbers again in the next runs, and deliver them once VIES answers.
- Consultation numbers for reverse-charge evidence with your own VAT number; a rejected requester stops the run before anything is charged.
- Company name matching through the Peppol Directory and the French company register, confirmed in VIES, with similarity score, alternatives and an ambiguity flag. French sole traders are skipped in the name search.
- Change detection between runs (for example a customer that is no longer valid), webhook, and a free VIES test-service mode for integration tests.
- Hardened against malformed register answers: any unknown VIES error code ends as `unavailable` within the retry limits, an unusable Peppol identifier no longer discards the other candidates, company names from the search registers are cut to 300 characters (kept as copies, so the rest of an oversized name is freed), and answers over 4 MB are refused. The webhook URL is a secret input, stored encrypted.
- Run limits and memory: a check that the run's check limit or spending limit stops leaves what is stored alone (a known number shows its last result unchanged, a number waiting for VIES keeps waiting), and a run checks only as many numbers and company names as its memory holds (15,000 with the default 1 GB, 55,000 with 4 GB) and says what it left out and what would make room for it, instead of running out of memory before delivery. Such a run ends as partial. A run in which nothing fits (a task or state key that kept too many results from earlier runs) checks and charges nothing: it deletes the kept results due for deletion when that makes room for the next run, and otherwise fails, naming the ways out and the date from which runs make room again on their own. A record that repeats an earlier result because a limit stopped its check has `fromEarlierRun: true`, so software does not store it as a new verification; a number that was only skipped before stays skipped. Records of company names without a charged match list the similar companies without their VIES results; a pending number keeps the date of its first failed check; very long company names get a hashed key instead of losing their record.
