POST /launch
Your backend calls Moonshot with a signed request.
{
"idempotencyKey": "f64382a3-f550-46f0-9a06-14dfbf87c700",
"sessionId": "partner-session-123",
"playerId": "fd63c560-f443-49b5-a721-c40c0e06b7be",
"gameSlug": "rusty-ring",
"operatorSlug": "your-partner-slug",
"currency": "SOL",
"balance": "10.000000",
"userAgent": "Mozilla/5.0",
"ip": "203.0.113.10",
"country": "UA",
"language": "en"
}
All shown fields are required. idempotencyKey and playerId are UUIDs.
sessionId is your nonempty session reference (maximum 256 characters); callbacks
return it unchanged. balance is a decimal string snapshot, not authority to debit.
Optional status and nickname are strings. Currency precision and game limits are
configured by Moonshot; do not send securityCode, decimals, or limits.
A signed HTTP 200 response has this envelope:
{
"data": {
"operatorSlug": "your-partner-slug",
"idempotencyKey": "f64382a3-f550-46f0-9a06-14dfbf87c700",
"operatorId": "8e563380-2a27-41b1-8be5-2cdd7d1ec271",
"url": "https://games.example/launch-token"
}
}
operatorId belongs to Moonshot's operator registry. It is informational;
authenticate the agreed operatorSlug using its HMAC secret instead of comparing
operatorId with your own database ID. No extra ID registration is needed. Verify the signature,
echoed slug and idempotency key, and allowed URL origin before embedding data.url.
The URL is sensitive. A reload creates a new launch with a fresh key and session.
Do not infer a successful launch from a timeout; create a fresh launch after reconciling
the failed attempt. There is no launch-status endpoint.
idempotencyKey is currently an authenticated correlation key, not a durable
launch replay guarantee. Resending it can create another session. Do not add
automatic retry middleware around /launch. Create a fresh partner session and
key for a new attempt and discard any unused earlier URL.
Errors
Authenticated invalid fields return signed HTTP 400 with error.code: "VALIDATION_FAILED".
A downstream launch failure returns signed HTTP 503 with
error.code: "PROVIDER_UNAVAILABLE". Authentication failures can be unsigned HTTP
401. Verify responses before trusting error messages; an unsigned response is not
evidence of a completed launch.
The quickstart includes a direct request example and a complete server-side Node.js function for signing the launch and verifying the response. Implement the same HTTP contract in your backend's language and framework.