Skip to main content

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.