# Changelog of Facebook Pages · Email, Phone & Website (`corent1robert/facebook-page-contact-scraper`) Actor

- **URL**: https://apify.com/corent1robert/facebook-page-contact-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/facebook-page-contact-scraper.md

## Changelog

### \[1.5] – 2026-08-28

#### Added

- **Actor Standby:** HTTP lookup `GET`/`POST /lookup` — one Facebook page URL or up to **5** URLs. Console **Start** still writes the dataset as before.
- OpenAPI spec for the Standby tab (`web_server_openapi.json`)

#### Changed

- `pageUrls` is no longer schema-required so Standby can boot with empty INPUT. Console **Start** still exits if the list is empty.
- Restored `npm start` (`node src/main.js`) — required by the Docker image.

### \[1.4] – 2026-08-19

#### Changed

- Copy: free plan is **20 pages / run**, not thousands of URLs. Categories: `LEAD_GENERATION`, `SOCIAL_MEDIA`.

### \[1.3] – 2026-08-19

#### Changed

- **Free plan cap:** 20 pages per run (`APIFY_USER_IS_PAYING`). Status: `Free plan: 20 pages. Upgrade for bulk.`
- Anonymous Try-without-account runs disabled (`isAnonymouslyRunnable: false`).

### \[1.2] – 2026-08-18

#### Changed

- Store title/SEO: `Facebook Page Contacts · Email, Phone & Website`; README Who / pricing / legal; `LEAD_GENERATION` category.

### \[1.1] – 2026-08-18

#### Added

- **12 published tasks** (Africa Eco Race, Coca-Cola, Nike, Airbnb, IKEA, Sephora, Decathlon, Spotify, Booking, McDonald's, Lloyd & Davis, Staycation Paris).

### \[1.0.1] – 2026-04-10

#### Changed

- Run logs and RUN\_LOG: no emoji; ASCII progress bar (`=` / `-`); contact previews use plain labels (`phone:`, `email:`, `web:`, etc.); use `apify/log` (`log.info` / `log.warning`) instead of decorative `console.log`.
- Email lines in logs / `RUN_LOG`: heavy redaction (`a***@o***.fr` style, same pattern as airbnb-professional-host-scraper); full value remains in the dataset and CSV only.
- Progressive output: each dataset row is pushed as soon as a page finishes; `RUN_LOG` in the key-value store refreshes after every page (serialized writes); local `output.csv` is appended row-by-row during the run; on the Apify platform, `setStatusMessage` updates after each batch.
- Proxy: not in the **Console** form. **Default** input (URLs only): **residential Apify Proxy** + **5** `parallelWorkers`. Disable or override via API / `input.json` (`proxyConfiguration`, `parallelWorkers`).
- **Worker pool** (`parallelWorkers`, max **5**): separate **cookie jar** + **HTTP header variant** per worker; with **Apify Proxy**, each worker uses a **different sticky session** (separate egress IP). Without proxy, only **1** worker runs — parallel on the same IP still triggers login walls. TLS remains Node/got for all workers.
- Fix: Apify Proxy `sessionId` must match `/^[\\w._~]+$/` — sanitize run id and use `_wN` suffix (hyphens were rejected).
- Logs: dedupe **progress** lines when several workers exit the same delay together; **single-line** contact preview (`sanitizeLogScalar` for address/URLs); decode common **HTML entities** in page titles for log lines only.
- Default `parallelWorkers` **5** (cap **5**); fifth `Accept-Language` profile for header rotation.
- Anti–login-wall tuning: **Chrome Client Hints** (`sec-ch-ua*`) aligned with OS; **shared `CookieJar`** for the whole run; **one sticky proxy session** per run when using proxy; **concurrency 1** on Apify. Default pause between pages: **4.5s** cloud / **2s** local. After a **login-wall** failure, an extra cooldown (**18s** cloud / **10s** local) before the next page — optional API key `loginWallCooldownMs` (use `0` to turn off).

### \[1.1.0] – 2026-04-06

#### Improvements

- Add `address` field (INTRO\_CARD\_ADDRESS — physical address for business pages)
- Add `priceRange` field (INTRO\_CARD\_PRICE\_RANGE — €/€€/€€€ for restaurants and shops)
- Add `profileImageUrl` field (page profile picture from OG meta tag)
- Fix `pageId` extraction: now uses `al:android:url` meta tag (`fb://profile/ID`) — more reliable than regex scan
- Fix `profileImageUrl`: HTML entities (`&amp;`) decoded to valid URL
- Early-exit loop in parser once all fields are filled — faster on large HTML pages
- Remove OG description bio fallback — Relay `profile_status_text` is always used (cleaner, no false positives)
- Remove redundant `storage/key_value_stores/default/INPUT.json` (use `input.json` at root)
- CSV columns updated: `address`, `priceRange`, `profileImageUrl` added

### \[1.0.0] – 2026-04-06

#### Initial release

- Extract phone, email, website, category, bio and follower count from public Facebook pages
- No login, no API key, no browser — pure HTTP (~2–5 s per page)
- Relay JSON parser: reads Facebook's embedded prefetch cache (`data-sjs` blocks)
- Controlled concurrency (1–5 parallel requests) with configurable delay
- Live run log streamed to Key-Value Store during execution
- Local CSV export (`output.csv`) generated after every local run
- `input.json` at project root for fast local iteration
