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.
Desteklenen ağlar
| Ağ | Coinler | Not |
|---|---|---|
| TRON | USDT (TRC20), TRX | İkisi aynı adrese gelir. |
| BNB Smart Chain | USDT (BEP20) | 0x adresi. |
| Ethereum | USDT (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ış
- Oyuncu Para Yatır → Kripto'yu açar. Platformunuz NoxPay'den oyuncunun adresini ister ve adresi karekoduyla gösterir.
- Oyuncu coin gönderir. NoxPay kesinleşmiş bloğu görür, tutarı o anki kurla TL'ye çevirir.
- NoxPay platformunuza imzalı
deposit.creditedbildirimi gönderir. - Platformunuz imzayı doğrular, kaydı NoxPay'den teyit eder ve oyuncunun bakiyesine TL tutarı bir kez yazar.
- Oyuncu çekim ister; platformunuz bakiyeyi düşer. Yetkiliniz onaylayınca çekimi NoxPay'e gönderir.
- NoxPay havuzdan öder ve
withdrawal.completedbildirir (ödenemezsewithdrawal.failed: iade edin).
Başlarken
Size verilenler
| Bilgi | Açı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. |
Sizden istenenler
| Bilgi | Neden |
|---|---|
| Sunucu IP adresleriniz | API 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ı
- Bütün tutarlar metin (string) olarak gelir ve gider: coin miktarı
"25.000000"(coinin ondalığı kadar), TL"1229.75"(2 ondalık), kur"49.19000000"(8 ondalık). Kayan noktalı sayıya çevirmeyin. - Saatler UTC, RFC 3339 (
2026-10-29T21:44:07Z). - Oyuncu kimliği (
player_ref): 1–64 karakter[A-Za-z0-9_-], platformunuzdaki oyuncu numarası.
İstek imzası
Platformunuzdan NoxPay'e giden her istek üç başlık taşır:
| Başlık | Değer |
|---|---|
X-NoxPay-Timestamp | Unix saniye. Sunucu saatimizden en çok ±60 sn farklı olabilir. |
X-NoxPay-Nonce | 16–64 karakter [A-Za-z0-9_-], her istekte yeni. Aynı değer ikinci kez kullanılırsa 401. |
X-NoxPay-Signature | hex(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
/v1/assetsKurulumunuzda ç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}]}
| Alan | Anlamı |
|---|---|
code | Bildirimlerde ve isteklerde geçen asset değeri. |
network | Adres isteğindeki ?network= değeri (TRON, BSC, ETH). |
network_label | Oyuncuya gösterilecek ağ adı (TRC20, BEP20, ERC20). |
decimals | amount alanlarının ondalık sayısı. |
deposit / withdraw | false ise o ekranda gösterme. Liste sırası ekran sırasıdır. |
Yatırım
Oyuncu adresi
/v1/players/{player_ref}/address?network=TRON&site=kralbetnetwork 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"}
assets: o ağda şu an yatırıma açık coinler. O ağda açık coin yoksa422 {"error":"network_unavailable"}; o ağı ekranda gösterme.- EVM ağlarında tek adres: bir oyuncunun 0x adresi BNB Chain ve Ethereum'da aynıdır. Oyuncu yanlış EVM ağından gönderse de para kaybolmaz; hangi ağdan geldiyse o ağın
assetkoduyla bildirilir. - Kapalı bir coin yine de gönderilirse para kaybolmaz: normal yatırım olarak işlenir ve bildirilir.
Kurlar
/v1/ratesSadece 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
/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
/v1/deposits?player_ref=123&site=kralbet&since=2026-10-01T00:00:00Z&limit=50Oyuncunun kripto yatırımları, eskiden yeniye: {"deposits":[…]}. limit 1–200 (varsayılan 50).
| Durum | Anlamı |
|---|---|
credited | Yazıldı, bildirim gönderildi. |
confirmed | Zincirde kesinleşti, işleniyor. |
below_min | En 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. |
ignored | Sayı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)
- İmzayı ve zamanı doğrula. Tutmazsa 401 dön, hiçbir şey yazma.
- Olayı tanı:
deposit.credited,withdrawal.completedya dawithdrawal.failed. Başka bir şeyse 400. - Teyit al: yatırımda
GET /v1/deposits/{deposit_id}, çekimdeGET /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. - Tek seferlik yaz: yatırımı
deposit_id'yi benzersiz anahtar yaparak tek işlemde kaydedin ve bakiyeyeamount_tryekleyin. Kayıt zaten varsa hiçbir şey yazmayın. - Yazıldıysa ya da zaten yazılmışsa 200 dön. 15 saniye içinde cevap verin.
Çekim
Temel kurallar
- Bakiye önce düşer. Oyuncu çekim istediğinde bakiyeyi siz düşersiniz; NoxPay'e ancak yetkiliniz onaylayınca gönderirsiniz.
- 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. - İade yalnızca kesin "gönderilmedi" ile:
POST422 döndüyse ya da durumfailedise. Zaman aşımı, bağlantı hatası, 5xx ve okunamayan cevap belirsizdir: iade etmeyin, aynı istekle tekrar deneyin. - NoxPay
faileddedikten sonra asla göndermez;completeddedikten sonra aslafaileddemez.
Çekim oluştur
/v1/withdrawals{"withdrawal_id":"wd_8842","site":"kralbet","player_ref":"123","asset":"USDT",
"address":"TJNHaHSDCFZREa7Mx73iNHbfriQz3BfPhw","amount_try":"1250.00"}
| Alan | Kural |
|---|---|
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_ref | Yatırımdaki oyuncu kimliği. |
asset | GET /v1/assets listesinde withdraw: true olan bir kod. |
address | Oyuncunun 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"). |
| Cevap | Anlamı | Ne yapmalı |
|---|---|---|
| 201 / 200 | Yeni kayıt / aynı istek tekrar geldi. Kur ve coin miktarı ilk kabulde sabitlenir. | Durumu izle. |
409 withdrawal_id_reused | Aynı 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ğer | Belirsiz. | İade etme, aynı istekle tekrar dene. |
Durum ve çekim nesnesi
/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.
| Durum | Anlamı | Ne yapmalı |
|---|---|---|
accepted | Kabul edildi, sırada. | Bekle. |
awaiting_approval | Tek ya da günlük otomatik ödeme sınırının üstünde; yönetim panelinde onay bekliyor. | Bekle. |
waiting_funds | Havuzda 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. |
failed | Hiç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.
- Site kodu: küçük harf, rakam,
-ve_; harf ya da rakamla başlar, en çok 32 karakter (^[a-z0-9][a-z0-9_-]{0,31}$), ör.kralbet,site-42. İlk kez gönderilen kod kendiliğinden tanınır; panelde görünen adını panelden verirsiniz. - Oyuncu kimliği site başınadır:
site=a+player_ref=123ilesite=b+player_ref=123iki ayrı oyuncudur ve iki ayrı adres alır. sitegöndermeyen istek ana sitedir; tek siteli kullanımda hiç göndermeyin. O zaman cevaplarda ve bildirimlerde desitealanı yer almaz.withdrawal_idbütün sitelerde benzersiz olmalı;GET /v1/deposits/{id}veGET /v1/withdrawals/{id}site istemez.
| İstek | site nerede |
|---|---|
GET /v1/players/{ref}/address | Sorguda: ?network=TRON&site=kralbet |
GET /v1/deposits | Sorguda: ?player_ref=123&site=kralbet |
POST /v1/withdrawals | Gö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ı
| HTTP | Kod | Nerede | Anlamı |
|---|---|---|---|
| 401 | unauthorized | Hepsi | İmza, zaman ya da nonce geçersiz. |
| 403 | forbidden | Hepsi | IP izinli değil. |
| 400 | invalid_player_ref | Adres, geçmiş | Oyuncu kimliği biçimi geçersiz. |
| 400 | invalid_network | Adres | Bilinmeyen ağ. |
| 400 | invalid_site | Adres, geçmiş | Site kodu geçersiz. |
| 400 | invalid_since, invalid_limit | Geçmiş | Sorgu değeri geçersiz. |
| 422 | network_unavailable | Adres | O ağda yatırıma açık coin yok. |
| 404 | not_found | Teyit, durum | Kayıt yok. |
| 503 | rates_unavailable | Kurlar | Güncel kur alınamadı. |
| 409 | withdrawal_id_reused | Çekim | Aynı kimlik farklı içerikle. |
| 422 | invalid_withdrawal_id, invalid_player_ref, invalid_site, invalid_request | Çekim | Alan biçimi geçersiz ya da bilinmeyen alan. |
| 422 | invalid_asset, asset_unavailable | Çekim | Coin yok / bu coinle çekim kapalı. |
| 422 | invalid_address, own_address | Çekim | Adres o ağa ait değil / sistemin kendi adresi. |
| 422 | invalid_amount, below_minimum | Çekim | Tutar geçersiz / en az çekim tutarının altında. |
| 503 | try_later | Çekim | reason: rates_unavailable ya da payouts_paused; kayıt açılmadı. |
| 500 | internal | Hepsi | Beklenmeyen hata; aynı istekle tekrar deneyin. |
Ekran önerileri
- Para Yatır → Kripto: ağ ve coin seçimi
GET /v1/assets'ten; adres + karekod + kopyala; tahmini kur ve en az tutarGET /v1/rates'ten. - Uyarılar: "Sadece seçtiğiniz ağdan gönderin; başka ağdan gönderilen para kaybolabilir.", "Bu adres size özeldir, başkasına vermeyin.", "En az tutarın altındaki gönderimler bekletilir; toplam en az tutarı geçince birlikte yüklenir."
- Para Çek → Kripto: ağ seçimi; adres ağa göre doğrulanır (TRON
T…, EVM0x…); oyuncunun kendi yatırım adresi reddedilir. - Kripto yatırım geçmişi
GET /v1/depositsile, durumlar Türkçe etiketlerle. - Test ağında her ekranda TEST AĞI uyarısı.
Canlıya geçiş listesi
Hepsi önce test ağında geçmeli:
- İki test vektörü (istek ve bildirim imzası) kodunuzda birebir tutuyor.
- Adres: aynı oyuncuya her istekte aynı adres; kapalı ağ ekranda gizli.
- Test yatırımı → bildirim + teyit → bakiye bir kez yazıldı; aynı bildirim ikinci kez gelince bakiye değişmedi.
- Yanlış imza ya da eski zaman damgası → 401, yazım yok.
- İmzası doğru ama tutarı kayıttan farklı bildirim → 400, yazım yok.
- Çekim: onay → ödendi →
withdrawal.completed+ teyit → tamamlandı. - Çekim iptali →
withdrawal.failed→ iade edildi; 422 ret → iade edildi; zaman aşımı → iade edilmedi, tekrar denendi. - Çok siteli kullanımda en az iki siteyle aynı testler; aynı oyuncu numarası iki sitede iki ayrı oyuncu.
- Raporlarınız kripto yatırımlarını ve çekimlerini görüyor.
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.