The 5-runs-per-day free cap is gone, because it never worked. The counter
is replaced by the platform's pay-per-event charge, which is enforced on every
run by Apify instead of by us.
Why: the counter lived in a named key-value store (usage-gate-…) resolved
through the REST API. Every run started through the API executes under
LIMITED_PERMISSIONS, and under that permission set the run token can neither
list nor create a named store. Both calls failed, gate_store.js swallowed
the error and returned null, and the caller silently fell back to the run's
own default store — which is created fresh per run. The counter therefore read
0 every single time.
Measured 2026-11-06:
- Six consecutive live runs, six log lines:
Free tier 1/5.
- 58
usage-gate-* stores exist; 48 hold a record; every record is dated
2026-10-03..05 and carries our own APIFY_USER_ID — all of them from local
test runs. Not one record belongs to a real user.
- The cap could not have fired for anyone: the storage it needed is not
writable from the runs it was supposed to protect.
src/gate_store.js is deleted rather than left disabled — a gate that still
reads a store but never blocks is exactly how a month of silent
non-enforcement looked normal.
Output change: freeTierRunsToday, freeTierCapDegraded and
freeTierCapDegradedReason are removed from both the notice row and the
SUMMARY record. tier (free / paid) is still reported, as information.