{"openapi":"3.1.0","info":{"title":"ghostagg operator API","version":"1","description":"The game catalogue and session minting, called by your casino with a bearer API key, and the wallet receiver your casino implements, called by ghostagg with signed requests. Amounts are micro-units (1,000,000 = one currency unit) and are never computed on by ghostagg."},"components":{"securitySchemes":{"operatorKey":{"type":"http","scheme":"bearer","description":"The operator API key, shown once at registration."}},"schemas":{},"parameters":{}},"paths":{"/operator/games":{"get":{"summary":"The catalogue a lobby is built from","security":[{"operatorKey":[]}],"responses":{"200":{"description":"Enabled games with modes, cost multipliers and declared RTP.","content":{"application/json":{"schema":{"type":"object","properties":{"games":{"type":"array","items":{"type":"object","properties":{"gameId":{"type":"string"},"gameVersion":{"type":"integer"},"title":{"type":"string","description":"Display title for the lobby."},"thumbnailUrl":{"type":["string","null"],"description":"Lobby tile artwork, or null while nobody has drawn one."},"provider":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"],"description":"Who made the game, when its extracted package declares a provider."},"modes":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Mode name as published by the maths."},"costMultiplier":{"type":"number","description":"Stakes per round: base = 1, a bonus buy = e.g. 100."},"rtp":{"type":"number","description":"Declared return to player, from the imported weights."}},"required":["name","costMultiplier","rtp"]}}},"required":["gameId","gameVersion","title","thumbnailUrl","modes"]}}},"required":["games"]}}}},"401":{"description":"Missing or unknown API key."}},"tags":["Operator API"]}},"/operator/sessions":{"post":{"summary":"Mint a session for a player launch","security":[{"operatorKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"gameId":{"type":"string","minLength":1},"token":{"type":"string","minLength":1,"description":"The operator's own session token. Kept server-side; wallet calls carry it back — it never appears in a game URL."},"playerRef":{"type":"string","minLength":1,"description":"Opaque player reference, never an identity."},"clientSeed":{"type":"string","maxLength":64,"description":"The player's client seed, fixed for the life of the session. Omitted or empty means a weaker proof, and that is the operator’s to explain."},"device":{"type":"string","enum":["desktop","mobile"],"description":"Presentation platform selected by the operator for this browser session."},"currency":{"type":"string","pattern":"^[A-Z][A-Z0-9]{2,7}$","description":"The operator ledger rail selected for this launch."},"maxBet":{"type":"string","pattern":"^\\d+$","description":"Maximum total debit in Munja micro-units (1 currency unit = 1,000,000)."}},"required":["gameId","token","playerRef"]}}}},"responses":{"200":{"description":"Munja's sessionID, the epoch commitment, and the launch parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"sessionID":{"type":"string","format":"uuid","description":"Munja's session token — what the game URL carries."},"fairness":{"anyOf":[{"type":"object","properties":{"scheme":{"type":"string","enum":["munja-hmac-sha256-v1"]},"serverSeedHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"gameVersion":{"type":"integer","exclusiveMinimum":0},"setId":{"type":"string","format":"uuid"},"verifier":{"type":"string","enum":["/verify"]},"mathVerifier":{"type":"string"},"mathManifestSha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"artifactRevision":{"type":"string","pattern":"^[0-9a-f]{64}$"},"modes":{"type":"object","additionalProperties":{"type":"object","properties":{"costX100":{"type":"string","pattern":"^\\d+$"},"weightTotal":{"type":"string","pattern":"^\\d+$"},"rows":{"type":"integer","exclusiveMinimum":0},"weightsSha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"eventsSha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"payoutDenominator":{"type":"string","pattern":"^[1-9][0-9]*$"},"metrics":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"costX100":{"type":"string","pattern":"^\\d+$"},"books":{"type":"integer","exclusiveMinimum":0},"lookupRows":{"type":"integer","exclusiveMinimum":0},"totalWeight":{"type":"string","pattern":"^\\d+$"},"weightedPayoutX100":{"type":"string","pattern":"^\\d+$"},"rtp":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"hitProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"atLeastStakeProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"profitProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"maximumPayoutX100":{"type":"string","pattern":"^\\d+$"},"maximumPayoutProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"returnBands":{"type":"object","properties":{"loss":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"partial":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"stakeTo10x":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"tenTo100x":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"hundredXPlus":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]}},"required":["loss","partial","stakeTo10x","tenTo100x","hundredXPlus"]}},"required":["name","costX100","books","lookupRows","totalWeight","weightedPayoutX100","rtp","hitProbability","atLeastStakeProbability","profitProbability","maximumPayoutX100","maximumPayoutProbability","returnBands"]},{"type":"object","properties":{"name":{"type":"string"},"costX100":{"type":"string","pattern":"^\\d+$"},"books":{"type":"integer","exclusiveMinimum":0},"lookupRows":{"type":"integer","exclusiveMinimum":0},"totalWeight":{"type":"string","pattern":"^\\d+$"},"rtp":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"hitProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"atLeastStakeProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"profitProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"maximumPayoutProbability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]},"returnBands":{"type":"object","properties":{"loss":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"partial":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"stakeTo10x":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"tenTo100x":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]},"hundredXPlus":{"type":"object","properties":{"weight":{"type":"string","pattern":"^\\d+$"},"probability":{"type":"object","properties":{"numerator":{"type":"string","pattern":"^\\d+$"},"denominator":{"type":"string","pattern":"^\\d+$"},"decimal":{"type":"string","pattern":"^\\d+\\.\\d{12}$"}},"required":["numerator","denominator","decimal"]}},"required":["weight","probability"]}},"required":["loss","partial","stakeTo10x","tenTo100x","hundredXPlus"]},"payoutDenominator":{"type":"string","pattern":"^[1-9][0-9]*$"},"weightedPayoutNumerator":{"type":"string","pattern":"^\\d+$"},"maximumPayoutNumerator":{"type":"string","pattern":"^\\d+$"}},"required":["name","costX100","books","lookupRows","totalWeight","rtp","hitProbability","atLeastStakeProbability","profitProbability","maximumPayoutProbability","returnBands","payoutDenominator","weightedPayoutNumerator","maximumPayoutNumerator"]}]}},"required":["costX100","weightTotal","rows","weightsSha256","eventsSha256","metrics"]}}},"required":["scheme","serverSeedHash","gameVersion","setId","verifier","mathVerifier","modes"]},{"type":"object","properties":{"scheme":{"type":"string","enum":["munja-live-v1"]},"serverSeedHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"gameVersion":{"type":"integer","exclusiveMinimum":0},"verifier":{"type":"string","enum":["/live/proof"]}},"required":["scheme","serverSeedHash","gameVersion","verifier"]},{"type":"object","properties":{"scheme":{"type":"string","enum":["munja-table-v1"]},"tableId":{"type":"string","format":"uuid"},"serverSeedHash":{"type":"string","pattern":"^[0-9a-f]{64}$"},"gameVersion":{"type":"number","enum":[2]},"verifier":{"type":"string","enum":["/live/proof"]}},"required":["scheme","tableId","serverSeedHash","gameVersion","verifier"]}],"description":"The epoch commitment and exact maths artefact digests, available before the game loads."},"launch":{"type":"string","description":"Query parameters for the game bundle (ADR-0006 launch shape)."}},"required":["sessionID","fairness","launch"]}}}},"400":{"description":"Invalid request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"detail":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or unknown API key."},"402":{"description":"The operator's invoice is unpaid seven days past due, or its plan has ended. Only minting is refused: running sessions keep playing.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"detail":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Unknown or disabled game.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"detail":{"type":"string"}},"required":["error"]}}}}},"tags":["Operator API"]}},"/wallet-receiver/authenticate":{"post":{"summary":"Validate a session, return the player","description":"Signed by munja: `x-munja-timestamp` (ms since epoch) and `x-munja-signature` = hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`)). Verify over the raw body bytes before parsing; refuse timestamps outside ±5 minutes. Replay inside the window is answered by roundId idempotency.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","description":"The operator session token from minting."}},"required":["token"],"additionalProperties":false}}}},"responses":{"200":{"description":"The session is valid.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"settlementCapabilities":{"type":"array","items":{"type":"string","const":"rational-payout-v1"}},"token":{"type":"string"},"playerRef":{"type":"string"},"gameId":{"type":"string"},"balance":{"type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["amount","currency"],"additionalProperties":false},"clientSeed":{"type":"string"},"display":{"description":"Bet levels for display only — munja never enforces them (ADR-0001).","type":"object","properties":{"betLevels":{"type":"array","items":{"type":"number"}},"defaultBetLevel":{"type":"number"},"minBet":{"type":"number"},"maxBet":{"type":"number"},"stepBet":{"type":"number"}},"required":["betLevels","defaultBetLevel","minBet","maxBet","stepBet"],"additionalProperties":false}},"required":["token","playerRef","gameId","balance","clientSeed"],"additionalProperties":false}}}},"default":{"description":"Refusal with a wallet StatusCode.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","description":"A wallet StatusCode, e.g. ERR_IPB, ERR_BNF, ERR_GE."},"message":{"type":"string"}},"required":["code"],"additionalProperties":false}}}}},"tags":["Wallet API"]}},"/wallet-receiver/debit":{"post":{"summary":"Take the stake (idempotent per roundId)","description":"Signed by munja: `x-munja-timestamp` (ms since epoch) and `x-munja-signature` = hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`)). Verify over the raw body bytes before parsing; refuse timestamps outside ±5 minutes. Replay inside the window is answered by roundId idempotency.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"},"roundId":{"type":"string","description":"Idempotency key for every settlement call of this round."},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Wire micro-units: 1_000_000 = one unit."},"currency":{"type":"string"}},"required":["token","roundId","amount","currency"],"additionalProperties":false}}}},"responses":{"200":{"description":"The balance after the debit (or after the earlier identical one).","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["amount","currency"],"additionalProperties":false}}}},"default":{"description":"Refusal — ERR_IPB for insufficient funds.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","description":"A wallet StatusCode, e.g. ERR_IPB, ERR_BNF, ERR_GE."},"message":{"type":"string"}},"required":["code"],"additionalProperties":false}}}}},"tags":["Wallet API"]}},"/wallet-receiver/credit":{"post":{"summary":"Pay the win (idempotent per roundId)","description":"Signed by munja: `x-munja-timestamp` (ms since epoch) and `x-munja-signature` = hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`)). Verify over the raw body bytes before parsing; refuse timestamps outside ±5 minutes. Replay inside the window is answered by roundId idempotency. The operator computes payout = debited × payoutMultiplier / costX100, floored. Credit for an unknown roundId is ERR_BNF; credit after rollback is ERR_GE.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"},"roundId":{"type":"string"},"payoutMultiplier":{"type":"string","description":"Integer hundredths of the BASE stake, as a decimal string."},"costX100":{"type":"string","description":"Mode cost in hundredths. payout = debited × payoutMultiplier / costX100, floored."}},"required":["token","roundId","payoutMultiplier","costX100"],"additionalProperties":false}}}},"responses":{"200":{"description":"The payout and the balance after it.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"payout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"balance":{"type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["amount","currency"],"additionalProperties":false}},"required":["payout","balance"],"additionalProperties":false}}}},"default":{"description":"Refusal with a wallet StatusCode.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","description":"A wallet StatusCode, e.g. ERR_IPB, ERR_BNF, ERR_GE."},"message":{"type":"string"}},"required":["code"],"additionalProperties":false}}}}},"tags":["Wallet API"]}},"/wallet-receiver/credit-rational":{"post":{"summary":"Settle exact rational payout terms","description":"Signed by munja: `x-munja-timestamp` (ms since epoch) and `x-munja-signature` = hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`)). Verify over the raw body bytes before parsing; refuse timestamps outside ±5 minutes. Replay inside the window is answered by roundId idempotency. Requires rational-payout-v1 capability before debit. Compute floor(debited × payoutMultiplier × 100 / (costX100 × payoutDenominator)) at the existing wire-unit boundary. Persist exact terms with the credit; changed terms are refused even if the rounded payout is equal. Never fall back to /credit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"},"roundId":{"type":"string"},"payoutMultiplier":{"type":"string","description":"Integer hundredths of the BASE stake, as a decimal string."},"costX100":{"type":"string","description":"Mode cost in hundredths. payout = debited × payoutMultiplier / costX100, floored."},"payoutDenominator":{"type":"string","pattern":"^[1-9][0-9]*$"}},"required":["token","roundId","payoutMultiplier","costX100","payoutDenominator"],"additionalProperties":false}}}},"responses":{"200":{"description":"The original payout and balance.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"payout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"balance":{"type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["amount","currency"],"additionalProperties":false}},"required":["payout","balance"],"additionalProperties":false}}}},"default":{"description":"Refusal with a wallet StatusCode.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","description":"A wallet StatusCode, e.g. ERR_IPB, ERR_BNF, ERR_GE."},"message":{"type":"string"}},"required":["code"],"additionalProperties":false}}}}},"tags":["Wallet API"]}},"/wallet-receiver/rollback":{"post":{"summary":"Refund a debit that never became a round","description":"Signed by munja: `x-munja-timestamp` (ms since epoch) and `x-munja-signature` = hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`)). Verify over the raw body bytes before parsing; refuse timestamps outside ±5 minutes. Replay inside the window is answered by roundId idempotency. ERR_BNF when the debit never landed — munja's crash reconciliation depends on exactly that answer. Refused after credit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"},"roundId":{"type":"string"}},"required":["token","roundId"],"additionalProperties":false}}}},"responses":{"200":{"description":"The balance after the refund (idempotent).","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string"}},"required":["amount","currency"],"additionalProperties":false}}}},"default":{"description":"Refusal with a wallet StatusCode.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","description":"A wallet StatusCode, e.g. ERR_IPB, ERR_BNF, ERR_GE."},"message":{"type":"string"}},"required":["code"],"additionalProperties":false}}}}},"tags":["Wallet API"]}}},"webhooks":{},"servers":[{"url":"https://gm.ghostagg.com","description":"ghostagg game server"}],"tags":[{"name":"Operator API","description":"You call these from your server with your API key."},{"name":"Wallet API","description":"Your server implements these under your wallet base URL; ghostagg calls them, signed with x-munja-timestamp and x-munja-signature."}]}