Web Game Distribution & Platform Intelligence
Pricing
Pay per usage
Web Game Distribution & Platform Intelligence
Discover where browser and HTML5 games are distributed across YouTube Playables, CrazyGames, and Poki. Normalize platform records into one canonical game entity with availability, metadata differences, qualified channel changes, match confidence, provenance, and partial coverage.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Dung Huynh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
23 days ago
Last modified
Categories
Share
This JavaScript ESM Apify Actor accepts bounded browser-game queries and reports normalized observations for YouTube Playables, CrazyGames, and Poki. It resolves platform candidates conservatively, preserves sanitized provenance, emits useful partial results, compares a prior compact snapshot, and writes one dataset record per unique recordId.
The implementation uses injected sanitized fixtures for deterministic checks. Fixture success is parser evidence only; it is not a claim of current live source coverage.
Run locally
npm ci --ignore-scripts --no-audit --no-fundnpm testapify validate-schemanode scripts/run-fixture-benchmark.mjs --verify
apify run --purge --input-file default-input.json is the local Actor command. It exercises the configured source transports and is not a substitute for Factory Cloud QA or human review of live coverage.
Canonical default input
The following JSON object is the canonical runnable input. It is byte-equivalent in default-input.json, sample-input.json, storage/key_value_stores/default/INPUT.json, and the defaults in .actor/input_schema.json.
{"queries": [{"name": "Cut the Rope","url": "https://www.crazygames.com/game/cut-the-rope"}],"platforms": ["youtube-playables","crazygames","poki"],"maxCandidatesPerPlatform": 10,"minMatchConfidence": 0.75,"comparisonSnapshotKey": "LAST-SNAPSHOT","persistSnapshot": true,"maxConcurrency": 3}
Input contract
queries is required. A query must contain a non-empty name, a safe supported-platform URL, or both. Names are trimmed and collapsed. URLs must use HTTPS, have no credentials, fragments, explicit ports, sensitive parameters, or unsupported routes. Accepted routes are CrazyGames /game/..., Poki /g/... and /en/g/..., and YouTube Playables under /playables or playables.youtube.com.
| Field | Type | Default | Bounds and behavior |
|---|---|---|---|
queries | array | the canonical query above | 1–25 items; each has a name, URL, or both |
platforms | array | youtube-playables, crazygames, poki | unique supported adapter IDs |
maxCandidatesPerPlatform | integer | 10 | 1–20 candidates per query and platform |
minMatchConfidence | number | 0.75 | finite threshold from 0 to 1 |
comparisonSnapshotKey | string | LAST-SNAPSHOT | safe 1–64 character key |
persistSnapshot | boolean | true | replace the compact snapshot only after output succeeds |
maxConcurrency | integer | 3 | 1–6 simultaneous source operations |
The Apify item editor schema cannot express the conditional name-or-URL rule, so normalizeInput() is authoritative for that validation.
Output contract
Every written record contains the following fields. .actor/dataset_schema.json is the typed dataset contract and .actor/output_schema.json describes Store-facing field templates.
| Field | Required | Meaning |
|---|---|---|
recordId | yes | Stable dataset identity: game:<canonical-id> or unresolved:<normalized-query> |
canonicalGameId | no | Stable ID only when evidence safely resolves the entity |
canonicalTitle | no | Highest-confidence normalized display title |
inputQueries | yes | Deduplicated normalized queries represented by the record |
resolutionStatus | yes | matched, ambiguous, not_found, partial, or source_unavailable |
matchConfidence | yes | Bounded entity-resolution score, not availability probability |
aliases | yes | Deduplicated title aliases retained as evidence |
platformAvailability | yes | Per-platform status, URL, metadata, match score, evidence, and observation status |
metadataDifferences | yes | Compared values from successfully matched platform records |
distributionChanges | yes | Qualified added, removed, metadata_changed, or unchanged channels |
provenance | yes | Sanitized platform, source URL, retrieval time, evidence type, and confidence |
coverage | yes | Requested, successful, failed, access-restricted, unobserved, and complete counts |
warnings | yes | Bounded machine-readable warning codes |
observedAt | yes | ISO 8601 observation time |
The typed nested output contract is in .actor/dataset_schema.json. Apify's .actor/output_schema.json uses string templates for the item editor, which cannot express nested dataset types; optional canonical fields are omitted when they cannot be resolved safely.
Confidence is explainable normalized identity evidence. It is not a probability and does not upgrade a failed or restricted source. coverage.complete is true only when every requested platform has a successful qualified observation without access restriction or an unobserved adapter. A partial record may contain matched channels and explicit failures; source_unavailable is used when all requested sources fail or are inaccessible.
Runtime and state behavior
src/runtime/actor-runtime.mjs initializes the Apify Actor, reads and normalizes canonical input, creates the three isolated adapters, loads the named snapshot, runs bounded orchestration, validates all output records, writes the default dataset, persists a compact versioned snapshot, stores run statistics under RUN-STATS, logs bounded lifecycle messages, and exits cleanly.
Output validation rejects malformed records, empty IDs, and duplicate IDs before the first dataset write. Snapshot state is comparison state only and is never copied into current availability or provenance. A corrupt or incompatible prior snapshot suppresses change claims with a warning. Snapshot write failure preserves successful dataset output. Dataset failure prevents snapshot replacement.
Bounded source behavior and limitations
- The Actor supports only public HTTP-first adapter boundaries for YouTube Playables, CrazyGames, and Poki.
- Each run accepts at most 25 queries, inspects at most 20 candidates per platform, allows at most six-way source concurrency, and uses at most two total attempts per request.
- Response bodies, titles, metadata arrays, warnings, provenance, and snapshots are size-bounded. Raw HTML, credentials, cookies, tokens, and secrets are not output or logged.
- Browser automation, authenticated sources, anti-bot bypass, alerts, scheduling, and additional platforms are outside this contract.
- Public catalogs, markup, regions, robots rules, source terms, and access restrictions can change. YouTube Playables may expose no stable public catalog or require session state; the adapter reports restricted, unavailable, parse-failed, timeout, or transport outcomes instead of fabricating absence.
- A removed channel is reported only when a prior available channel exists and the current source successfully observes absence. Failed, restricted, and unobserved sources never qualify a removal.
Deterministic evidence
node scripts/run-fixture-benchmark.mjs --verify runs sanitized local fixtures with a fixed clock and records measured request count, local latency, entity resolution, duplicate collapse, snapshot change detection, partial-result behavior, and serialized output size in BENCHMARK_NOTES.md. It performs no DNS or network work. Those measurements are bounded local evidence and do not establish live coverage, cost, or availability.
Factory Cloud QA and human review remain the handoff for live source coverage, robots.txt and source-term considerations, confidence behavior, partial-result examples, and publication readiness. This workspace does not deploy, publish, schedule, automate, or change pricing.