Retain all existing output fields; add error_type and a linked JSON/CSV output view.
Correct TLS semantics: unknown on DNS/timeout/plain HTTP, false only on certificate validation failure.
Replace whole-body GET plus fallback retry with one bounded header-only GET observation. DNS and redirects share its deadline. No JavaScript renderer is added.
Normalize/deduplicate URLs, validate options early, keep the global limit and existing option defaults. Require explicit API urls; Console prefill is one URL. Output URL normalization now adds / for empty paths and removes fragments/default ports.
Limit each concurrent wave to remaining chargeable rows and save measurements immediately. Retain synthetic dataset billing without manual duplicate charges. Skip already-delivered URLs on resurrection.
Restrict requests/redirects to public addresses and pin validated DNS answers. Unsupported targets get uncharged key-value diagnostics.
Pin the runtime dependency graph and upgrade Apify SDK to 4.0.2 for current synthetic-event budget support. Add the missing local CLI entry point.
Document actual startup/result prices, costs at common scales, measurement limitations and integration behavior.
Compatibility notes
HTTP 4xx/5xx remain valid down measurements. Input mode check, timeout default 15, global cap default 200/max 2000 and all original dataset field names remain. Invalid numeric coercions, private endpoints and URL credentials are now rejected explicitly. ssl_valid changes are correctness fixes; consumers must allow null. Query strings and path case remain unchanged. A resurrected run reuses delivered snapshots; a new run refreshes them.
Release validation
Run python -m pytest -q, apify validate-schema, and the documented local apify run demo. Independent QA and an isolated cloud build/run are required before production promotion. Local checks cannot certify cloud runtime, SDK billing enforcement or a statistical 99% reliability target.