NoxPay Geliştirici Belgeleri

Oyuncularınıza kalıcı kripto yatırım adresleri verin, gelen her ödemeyi zincirde kesinleştikten sonra TL olarak hesaplarına yazın, çekimleri kendi havuzunuzdan otomatik ödeyin.

Genel bakış

NoxPay, sizin sunucunuzda çalışan ve sadece size ait olan bir kripto ödeme sistemidir. Cüzdan anahtarları ve paranız sizde kalır; platformunuz NoxPay ile imzalı bir HTTP API üzerinden konuşur.

Kalıcı adresHer oyuncuya her ağda bir kez adres üretilir, hep aynı adres döner; başka oyuncuya asla verilmez.
Kesinleşince TLYatırım sadece zincirde kesinleşmiş blokta sayılır ve o anki kurla TL'ye çevrilip bildirilir.
Otomatik çekimOnaylanan çekim havuzdan ödenir; ağ ücreti oyuncudan kesilmez.
Çoklu siteTek bağlantıyla birden çok site; her istekte site kodu, panelde site site rapor.

Desteklenen ağlar

AğCoinlerNot
TRONUSDT (TRC20), TRXİkisi aynı adrese gelir.
BNB Smart ChainUSDT (BEP20)0x adresi.
EthereumUSDT (ERC20), USDC (ERC20)0x adresi, BNB Chain'deki adresle aynı.

Kurulumunuzda hangi coinlerin açık olduğunu her zaman GET /v1/assets söyler; coinleri koda yazmayın.

Akış

  1. Oyuncu Para Yatır → Kripto'yu açar. Platformunuz NoxPay'den oyuncunun adresini ister ve adresi karekoduyla gösterir.
  2. Oyuncu coin gönderir. NoxPay kesinleşmiş bloğu görür, tutarı o anki kurla TL'ye çevirir.
  3. NoxPay platformunuza imzalı deposit.credited bildirimi gönderir.
  4. Platformunuz imzayı doğrular, kaydı NoxPay'den teyit eder ve oyuncunun bakiyesine TL tutarı bir kez yazar.
  5. Oyuncu çekim ister; platformunuz bakiyeyi düşer. Yetkiliniz onaylayınca çekimi NoxPay'e gönderir.
  6. NoxPay havuzdan öder ve withdrawal.completed bildirir (ödenemezse withdrawal.failed: iade edin).

Başlarken

Size verilenler

BilgiAçıklama
API adresiÖr. https://ornek-api.noxpay.org. Bütün istekler /v1/ altına.
API sırrıİsteklerinizi imzalamak için (en az 32 karakter).
İmza sırrı (webhook)Bizden gelen bildirimleri doğrulamak için. API sırrından farklıdır.
Yönetim paneliÖr. https://ornek-panel.noxpay.org; şifre + telefonla 2 adımlı doğrulama.
Sırlar e-postayla ya da sohbetle gönderilmez, kimseyle paylaşılmaz ve koda gömülmez. Sunucunuzun gizli ayarlarında saklayın.

Sizden istenenler

BilgiNeden
Sunucu IP adreslerinizAPI sadece bu adreslerden gelen istekleri kabul eder.
Bildirim adresi (HTTPS)Yatırım ve çekim bildirimlerinin gönderileceği tam adres, ör. https://api.siteniz.com/payment/callback?provider=noxpay.
Site kodlarıBirden çok siteniz varsa her birine kısa bir kod (bkz. Çoklu site).

Ortamlar

Önce test ağında (gerçek para yok) uçtan uca denenir, sonra canlıya geçilir. Her cevaptaki chain alanı ortamı söyler: "nile" test ağı, "mainnet" canlı. Test ağında oyuncu ekranında mutlaka TEST AĞI uyarısı gösterin.

Biçim kuralları

İstek imzası

Platformunuzdan NoxPay'e giden her istek üç başlık taşır:

BaşlıkDeğer
X-NoxPay-TimestampUnix saniye. Sunucu saatimizden en çok ±60 sn farklı olabilir.
X-NoxPay-Nonce16–64 karakter [A-Za-z0-9_-], her istekte yeni. Aynı değer ikinci kez kullanılırsa 401.
X-NoxPay-Signaturehex(HMAC-SHA256(API_SIRRI, canonical))
canonical = timestamp + "\n" + nonce + "\n" + METHOD + "\n" + request_uri + "\n" + hex(sha256(gövde))

request_uri: yol + varsa ? ve sorgu, gönderildiği haliyle (ör. /v1/deposits?player_ref=123&site=kralbet). Gövdesiz istekte gövde boş metindir: sha256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.

Test vektörü

secret    = test-api-secret-0123456789abcdef0123
timestamp = 1791500000
nonce     = 0123456789abcdef0123456789abcdef
istek     = GET /v1/deposits/dep_0123456789abcdef01234567
signature = 1948cf767d5f3c75e98dfe3ff3e503c170e444095e9f5bf9fc1276d82af6f116

Node.js

import { createHash, createHmac, randomBytes } from 'crypto';

export function noxpayHeaders(secret, method, requestUri, body = '') {
  const ts = Math.floor(Date.now() / 1000).toString();
  const nonce = randomBytes(16).toString('hex');
  const bodyHash = createHash('sha256').update(body).digest('hex');
  const canonical = [ts, nonce, method, requestUri, bodyHash].join('\n');
  return {
    'X-NoxPay-Timestamp': ts,
    'X-NoxPay-Nonce': nonce,
    'X-NoxPay-Signature': createHmac('sha256', secret).update(canonical).digest('hex'),
  };
}

PHP

function noxpay_headers(string $secret, string $method, string $requestUri, string $body = ''): array {
    $ts = (string) time();
    $nonce = bin2hex(random_bytes(16));
    $canonical = implode("\n", [$ts, $nonce, $method, $requestUri, hash('sha256', $body)]);
    return [
        'X-NoxPay-Timestamp: ' . $ts,
        'X-NoxPay-Nonce: ' . $nonce,
        'X-NoxPay-Signature: ' . hash_hmac('sha256', $canonical, $secret),
    ];
}

İmza tutmazsa 401 {"error":"unauthorized"}, izinli olmayan IP'den gelirse 403 {"error":"forbidden"}. Hata cevapları bilerek ayrıntı vermez.

Coin listesi

GET/v1/assets

Kurulumunuzda çalışan coinler ve her birinin yatırıma/çekime açık olup olmadığı. Para Yatır ve Para Çek ekranlarındaki seçenekleri buradan üretin; yönetim panelinde bir coin açılıp kapatılınca platformunuzda yeni sürüm gerekmez.

{"chain":"mainnet","assets":[
  {"code":"USDT","symbol":"USDT","network":"TRON","network_label":"TRC20","decimals":6,"deposit":true,"withdraw":true},
  {"code":"USDT_BSC","symbol":"USDT","network":"BSC","network_label":"BEP20","decimals":6,"deposit":true,"withdraw":true},
  {"code":"TRX","symbol":"TRX","network":"TRON","network_label":"TRON","decimals":6,"deposit":true,"withdraw":true}]}
AlanAnlamı
codeBildirimlerde ve isteklerde geçen asset değeri.
networkAdres isteğindeki ?network= değeri (TRON, BSC, ETH).
network_labelOyuncuya gösterilecek ağ adı (TRC20, BEP20, ERC20).
decimalsamount alanlarının ondalık sayısı.
deposit / withdrawfalse ise o ekranda gösterme. Liste sırası ekran sırasıdır.

Yatırım

Oyuncu adresi

GET/v1/players/{player_ref}/address?network=TRON&site=kralbet

network verilmezse TRON. site sadece çok siteli platformlarda (bkz. Çoklu site). İlk istekte adres üretilir, sonra her istekte aynısı döner.

{"address":"TWrAmidsrgkVTyDxXuGZjaRc77DiR3jh6K","network":"TRON","chain":"mainnet","assets":["USDT","TRX"],"site":"kralbet"}

Kurlar

GET/v1/rates

Sadece ekranda "tahmini kur" göstermek için. Yatırım, zincirde kesinleştiği andaki kurla yazılır.

{"USDT_TRY":"49.19000000","TRX_TRY":"16.38500000","fetched_at":"2026-10-29T21:24:26Z","min_deposit_try":"500.00","estimate":true}

Kur alınamıyorsa 503 {"error":"rates_unavailable"}: kur alanını gizleyin, adresi yine gösterin.

Yatırım teyidi

GET/v1/deposits/{deposit_id}
{"deposit_id":"dep_f3fe5b9c24410637dc9063de","site":"kralbet","player_ref":"123","asset":"USDT","amount":"25.000000",
 "txid":"eb6bdbb9522e866176c024b3cfd2d55a958e2ba3c6a4ada7cb31beceda25af0b","from_address":"TM3JF…",
 "block_time":"2026-10-29T21:25:12Z","status":"credited","rate_try":"49.19000000","amount_try":"1229.75",
 "credited_at":"2026-10-29T21:25:51Z","chain":"mainnet"}

rate_try, amount_try ve credited_at sadece status = "credited" iken gelir. Bulunamazsa 404 {"error":"not_found"}.

Yatırım geçmişi

GET/v1/deposits?player_ref=123&site=kralbet&since=2026-10-01T00:00:00Z&limit=50

Oyuncunun kripto yatırımları, eskiden yeniye: {"deposits":[…]}. limit 1–200 (varsayılan 50).

DurumAnlamı
creditedYazıldı, bildirim gönderildi.
confirmedZincirde kesinleşti, işleniyor.
below_minEn az yatırım tutarının altında; bekletilir. Aynı adrese sonraki gönderimlerle toplam alt sınırı geçince hepsi birlikte yazılır.
reviewİncelemede (ör. tek yatırım üst sınırının üstünde); yönetim panelinden onaylanır.
ignoredSayılmadı (toz miktar ya da iç transfer).

Bildirimler

NoxPay, bildirim adresinize POST ile JSON gönderir. Bildirimler en az bir kez teslim edilir: aynı bildirim birden çok gelebilir.

POST <bildirim adresiniz>
Content-Type: application/json
X-NoxPay-Event: deposit.credited
X-NoxPay-Delivery: 1842
X-NoxPay-Timestamp: 1791500000
X-NoxPay-Signature: hex(HMAC-SHA256(IMZA_SIRRI, timestamp + "." + ham_gövde))

{"event":"deposit.credited","deposit_id":"dep_f3fe5b9c24410637dc9063de","site":"kralbet","player_ref":"123",
 "asset":"USDT","amount":"25.000000","txid":"eb6bdbb9…","rate_try":"49.19000000",
 "amount_try":"1229.75","credited_at":"2026-10-29T21:25:51Z"}

İmza doğrulama

İmza ham gövde üzerinden doğrulanır; JSON'u ayrıştırıp yeniden üretilmiş gövdeyle değil (Express/NestJS'te ham gövdeyi saklayın, PHP'de php://input).

secret    = test-webhook-secret-0123456789abcdef
timestamp = 1791500000
body      = {"event":"deposit.credited","deposit_id":"dep_0123456789abcdef01234567","amount_try":"5174.99"}
signature = d46bd41a19efa7ae09cf3d9857dcfc6526dae12e9af9318431640df2055dc01b

Node.js

import { createHmac, timingSafeEqual } from 'crypto';

export function verifyNoxPay(secret, ts, sig, rawBody /* Buffer */) {
  const age = Math.abs(Date.now() / 1000 - Number(ts));
  if (!Number.isFinite(age) || age > 300) return false;            // ±5 dakika
  const want = createHmac('sha256', secret).update(`${ts}.`).update(rawBody).digest('hex');
  const a = Buffer.from(want), b = Buffer.from(String(sig).toLowerCase());
  return a.length === b.length && timingSafeEqual(a, b);
}

PHP

function noxpay_verify(string $secret, string $ts, string $sig, string $rawBody): bool {
    if (!ctype_digit($ts) || abs(time() - (int) $ts) > 300) {
        return false;                                                  // ±5 dakika
    }
    $want = hash_hmac('sha256', $ts . '.' . $rawBody, $secret);
    return hash_equals($want, strtolower($sig));
}

$raw = file_get_contents('php://input');
$ok  = noxpay_verify(IMZA_SIRRI, $_SERVER['HTTP_X_NOXPAY_TIMESTAMP'] ?? '', $_SERVER['HTTP_X_NOXPAY_SIGNATURE'] ?? '', $raw);

İşleme sırası (zorunlu)

  1. İmzayı ve zamanı doğrula. Tutmazsa 401 dön, hiçbir şey yazma.
  2. Olayı tanı: deposit.credited, withdrawal.completed ya da withdrawal.failed. Başka bir şeyse 400.
  3. Teyit al: yatırımda GET /v1/deposits/{deposit_id}, çekimde GET /v1/withdrawals/{withdrawal_id}. Durum ve alanlar (site, player_ref, asset, amount, txid, amount_try) bildirimle birebir aynı olmalı. Değilse 400, yazma. Bildirimdeki tutara tek başına güvenmeyin.
  4. Tek seferlik yaz: yatırımı deposit_id'yi benzersiz anahtar yaparak tek işlemde kaydedin ve bakiyeye amount_try ekleyin. Kayıt zaten varsa hiçbir şey yazmayın.
  5. Yazıldıysa ya da zaten yazılmışsa 200 dön. 15 saniye içinde cevap verin.
2xx dışındaki her cevapta NoxPay bildirimi 1, 2, 5, 15 ve 60 dakika sonra, ardından saatte bir yeniden gönderir. Teslim edilemeyen bildirim yönetim panelinde görünür ve elle yeniden gönderilebilir.

Çekim

Temel kurallar

  1. Bakiye önce düşer. Oyuncu çekim istediğinde bakiyeyi siz düşersiniz; NoxPay'e ancak yetkiliniz onaylayınca gönderirsiniz.
  2. Bir çekim bir kez ödenir. Anahtar sizin çekim kimliğinizdir (withdrawal_id). Aynı kimlikle gelen her istek aynı kaydı döndürür; ikinci ödeme açılmaz.
  3. İade yalnızca kesin "gönderilmedi" ile: POST 422 döndüyse ya da durum failed ise. Zaman aşımı, bağlantı hatası, 5xx ve okunamayan cevap belirsizdir: iade etmeyin, aynı istekle tekrar deneyin.
  4. NoxPay failed dedikten sonra asla göndermez; completed dedikten sonra asla failed demez.

Çekim oluştur

POST/v1/withdrawals
{"withdrawal_id":"wd_8842","site":"kralbet","player_ref":"123","asset":"USDT",
 "address":"TJNHaHSDCFZREa7Mx73iNHbfriQz3BfPhw","amount_try":"1250.00"}
AlanKural
withdrawal_idÇekim kimliğiniz, 1–64 karakter [A-Za-z0-9_-]. Bütün sitelerinizde benzersiz ve değişmez.
siteİsteğe bağlı; çok siteli platformda oyuncunun sitesi.
player_refYatırımdaki oyuncu kimliği.
assetGET /v1/assets listesinde withdraw: true olan bir kod.
addressOyuncunun adresi: TRON için T… (34 karakter), EVM için 0x + 40 hex (karışık harfte EIP-55 sağlaması doğru olmalı).
amount_tryÖdenecek TL tutar, nokta ondalıklı, en çok 2 hane ("1250.00").
CevapAnlamıNe yapmalı
201 / 200Yeni kayıt / aynı istek tekrar geldi. Kur ve coin miktarı ilk kabulde sabitlenir.Durumu izle.
409 withdrawal_id_reusedAynı kimlik farklı içerikle geldi.Programlama hatası; iade etme, incele.
422 <kod>Kesin ret, kayıt açılmadı.İade et.
503 try_laterŞu an kabul edilemiyor (rates_unavailable, payouts_paused), kayıt açılmadı.Onay bekliyor'da bırak, sonra tekrar gönder.
DiğerBelirsiz.İade etme, aynı istekle tekrar dene.

Durum ve çekim nesnesi

GET/v1/withdrawals/{withdrawal_id}
{"withdrawal_id":"wd_8842","site":"kralbet","player_ref":"123","asset":"USDT","address":"TJNHaHSDCFZREa7Mx73iNHbfriQz3BfPhw",
 "amount_try":"1250.00","rate_try":"49.18000000","amount":"25.416836","status":"completed","status_reason":null,
 "txid":"a66b073a4afed3e297484a1e6790dc4b6c6cf3d288d3ff8766559176c6bf7995","created_at":"2026-10-29T10:00:00Z",
 "completed_at":"2026-10-29T10:00:41Z","chain":"mainnet"}

404 not_found tek başına iade sebebi değildir: aynı POST'u tekrar gönderin.

DurumAnlamıNe yapmalı
acceptedKabul edildi, sırada.Bekle.
awaiting_approvalTek ya da günlük otomatik ödeme sınırının üstünde; yönetim panelinde onay bekliyor.Bekle.
waiting_fundsHavuzda yeterli coin yok ya da havuzdaki diğer coinden çevriliyor; para gelince kendiliğinden ödenir.Bekle.
sendingİşlem gönderildi, zincirde kesinleşmesi bekleniyor.Bekle.
completedÖdendi; txid dolu.Tamamla.
failedHiçbir coin gönderilmedi ve gönderilmeyecek (status_reason: rejected_by_operator, cancelled_by_operator).İade et.

amount oyuncuya gidecek coin miktarıdır (aşağı yuvarlanır). Ağ ücreti oyuncudan kesilmez.

Çekim bildirimleri

Yatırım bildirimiyle aynı adres ve imza. Bildirime göre doğrudan para hareketi yapmayın: önce GET /v1/withdrawals/{id} ile teyit edin. Bildirim kaçsa bile birkaç dakikada bir durum sorgusu aynı sonuca ulaştırır.

{"event":"withdrawal.completed","withdrawal_id":"wd_8842","site":"kralbet","player_ref":"123","asset":"USDT",
 "address":"TJNH…","amount":"25.416836","rate_try":"49.18000000","amount_try":"1250.00","txid":"a66b…","completed_at":"2026-10-29T10:00:41Z"}

{"event":"withdrawal.failed","withdrawal_id":"wd_8843","site":"kralbet","player_ref":"456","asset":"TRX",
 "amount_try":"800.00","reason":"cancelled_by_operator","failed_at":"2026-10-29T11:12:00Z"}

Çoklu site

Birden çok siteyi tek yazılımdan yönetiyorsanız hepsi NoxPay'e tek bağlantıyla bağlanır (aynı sırlar, aynı IP listesi, aynı bildirim adresi). Her istek hangi site için olduğunu site ile söyler; yönetim panelinde yatırım ve çekimler site site görülür.

İsteksite nerede
GET /v1/players/{ref}/addressSorguda: ?network=TRON&site=kralbet
GET /v1/depositsSorguda: ?player_ref=123&site=kralbet
POST /v1/withdrawalsGövdede: "site":"kralbet"

İmza kuralı değişmez: site sorgudaysa request_uri'nin, gövdedeyse gövde özetinin parçasıdır. Geçersiz kod: adres ve geçmiş isteklerinde 400, çekimde 422 — ikisi de {"error":"invalid_site"}.

Hata kodları

HTTPKodNeredeAnlamı
401unauthorizedHepsiİmza, zaman ya da nonce geçersiz.
403forbiddenHepsiIP izinli değil.
400invalid_player_refAdres, geçmişOyuncu kimliği biçimi geçersiz.
400invalid_networkAdresBilinmeyen ağ.
400invalid_siteAdres, geçmişSite kodu geçersiz.
400invalid_since, invalid_limitGeçmişSorgu değeri geçersiz.
422network_unavailableAdresO ağda yatırıma açık coin yok.
404not_foundTeyit, durumKayıt yok.
503rates_unavailableKurlarGüncel kur alınamadı.
409withdrawal_id_reusedÇekimAynı kimlik farklı içerikle.
422invalid_withdrawal_id, invalid_player_ref, invalid_site, invalid_requestÇekimAlan biçimi geçersiz ya da bilinmeyen alan.
422invalid_asset, asset_unavailableÇekimCoin yok / bu coinle çekim kapalı.
422invalid_address, own_addressÇekimAdres o ağa ait değil / sistemin kendi adresi.
422invalid_amount, below_minimumÇekimTutar geçersiz / en az çekim tutarının altında.
503try_laterÇekimreason: rates_unavailable ya da payouts_paused; kayıt açılmadı.
500internalHepsiBeklenmeyen hata; aynı istekle tekrar deneyin.

Ekran önerileri

Canlıya geçiş listesi

Hepsi önce test ağında geçmeli:

Yönetim paneli

Kurulumunuzla birlikte size özel, kendi adınız ve logonuzla bir yönetim paneli gelir. Giriş şifre + telefondaki doğrulama koduyla yapılır; kullanıcı ekleme, roller ve yapılan her işlemin kaydı paneldedir.

Ana sayfaHavuz ve soğuk cüzdan bakiyeleri, bugünkü yatırım ve çekim, acil durdurma anahtarları.
Yatırımlar · ÇekimlerHer kayıt, durumu, zincir bağlantısı; site ve coin süzgeci; onay bekleyen çekimler.
SitelerSite site oyuncu sayısı, bugün ve bu ay yatırım/çekim.
AyarlarCoinleri aç/kapa, havuzdan soğuk cüzdana gönder, sınırlar.