Create a website
Owner creates the website, assigns Night Market, and issues its own Key ID and secret in Backoffice.
Connect your website to NewWorld. Discover assigned games, launch players securely, and reconcile activity through a single provider API.
This release does not accept real money. Transfer In / Out is available for sandbox credits. Real-money operation is not enabled. Night Market is the only playable game shipped; other games require a compatible service and explicit assignment.
https://api.nw0007.com/provider/v1API credentials are issued privately per website.
Owner creates the website, assigns Night Market, and issues its own Key ID and secret in Backoffice.
Use your website credentials to request the catalog and a game launch URL. Never expose the secret to players.
Redirect the authenticated player, then query balance, round history and GGR using the same integration.
Open partner sandbox → Transfer In → Play → browser Back → Transfer Out → Reconcile. It uses a signed browser identity and test funds, not production customer authentication. New game wallets start at zero; the example website starts with 1,000 DEMO credits.
All provider operations use POST and a JSON object. Send these four headers from the website backend.
| Header | Value |
| X-NW-Key-Id | Website key ID issued by NewWorld |
| X-NW-Timestamp | 13-digit Unix timestamp in milliseconds; ±30 seconds |
| X-NW-Nonce | Unique UUID per request; 16–100 allowed characters |
| X-NW-Signature | HMAC-SHA256 signature, lowercase hexadecimal |
Join these five lines with LF characters. No trailing newline. Use the exact UTF-8 secret string as the HMAC key; do not hex-decode or base64-decode it.
POST
/provider/v1/games
<TIMESTAMP_MILLISECONDS>
<UNIQUE_NONCE>
<EXACT_RAW_JSON_BODY>The final line is the raw JSON body, not its SHA-256 hash. These rules are specific to NewWorld; other providers' signatures are not interchangeable.
A replayed authentication nonce is rejected with HTTP 409. A new API attempt needs a fresh nonce and timestamp. Gameplay retries must retain the same round ID to prevent duplicate settlement.
Website scope is derived from the key. Disabled websites, revoked keys and unauthorized game assignments are rejected. Key revocation also invalidates bound sessions and unused launch tickets.
Credentials below are environment variables, never actual keys. These examples request the game catalog.
import { createHmac, randomUUID } from 'node:crypto';
const base = process.env.NW_BASE_URL || 'https://api.nw0007.com';
const path = '/provider/v1/games';
const raw = JSON.stringify({});
const timestamp = String(Date.now());
const nonce = randomUUID();
const canonical = ['POST', path, timestamp, nonce, raw].join('\n');
const signature = createHmac('sha256', process.env.NW_SECRET)
.update(canonical).digest('hex');
const response = await fetch(base + path, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-NW-Key-Id': process.env.NW_KEY_ID,
'X-NW-Timestamp': timestamp,
'X-NW-Nonce': nonce,
'X-NW-Signature': signature
},
body: raw,
signal: AbortSignal.timeout(10000)
});
const result = await response.json();
if (!response.ok) throw new Error(result.error);
console.log(result);<?php
$base = getenv('NW_BASE_URL') ?: 'https://api.nw0007.com';
$path = '/provider/v1/games';
$raw = '{}';
$timestamp = (string)(int)floor(microtime(true) * 1000);
$nonce = bin2hex(random_bytes(16));
$canonical = implode("\n", ['POST', $path, $timestamp, $nonce, $raw]);
$signature = hash_hmac('sha256', $canonical, getenv('NW_SECRET'));
$ch = curl_init($base . $path);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $raw,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-NW-Key-Id: ' . getenv('NW_KEY_ID'),
'X-NW-Timestamp: ' . $timestamp,
'X-NW-Nonce: ' . $nonce,
'X-NW-Signature: ' . $signature
]
]);
$result = curl_exec($ch);
if ($result === false) throw new Exception(curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) throw new Exception($result);
echo $result;import os, time, uuid, hmac, hashlib, json
import urllib.request
base = os.getenv('NW_BASE_URL', 'https://api.nw0007.com')
path = '/provider/v1/games'
raw = json.dumps({}, separators=(',', ':'))
timestamp = str(time.time_ns() // 1_000_000)
nonce = str(uuid.uuid4())
canonical = '\n'.join(['POST', path, timestamp, nonce, raw])
signature = hmac.new(os.environ['NW_SECRET'].encode(),
canonical.encode(), hashlib.sha256).hexdigest()
request = urllib.request.Request(base + path,
data=raw.encode(), method='POST', headers={
'Content-Type': 'application/json',
'X-NW-Key-Id': os.environ['NW_KEY_ID'],
'X-NW-Timestamp': timestamp,
'X-NW-Nonce': nonce,
'X-NW-Signature': signature
})
with urllib.request.urlopen(request, timeout=10) as response:
print(json.load(response))/provider/v1/gamesList enabled games assigned to your website. Refresh this catalog when loading your lobby; new assigned games use the same credentials.
| Field | Contract |
| Body | Empty JSON object |
| games | Only enabled and assigned entries |
| gameId | Pass this exact ID to launch |
{}Illustrative data — not live account activity.
{
"currency": "DEMO",
"games": [
{
"gameId": "night-market",
"name": "Night Market Festival",
"version": "0.8.9-engine-1"
}
]
}/provider/v1/launchAuthenticate the player on your website first. Request a short-lived URL and redirect that player to it. Generating a link does not start a round or debit a wallet.
| Field | Contract |
| gameId | Required assigned game ID |
| playerId | Required; 1–80 letters, digits, underscore or hyphen |
| currency | Required; DEMO only |
| launchUrl | One-use credential; expires in 120 seconds. Do not log/share. |
| return_url | Not supported in this release |
{
"gameId": "night-market",
"playerId": "player123",
"currency": "DEMO"
}Illustrative data — not live account activity.
{
"gameId": "night-market",
"launchUrl": "https://api.nw0007.com/game#launch=<ONE_TIME_TICKET>",
"expiresIn": 120,
"currency": "DEMO"
}/provider/v1/balanceRead the shared NewWorld game wallet for a player belonging to your website. The player must first enter a game. A missing player returns 404, not a zero balance.
| Field | Contract |
| playerId | Required external player ID |
| balanceMinor | Integer minor units; 100 = 1 DEMO credit |
{
"playerId": "player123"
}Illustrative data — not live account activity.
{
"playerId": "player123",
"currency": "DEMO",
"balanceMinor": 98000
}/provider/v1/roundsQuery settled rounds for your website. Free-spin winnings are included. Pending rounds and wallet transfers are not reported as settled bets.
| Field | Contract |
| playerId / gameId | Optional filters; scope always limited to your website |
| from / to | Optional UTC ISO milliseconds; from inclusive, to exclusive |
| limit | Integer 1–100; default 50 |
| offset | Nonnegative integer; default 0 |
| Pagination | Offset-based; new live rows can shift later pages |
| Undated legacy rows | Included without dates; excluded when date filters are used |
{
"playerId": "player123",
"gameId": "night-market",
"from": "2026-11-15T00:00:00.000Z",
"to": "2026-11-16T00:00:00.000Z",
"limit": 50,
"offset": 0
}Illustrative data — not live account activity.
{
"currency": "DEMO",
"limit": 50,
"offset": 0,
"total": 1,
"rows": [
{
"playerId": "player123",
"gameId": "night-market",
"roundId": "round-001",
"debitMinor": 2000,
"creditMinor": 0,
"balanceMinor": 98000,
"profile": "night-market-v08-20lines",
"createdAt": "2026-11-15T01:00:00.000Z"
}
]
}/provider/v1/summaryAggregate settled gameplay for your website, optionally filtered by player, game and UTC period. GGR is not net profit after commissions or costs.
| Field | Contract |
| Filters | playerId, gameId, from, to — all optional |
| ggrMinor | wagerMinor − payoutMinor |
| observedRtp | 100 × payout / wager; null if wager is zero |
| RTP distinction | Observed results are not the configured theoretical RTP |
| History | Still reportable after a game assignment is disabled |
{
"gameId": "night-market"
}Illustrative data — not live account activity.
{
"currency": "DEMO",
"rounds": 10,
"wagerMinor": 20000,
"payoutMinor": 18000,
"ggrMinor": 2000,
"observedRtp": 90
}Errors use an HTTP status and an error message. Symbolic error-code fields are not implemented.
{"error":"Request replayed"}| Status | Meaning / action |
| 400 | Invalid JSON, field, currency, date or pagination. Fix request. |
| 401 | Missing/invalid signature, expired timestamp, or revoked key. Check auth. |
| 403 | Website disabled, cross-site claim, or game not assigned/enabled. |
| 404 | Unknown route, game or player. A player must enter a game before balance query. |
| 409 | Authentication nonce already processed. Use a fresh nonce/timestamp. |
| 413 | Request exceeds the provider request-size limit (8,192 characters). |
| 500 | Provider error. Investigate server logs without exposing secrets. |
After an uncertain game response, keep the same round identity. NewWorld preserves pending intents and game outcomes; owner recovery is available in Backoffice. Do not retry a wager using a new round ID.
POST every operation to https://api.nw0007.com/provider/v1/ with the HMAC headers described above. Money is integer minor units: 100 = 1 DEMO. No real currency is supported.
| Endpoint | JSON body |
|---|---|
| player-create | {"playerId":"alice","currency":"DEMO"} |
| transfer-in / transfer-out | {"transactionId":"your-unique-id-001","playerId":"alice","currency":"DEMO","amountMinor":20000} |
| transfer-status | {"transactionId":"your-unique-id-001"} |
| reconcile | {"playerId":"alice"} |
Player creation is idempotent and starts at zero. Transfer IDs are 8–100 letters, digits, hyphens or underscores and unique within a website. Amount must be an integer from 1 to 1,000,000,000,000 minor units. Repeating the same transaction ID and payload returns the original receipt, without moving funds twice. Changing its amount, player or direction returns 409. Use a NEW authentication nonce and timestamp on every retry, but retain the ORIGINAL transaction ID.
A receipt has transactionId, playerId, currency, direction, amountMinor, status, balanceMinor, createdAt and optional reason. Status is completed or rejected. A rejected receipt is final; inspect its reason. On timeout, keep your website reservation pending, query transfer-status, then retry the original operation. A 404 status is not proof of failure: retry with the same transaction ID. Never refund solely because a response was lost.
Reserve website funds durably before Transfer In. Finalize that debit on completed; release only on confirmed rejected. For Transfer Out, credit the website once after a completed receipt. Store your own durable transfer journal. Pending game rounds block transfers with 409; unresolved Free Spins block Transfer Out. Retry after settlement/bonus completion.
expectedMinor = openingMinor + transferInMinor − transferOutMinor − wagerMinor + payoutMinor. differenceMinor must be zero. pendingRound means settlement is still unresolved. Receipts report balance at that transfer, not the current balance; use balance/reconcile for current values.
Return to your website using browser Back in this sandbox. A configurable return_url is not implemented. Production wallet integration, operational review and real-money approval remain separate work.
An orbital NW emblem with an indigo-to-cyan palette, paired with a clear silver wordmark. Designed for dark website lobbies and developer interfaces.

Transparent PNG master. Keep the logo's proportions; use on dark backgrounds. No trademark registration or clearance is implied.