Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ZemerTeam/zemer-cipher/llms.txt
Use this file to discover all available pages before exploring further.
player_configs.json is the single source of truth for per-player deobfuscation parameters. It is bundled inside the APK as an asset and fetched from GitHub at runtime so new player entries can be delivered without an app update. This page documents the complete schema, all validation constraints, and the semantics of each field.
Top-Level Shape
Must be a positive integer that does not exceed the library’s
SUPPORTED_SCHEMA_VERSION (currently 1). Must be a JSON number — a string "1" is rejected. Files with a higher version are rejected by older library builds, keeping their last-good config table until they are updated.A JSON object whose keys are 8-character lowercase hex player hashes. Each value is a player entry object (see below). Must be a JSON object — an array or any other type is rejected.
Player Entry Fields
Each entry underplayers must be keyed by an 8-hex hash and must contain the following fields.
Signature call expression. Validated against
^[A-Za-z0-9$_]{1,8}\(\d+,\d+,INPUT\)$. Represents a call to the player’s signature deobfuscation function with two integer constant arguments and the obfuscated signature. The placeholder INPUT is replaced with the actual obfuscated signature string at evaluation time inside the cipher WebView.Example: "mP(4,155,INPUT)"URL class identifier for the n-transform. Validated against
^[A-Za-z0-9$_]{1,8}$. Used to build the n-transform IIFE locally via PlayerConfigParser.buildNJsExpression — the IIFE template is never taken from the remote file.Example: "Yx"signatureTimestamp. Must be a positive JSON integer (not a string). Sent in InnerTube /player API requests as the signatureTimestamp field. Values in the bundled asset are in the range 20000–29999.Example: 20613An optional array of additional 8-hex hashes that map to the same config entry. Used as fallback hashes when the player URL hash cannot be extracted from the JS via URL patterns; in that case,
FunctionNameExtractor falls back to the MD5 of the first 10,000 characters of the player JS, which is registered as an alias.Each element must match ^[a-f0-9]{8}$. An alias that collides with any other primary hash or alias in the file causes the entire file to be rejected.Example: ["d62bd338"]Real Examples
The following entries are taken directly from the bundled asset:Validation Rules
File-level rejection conditions
A file that fails any of these checks is rejected in its entirety. Callers keep their previous config table unchanged.- JSON is malformed (any syntax error)
schemaVersionis missingschemaVersionis a string or any non-integer JSON typeschemaVersionis zero or negativeschemaVersionis greater thanSUPPORTED_SCHEMA_VERSION(1)playersis missingplayersis not a JSON object (e.g. it is an array)- Any primary hash key duplicates another primary hash key or alias anywhere in the file
- Any alias duplicates any other primary hash key or alias anywhere in the file (including within its own entry)
Entry-level skip conditions
An entry that fails any of these checks is skipped; the rest of the file continues to be processed and aParseResult.Success is returned with the failing key listed in skippedEntries.
- The primary hash key does not match
^[a-f0-9]{8}$ sigis missing, is not a string, or does not match^[A-Za-z0-9$_]{1,8}\(\d+,\d+,INPUT\)$nClassis missing, is not a string, or does not match^[A-Za-z0-9$_]{1,8}$stsis missing, is a string, is not an integer, or is zero/negativealiasesis present but is not a JSON array- Any element in
aliasesis not a string or does not match^[a-f0-9]{8}$
schemaVersion Semantics
The current schema version is 1. schemaVersion is only incremented for breaking changes — additions of new optional fields do not require a bump.
When an older library build encounters a remote file with a higher schemaVersion, it rejects the file and continues using its last-good config table. This ensures that a schema upgrade does not break deployed apps: they receive a ParseResult.Failure and fall through to their cached or bundled data until the app is updated to a library version that understands the new schema.