Anka Gaming Geliştirici portalı

Geliştirici portalı · v1.0

Anka Gaming oyunlarını sitenize bağlayın

Tek cüzdan (seamless wallet) entegrasyonu: oyuncunun parası sizde kalır, oyun her bahis, kazanç ve iade için cüzdanınızı imzalı bir istekle çağırır. Aşağıdaki beş adımla test kipinde ilk turu oynatın.

AlanNe için
https://api.ormicast.storeOperatör API'si: /api/* ve /api/yonetim/* (imzalı), sağlık /saglik.
https://play.ormicast.storeOyun: açılış adresleri /o/<jeton>, açık demo /demo/<oyun>, kart görselleri.
https://partner.ormicast.storeİş ortağı paneli: anahtarlar, adresler, IP izni, raporlar, teslim günlüğü.
https://docs.ormicast.storeBu portal, OpenAPI ve Postman dosyaları.
  1. Test anahtarını alın

    İş ortağı panelinde Entegrasyon sayfasından operatör kodunuzu ve şifrenizi alın (şifre bir kez gösterilir). Yalnız sunucunuzda, ortam değişkeni olarak tutun.

    ZFLOW_TABAN=https://api.ormicast.store
    ZFLOW_OPERATOR=ornek-site
    ZFLOW_SIFRE=… iş ortağı panelinden …
  2. Bağlantıyı deneyin

    Gövdesiz istekte imza "<zaman>." üzerinden hesaplanır. tamam:true ve test kipi görmelisiniz.

    ZAMAN=$(( $(date +%s) * 1000 ))
    IMZA=$(printf '%s.' "$ZAMAN" | openssl dgst -sha256 -hmac "$ZFLOW_SIFRE" | sed 's/^.*= //')
    
    curl -sS "$ZFLOW_TABAN/api/dene" \
      -H "X-Zflow-Operator: $ZFLOW_OPERATOR" \
      -H "X-Zflow-Zaman: $ZAMAN" \
      -H "X-Zflow-Imza: $IMZA"
    # {"tamam":true,"mesaj":"Anka · Örnek Site (ornek-site) · TRY · test kipi", …}
  3. Cüzdan ucunu kurun

    Tek HTTPS uç: oyun bakiye, bahis, kazanc, iade olaylarını POST eder. İmzayı ham gövdeden doğrulayın, seri ile tekil tutun, her zaman HTTP 200 dönün. Ayrıntı: Cüzdan geri çağrıları.

    {"olay":"bahis","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","zaman":1793880000000,"paraBirimi":"TRY","tur":"48213","seri":"h:905112:b","tutar":5000}
    
    { "tamam": true, "bakiye": 245000 }
    { "tamam": false, "hata": "yetersiz", "bakiye": 3000, "mesaj": "Bakiye yetersiz" }

    Postman koleksiyonundaki Cüzdan geri çağrısı örnekleri klasörü bu istekleri imzalı olarak kendi sunucunuza gönderir.

  4. Oyunu açın

    Sunucunuz /api/ac çağırır, dönen url'yi iframe'ler. zflow() yardımcısı İstek imzalama bölümündedir.

    const { url } = await zflow('/api/ac', {
      oyuncu: 'u12345', paraBirimi: 'TRY', dil: 'tr',
      geriUrl: 'https://api.site.ornek/zflow/cuzdan',
      cerceveler: ['https://site.ornek'],
    });
    // url → https://play.ormicast.store/o/<jeton>  (12 saat, oyuncuya özel)
    // <iframe src="${url}" allow="autoplay; fullscreen"></iframe>
  5. Bildirimleri ve kataloğu bağlayın

    Bildirim adresinize gelen olaylara {"tamam":true} dönün; oyun.durum bakim/kapali ise oyunu lobiden gizleyin. Kataloğu 5 dakikada bir If-None-Match ile çekin. Ayrıntı: Olay bildirimleri.

    let etag = '';
    setInterval(async () => {
      const r = await imzaliGet('/api/katalog', etag ? { 'If-None-Match': etag } : {});
      if (r.status === 304) return;                 // değişmedi
      etag = r.headers.get('etag') ?? '';
      lobiyiGuncelle((await r.json()).oyunlar);   // durum: acik | bakim | kapali
    }, 5 * 60_000);

Dene paneli. API başvurusundaki her ucun altında, isteği tarayıcıda imzalayıp gönderen bir Dene paneli vardır. Sunucu tarayıcıdan gelen istekleri yalnız test kipindeki operatörler için kabul eder; canlı şifre girmeyin.

Genel bakış

Anka Gaming, Hürkuş K-VI crash oyununu seamless wallet (tek cüzdan) modeliyle sunar. Oyuncunun parası her zaman operatörde kalır. Oyun her bahis, kazanç ve iade için operatörün cüzdanına imzalı bir HTTP çağrısı yapar; bakiyenin tek doğru kaynağı operatörün defteridir.

Tek cüzdan

Ön yükleme ya da transfer yok. Bahis anında cüzdanınızdan düşer, kazanç anında yatar.

Açılış adresi

Sunucunuz tek bir imzalı istekle oyuncuya özel, tahmin edilemez oyun adresini alır ve iframe'ler.

Anında eşitleme

Bakım, oyun durumu ve katalog değişiklikleri olay bildirimiyle size gelir.

Kanıtlanabilir adalet

Her turun çöküş noktası tohumlardan hesaplanır; herkes açık uçla doğrulayabilir.

İletişim yönleri

YönUçlarKimlik
Operatör → API/api/ac · /api/demo · /api/katalog · /api/dene · /api/yonetim/*imzalı
Oyun → OperatörGeri çağrı adresiniz: bakiye · bahis · kazanc · iadeimzalı
Sağlayıcı → OperatörBildirim adresiniz: oyun.* · bakim.* · duyuru · anahtar.yenilendi · denemeimzalı
Herkes → API/api/dogrula (adalet doğrulaması) · /saglikaçık

API tabanı: https://api.ormicast.store. Oyun adresleri ve görseller: https://play.ormicast.store. Tüm istek ve cevap gövdeleri UTF-8 JSON'dur.

Terimler

Operatör
Oyunu kendi sitesine bağlayan işletme. Bir operatör kodu (küçük harf, rakam ve tire; 2–40 karakter) ve gizli bir şifre ile tanınır.
Oyuncu kodu
Operatörün oyuncuya verdiği opak kimlik (1–64 karakter). Oyun kişisel veri istemez. Kod, diğer oyunculara maskeli görünür (ör. u***45); ad, e-posta ya da telefon kullanmayın.
Seri
Her para olayının tekil kimliği: h:<bahisId>:b (bahis), …:k (kazanç), …:i (iade). Cüzdanınızda benzersiz anahtar olmalıdır.
olay_id
Her olay bildiriminin tekil kimliği; yeniden denemede aynı kalır.
Kuruş
Tüm tutarlar para biriminin en küçük biriminde tam sayıdır (1 ₺ = 100). Çarpanlar iki ondalıklı sayıdır (2.37).
Tur
Tek bir uçuş. Numarası cüzdan çağrılarında tur alanında dizgi olarak gelir; oyuncunun iki bahis kutusu aynı tura düşer.
Para birimi
Operatör kaydında sabittir (ör. TRY); her istekte aynısı gönderilir.

Hesap ve kurulum

  1. İş ortağı paneli hesabıAnka sizin için bir operatör kaydı ve ilk yönetici hesabını açar. İş ortağı paneline site kodu, kullanıcı adı, parola ve iki adımlı kodla girersiniz.
  2. Operatör kodu ve şifrePanelde Entegrasyon sayfasından alınır. Şifre yalnız bir kez gösterilir; sunucunuzda gizli tutun, tarayıcıya asla göndermeyin. Şifreyi aynı sayfadan yenilersiniz; eski şifre anında geçersiz olur ve size anahtar.yenilendi bildirimi gelir.
  3. IP izni/api/* uçlarını çağıracak sunucularınızın çıkış IP adreslerini panelde girin. Eşleşme tam adres üzerindendir (CIDR yok). Liste boşsa IP kısıtı uygulanmaz; izinli olmayan adrese 403 ip döner. Ters yönde: geri çağrılar ve bildirimler 2.31.112.61 adresinden gelir.
  4. Geri çağrı ve bildirim adresleriCüzdan geri çağrı adresinizi (geriUrl) ve olay bildirim adresinizi (bildirimUrl) panelde girin. Ayrıca her /api/ac isteğinde geriUrl ile oturuma özel adres verebilirsiniz (oturumdaki adres önce gelir). Bildirim adresi boşsa bildirimler geri çağrı adresine gider.
  5. Çerçeve kökenleriOyunu iframe içinde gösterecek sitelerinizin kökenlerini (https://site.ornek) her açılışta cerceveler alanında gönderin.
  6. Test kipiEntegrasyon süresince kaydınız test kipindedir. Protokol birebir aynıdır ve geri çağrılar gerçek cüzdanınıza gelir; yalnız test kayıtları GGR ekstresine girmez. /api/dene mesajında test kipi yazar. Bu portaldaki Dene panelleri yalnız test kipinde çalışır.
  7. Deneme sırası/api/dene → /api/katalog → /api/demo → /api/ac ile test oyuncusuyla gerçek tur: bahis, bırakma, kaybetme, iptal. Panelde "bildirimi dene" ile deneme olayını gönderin.

Canlıya geçiş kontrol listesi

  • İmza iki yönde ham gövde üzerinden hesaplanıyor ve doğrulanıyor; sunucu saatleri NTP ile eşli.
  • /api/dene tamam:true dönüyor, para birimi doğru.
  • Geri çağrı ucu her durumda HTTP 200 ve JSON dönüyor; bakiye kuruş tam sayı.
  • Aynı seri ile iki kez gelen kazanç bakiyeyi yalnız bir kez artırıyor.
  • iade asilSeri ile eşleşiyor; bahisten önce gelen iade sonrasında, geç gelen bahis para çekmiyor.
  • Bahis cevabınız 4 saniyenin çok altında (hedef: birkaç yüz milisaniye).
  • Kazanç ve iadeyi yalnız gerçekten geçici bir sorunda gecici ile reddediyorsunuz.
  • Bildirim ucu {"tamam":true} dönüyor, aynı olay_id'yi bir kez işliyor; oyun.durum bakımında oyun lobiden kalkıyor.
  • Katalog 5 dakikada bir If-None-Match ile çekiliyor; /api/ac 503 bakim cevabı oyuncuya düzgün gösteriliyor.
  • cerceveler listesi dolu; tüm site alanlarınız ekli.
  • IP listeniz panelde girili.
  • Mutabakat listesini (GET /api/yonetim/mutabakat) ve paneldeki çağrı günlüğünü düzenli izliyorsunuz.
  • RTP seçeneği, sınırlar ve risk grupları kendi politikanıza göre gözden geçirildi.
  • Anka kaydınızdan test işaretini kaldırdı.

İş ortağı paneli

https://partner.ormicast.store sitenizin personeli içindir ve yalnız kendi sitenizin verisini gösterir. Giriş: site kodu + kullanıcı adı + parola + iki adımlı kod (zorunlu, TOTP). İlk yönetici hesabını Anka açar; parola bir kez gösterilir, diğer kullanıcıları yöneticiniz açar.

SayfaNe yapılır
EntegrasyonAPI tabanı ve operatör kodu; şifre yenileme; geri çağrı adresi (geriUrl) ve bildirim adresi (bildirimUrl); IP izinleri; bağlantı denemesi; çağrı günlüğü (son cüzdan çağrıları ve olay bildirimleri, cevap süresi, hata).
OyunlarSitedeki oyunları aç/kapat, RTP seçeneği, kart görsellerini indir, açılış ve demo linkleri.
Raporlar · EkstreGGR, RTP, turlar, bahis arama, oyuncu kartı; aylık ekstre (kesin / taslak, CSV).
Duyurular ve bakımAçık ve planlı bakımlar, Anka duyuruları.
GörünümOyun ekranındaki logo, renkler, sesler ve metinler.
Kullanıcılar · HesabımRoller: yonetici (her şey), finans (rapor, ekstre), teknik (entegrasyon, anahtar, günlük), izleyici.

Oyun matematiğinde site yalnız izin verilenden seçer ya da sıkılaştırır: RTP sağlayıcının izin verdiği seçeneklerden biridir, sınırlar Anka'nın koyduğu üst sınırın altına çekilebilir (bkz. RTP ve sınırlar).

Kimlik doğrulama ve imza

İki yönde de aynı imza kullanılır: siz oyuna istek atarken imzalarsınız, oyun cüzdanınıza geri çağrı yaparken aynı şifreyle imzalar.

BaşlıkDeğer
X-Zflow-OperatorOperatör kodunuz
X-Zflow-Zamanİstek zamanı, Unix epoch milisaniye (ör. 1793880000000)
X-Zflow-Imzahex HMAC-SHA256(şifre, "<zaman>.<hamGövde>"), 64 karakter
imzalanan = X-Zflow-Zaman + "." + hamGövde X-Zflow-Imza = hex( HMAC-SHA256( anahtar = şifre, ileti = imzalanan ) )

Ham gövdeyi imzalayın. İmza, kabloda giden gövdenin bayt bayt kendisi üzerinden hesaplanır. JSON'u imzaladıktan sonra yeniden serileştirmeyin; gelen gövdeyi çözüp yeniden JSON'a çevirerek doğrulamayın. Boşluk, alan sırası ya da Unicode kaçışı değişirse imza tutmaz.

  • Gövdesiz istek (GET): hamGövde boş dizgidir; imzalanan metin 1793880000000. olur.
  • Zaman penceresi: ±60 saniye. Oyun önce imzayı, sonra pencereyi denetler.
  • Karşılaştırma: hex büyük/küçük harf fark etmez; sabit süreli karşılaştırma kullanın (timingSafeEqual, hash_equals).
  • Nonce yok: pencere içinde aynı istek tekrar gelebilir. Para olayları seri ile tekil olduğundan tekrar zararsızdır.
  • Gövde türü: gövde taşıyan isteklerde Content-Type: application/json zorunludur (değilse 415); gövde en çok 64 KB.

Test vektörü

Şifre ornek-sifre, zaman 1793880000000:

hamGövdeX-Zflow-Imza
(boş, GET)4dd0445651a23261f01f7230b32056bfb4e733a3f91e190d781f71adf03131a4
{"olay":"bahis","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","zaman":1793880000000,"paraBirimi":"TRY","tur":"48213","seri":"h:905112:b","tutar":5000}c688fe0e734f5849eabf505ed7049c8fdc5cb1f9769ec497b15fc00716b4e2da

İstek imzalama (operatör → oyun)

Node.js

import { createHmac } from 'node:crypto';

const TABAN = 'https://api.ormicast.store';
const OPERATOR = 'ornek-site';
const SIFRE = process.env.ZFLOW_SIFRE;  // yalnız sunucuda

export async function zflow(yol, govde) {
  // imzalanan ve gönderilen AYNI dizgi
  const ham = govde === undefined ? '' : JSON.stringify(govde);
  const zaman = String(Date.now());
  const imza = createHmac('sha256', SIFRE).update(`${zaman}.${ham}`).digest('hex');
  const basliklar = {
    'X-Zflow-Operator': OPERATOR, 'X-Zflow-Zaman': zaman, 'X-Zflow-Imza': imza,
    Accept: 'application/json',
  };
  if (ham) basliklar['Content-Type'] = 'application/json';
  const r = await fetch(TABAN + yol, {
    method: ham ? 'POST' : 'GET', headers: basliklar, body: ham || undefined,
    signal: AbortSignal.timeout(10_000),
  });
  const j = await r.json();
  if (!r.ok || j.tamam === false) throw new Error(`${j.hata}: ${j.mesaj ?? ''}`);
  return j;
}

// oyunu aç
const { url } = await zflow('/api/ac', {
  oyuncu: 'u12345', paraBirimi: 'TRY', dil: 'tr', mobil: false,
  donusUrl: 'https://site.ornek/casino',
  geriUrl: 'https://api.site.ornek/zflow/cuzdan',
  cerceveler: ['https://site.ornek'], oyun: 'hurkus',
});

PHP

<?php
const ZFLOW_TABAN = 'https://api.ormicast.store';
const ZFLOW_OPERATOR = 'ornek-site';
define('ZFLOW_SIFRE', getenv('ZFLOW_SIFRE'));  // yalnız sunucuda

function zflow(string $yol, ?array $govde = null): array {
    // imzalanan ve gönderilen AYNI dizgi
    $ham = $govde === null ? '' : json_encode($govde, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    $zaman = sprintf('%.0f', floor(microtime(true) * 1000));
    $imza = hash_hmac('sha256', $zaman . '.' . $ham, ZFLOW_SIFRE);
    $basliklar = [
        'X-Zflow-Operator: ' . ZFLOW_OPERATOR,
        'X-Zflow-Zaman: ' . $zaman,
        'X-Zflow-Imza: ' . $imza,
        'Accept: application/json',
    ];
    $ch = curl_init(ZFLOW_TABAN . $yol);
    if ($ham !== '') {
        $basliklar[] = 'Content-Type: application/json';
        curl_setopt($ch, CURLOPT_POSTFIELDS, $ham);
    }
    curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $basliklar, CURLOPT_TIMEOUT => 10]);
    $cevap = curl_exec($ch);
    $durum = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    $j = json_decode((string) $cevap, true) ?: [];
    if ($durum !== 200 || ($j['tamam'] ?? null) === false) {
        throw new RuntimeException(($j['hata'] ?? "http_$durum") . ': ' . ($j['mesaj'] ?? ''));
    }
    return $j;
}

// oyunu aç
$acilis = zflow('/api/ac', [
    'oyuncu' => 'u12345', 'paraBirimi' => 'TRY', 'dil' => 'tr', 'mobil' => false,
    'donusUrl' => 'https://site.ornek/casino',
    'geriUrl' => 'https://api.site.ornek/zflow/cuzdan',
    'cerceveler' => ['https://site.ornek'], 'oyun' => 'hurkus',
]);
$url = $acilis['url'];

Geri çağrı doğrulama (oyun → operatör)

Gelen geri çağrıda ham gövdeyi çözümlemeden önce okuyun ve imzayı onun üzerinden doğrulayın. Ardından gövdedeki operator alanının kendi kodunuz olduğunu denetleyin.

Node.js

import { createHmac, timingSafeEqual } from 'node:crypto';

// ham: Buffer — çerçevenin JSON çözücüsünden ÖNCE alınan gövde baytları
export function imzaTutar(sifre, zaman, ham, imza) {
  if (!/^\d{1,16}$/.test(zaman) || !/^[0-9a-f]{64}$/i.test(imza)) return false;
  const beklenen = createHmac('sha256', sifre).update(`${zaman}.`).update(ham).digest('hex');
  return timingSafeEqual(Buffer.from(beklenen), Buffer.from(imza.toLowerCase()));
}
export const zamanTaze = (zaman) => Math.abs(Date.now() - Number(zaman)) <= 60_000;

// Express: app.post('/zflow/cuzdan', express.raw({ type: 'application/json' }), ...)
// Fastify: addContentTypeParser('application/json', { parseAs: 'buffer' }, ...)

PHP

<?php
function zflow_imza_tutar(string $sifre, string $zaman, string $ham, string $imza): bool {
    if (!preg_match('/^\d{1,16}$/', $zaman) || !preg_match('/^[0-9a-f]{64}$/i', $imza)) return false;
    return hash_equals(hash_hmac('sha256', $zaman . '.' . $ham, $sifre), strtolower($imza));
}
function zflow_zaman_taze(string $zaman): bool {
    return abs(microtime(true) * 1000 - (float) $zaman) <= 60000;
}

$ham   = file_get_contents('php://input');           // HAM gövde
$zaman = $_SERVER['HTTP_X_ZFLOW_ZAMAN'] ?? '';
$imza  = $_SERVER['HTTP_X_ZFLOW_IMZA'] ?? '';

Oyun açma

Oyuncu oyunu seçtiğinde sunucunuz /api/ac çağırır, dönen url adresini iframe'de açar. Ayrı bir oyuncu kayıt ucu yoktur: oyuncu ilk açılışta oluşturulur.

POST/api/acimzalı
AlanTürZorunluAçıklama
oyuncustring, 1–64evetOyuncu kodu.
paraBirimistring, 3–4 harfevetKaydınızdaki para birimiyle aynı olmalı; değilse 400 para_birimi.
dilstring, 2 harfhayırArayüz dili (ISO 639-1). Varsayılan tr.
mobilbooleanhayırMobil açılış. Varsayılan false.
donusUrlURL, http(s), ≤ 500hayırMenüdeki "Siteye dön" ve oturum bitti kartının götürdüğü adres.
geriUrlURL, http(s), ≤ 500hayır*Bu oturumun cüzdan geri çağrı adresi. Verilmezse kaydınızdaki adres kullanılır. *İkisi de yoksa bahis alınamaz.
riskyeni | normal | vip | suphelihayırVerilirse oyuncunun risk grubu her açılışta bu değere güncellenir. Verilmezse mevcut grup korunur (yeni oyuncu: normal). Grupları yönetim ucundan atıyorsanız bu alanı göndermeyin.
cercevelerstring[], ≤ 10hayırOyunu iframe'leyebilecek kökenler: https://alan ya da https://alan:kapı; yol ve joker (*) yok. Boş bırakılırsa oyun sitenize gömülemez.
oyun"hurkus"hayırKatalogdaki disKod. Varsayılan hurkus.
{
  "oyuncu": "u12345",
  "paraBirimi": "TRY",
  "dil": "tr",
  "mobil": false,
  "donusUrl": "https://site.ornek/casino",
  "geriUrl": "https://api.site.ornek/zflow/cuzdan",
  "cerceveler": ["https://site.ornek", "https://m.site.ornek"],
  "oyun": "hurkus"
}
Cevap alanıTürAçıklama
tamambooleantrue
urlstringOyuncuya özel açılış adresi https://play.ormicast.store/o/<jeton> (43 karakter jeton).
oturumnumberOturum numarası (destek ve kayıt için).
bitisstring, ISO 8601Jetonun geçerlilik sonu: açılıştan 12 saat sonra.
{
  "tamam": true,
  "url": "https://play.ormicast.store/o/kX9vR2mQ7tL4pZ8wN1cY6hB3jF5sD0aE_uG-oIqWxVe",
  "oturum": 18342,
  "bitis": "2026-11-06T00:00:00.000Z"
}
  • Her açılışta /api/ac çağırın; adresi saklamayın, paylaşmayın. Jeton oyuncuya özeldir.
  • Oyuncuya özel link: jeton 12 saat geçerlidir, tahmin edilemez ve sunucuda yalnız özeti tutulur. Linki oyuncuya paylaştırmayın; oyuncu başka cihazdan oynayacaksa o cihaz için yeniden /api/ac çağırın. Aynı oyuncu ikinci bir sekmede açarsa ilk sekme "Burada devam et" kartını görür.
  • Oyuncu başına tek etkin pencere vardır. Aynı oyuncu oyunu ikinci pencerede açarsa ilk pencerede "Oyun başka bir sekmede açıldı" kartı çıkar.
  • Eski biçim /oyna?j=<jeton> çalışmaya devam eder; yeni entegrasyonlarda dönen url'yi olduğu gibi kullanın.
  • Olası hatalar: 400 gecersiz (mesaj alanı adını söyler), 400 para_birimi, 401 imza, 403 kapali, 403 ip, 503 bakim.

Bakımda açılış

Oyun bakımdayken /api/ac yeni oturum açmaz ve HTTP 503 döner. Oyunu lobide gizleyin, oyuncuya mesaj ve bitis gösterin; oyun.durum acik bildirimi gelince ya da katalogda durum:"acik" görünce yeniden gösterin.

{
  "tamam": false,
  "hata": "bakim",
  "mesaj": "Kısa süreli bakım",
  "bitis": "2026-11-06T03:00:00.000Z"
}
POST/api/demoimzalıoyuncusuz, para olayı yok

Sanal 1.000 ₺ bakiyeli demo oturum açar. Aynı turlar ve aynı çöküşler oynanır, ama cüzdan çağrısı yapılmaz, demo bahisleri listelerde görünmez ve raporlara girmez. Bu uç da imzalıdır: sitenizin sunucusu çağırır.

API'siz demo linki. Lobi kartında "Demo" düğmesi için API çağırmanız gerekmez: https://play.ormicast.store/demo/hurkus?dil=tr herkese açıktır (sanal 1.000 ₺, IP başına dakikada 10 açılış). Kendi donusUrl ve cerceveler değerlerinizle demo istiyorsanız /api/demo kullanın.

AlanTürZorunluAçıklama
dilstring, 2 harfhayırVarsayılan tr.
mobilbooleanhayırVarsayılan false.
donusUrlURLhayır"Siteye dön" adresi.
cercevelerstring[], ≤ 10hayırAynı kural (/api/ac).
oyun"hurkus"hayırVarsayılan hurkus.
{
  "tamam": true,
  "url": "https://play.ormicast.store/o/Dm3oT8eS1vK6nP0qR4wY7zA2bC5fH9jL_xU-gIiOtMr",
  "oturum": 18343,
  "bitis": "2026-11-06T00:00:00.000Z",
  "bakiye": 100000
}

iframe, mobil ve dönüş adresi

<iframe
  src="https://play.ormicast.store/o/…"
  title="Hürkuş K-VI"
  allow="autoplay; fullscreen"
  style="width:100%;height:100%;border:0"></iframe>
  • frame-ancestors: oyun sayfası Content-Security-Policy: frame-ancestors başlığını oturumun cerceveler listesinden kurar. Listede olmayan bir site oyunu çerçeveleyemez. Liste boşsa yalnız oyunun kendi alanı ('self') kabul edilir ve oyun sitenize gömülemez: lobi ve iframe kökenlerinizi her açılışta cerceveler alanında gönderin. Her alt alan adını (m., www.) ayrı yazın.
  • Mobil: düzen ekran genişliğine kendiliğinden uyar (720 px ve altı telefon düzeni). Telefonda iframe'i tam ekran bir kapta açın ya da url adresine doğrudan yönlendirin. Üst pencerede açılışta çerçeve kuralı devreye girmez.
  • Ses: tarayıcı kuralı gereği sesler oyuncunun ilk dokunuşunda açılır.
  • Dönüş adresi: donusUrl menüdeki "Siteye dön" ve "Oturum süresi doldu" kartında kullanılır. Süresi dolan ya da geçersiz jetonla açılan sayfa bu kartı gösterir; oyuncu sitenize dönüp oyunu yeniden açar.

Katalog, Dene, Doğrula

GET/api/katalogimzalı

Oyun listesi: lobi kartı için gereken her şey tek cevapta. RTP ve bahis sınırları sizin ayarınızdan hesaplanır; ayarı değiştirdiğinizde katalog da değişir. Katalog doğruluk kaynağıdır: her oyunda durum, surum ve guncelleme vardır.

{
  "tamam": true,
  "oyunlar": [{
    "disKod": "hurkus",
    "ad": "Hürkuş K-VI",
    "studyo": "Anka Gaming",
    "studyoLogo": "https://play.ormicast.store/anka/logo.png",
    "studyoIsaret": "https://play.ormicast.store/anka/isaret.png",
    "tur": "crash",
    "kategori": "Crash",
    "aciklama": "Uçak havalanır, çarpan yükselir; uçak gitmeden önce parayı çek. İki bahis, otomatik bahis ve otomatik bırakma, kanıtlanabilir adalet.",
    "gorsel": "https://play.ormicast.store/oyun-gorsel/hurkus-kare-3f9a1c0b7d2e.webp",
    "gorselDikey": "https://play.ormicast.store/oyun-gorsel/hurkus-dikey-8b41e07a9c13.webp",
    "gorselYatay": "https://play.ormicast.store/oyun-gorsel/hurkus-yatay-c27d5e90f4a8.webp",
    "gorselHareketli": null,
    "rtp": 97,
    "oynaklik": "yuksek",
    "enAzBahis": 100,
    "enCokBahis": 100000,
    "enCokCarpan": 500,
    "paraBirimleri": ["TRY"],
    "diller": ["tr", "en"],
    "demo": true,
    "mobil": true,
    "masaustu": true,
    "cikis": "2026-11-05",
    "etiketler": ["yeni"],
    "ozellikler": ["iki_bahis", "otomatik_bahis", "otomatik_birakma", "kanitlanabilir_adalet", "canli_bahisler"],
    "durum": "acik",
    "surum": 3,
    "guncelleme": "2026-11-05T09:00:00.000Z"
  }]
}
AlanTürAçıklama
disKodstringOyun kodu; /api/ac ve /api/demo isteklerindeki oyun alanı.
adstringGösterim adı.
studyo · studyoLogo · studyoIsaretstring · URL · URLStüdyo adı, tam logo ve kare işaret (küçük rozetler için).
tur · kategoristringOyun türü (crash) ve lobi kategorisi (Crash).
aciklamastringKısa tanıtım metni.
gorselURL | nullKare kart görseli (1:1).
gorselDikeyURL | nullDikey kart görseli (3:4).
gorselYatayURL | nullYatay afiş (16:9).
gorselHareketliURL | nullHareketli önizleme (animasyonlu WebP ya da GIF); yoksa null.
rtpnumber (%)Bu operatör için oyuncuya dönüş oranı: 100 − kasaPayi (ör. 97).
oynaklikstringOynaklık (yuksek).
enAzBahis · enCokBahisinteger, kuruşnormal risk grubunun bahis sınırları.
enCokCarpannumberGenel çarpan tavanı ile normal grubun tavanından küçük olanı.
paraBirimleristring[]Kaydınızdaki para birimi.
dillerstring[]Arayüz dilleri (ISO 639-1).
demo · mobil · masaustubooleanDemo açılabilir mi; telefonda ve masaüstünde oynanır mı.
cikisstring, YYYY-MM-DDÇıkış tarihi.
etiketlerstring[]Lobi etiketleri (ör. yeni).
ozelliklerstring[]iki_bahis, otomatik_bahis, otomatik_birakma, kanitlanabilir_adalet, canli_bahisler.
durumacik | bakim | kapalibakim ya da kapali iken oyunu lobide gizleyin; /api/ac bu durumda 503 bakim döner.
surumintegerOyun kaydı her değiştiğinde artar; elinizdekinden küçük sürümü yok sayın.
guncellemestring, ISO 8601Son değişiklik zamanı.

Önbellek ve eşitleme

  • Cevap ETag başlığı taşır. Sonraki isteklerde If-None-Match: <etag> gönderin; değişiklik yoksa gövdesiz 304 döner.
  • Önerilen düzen: olay bildirimlerini dinleyin ve kataloğu 5 dakikada bir çekin. Bir bildirim kaçsa da lobiniz en geç 5 dakikada düzelir.

Görseller. Tüm adresler mutlaktır (https://play.ormicast.store/oyun-gorsel/…). Görsel dosyaları uzun süreli önbelleğe uygundur (immutable) ve her kökenden okunabilir (Access-Control-Allow-Origin: *). Yüklenen bir görselin adı içeriğinden türetilir: görsel değişirse adresi de değişir. Görselleri kendi CDN'inize kopyalayabilirsiniz; oyun.guncellendi geldiğinde değişen adresleri güncelleyin.

GET/api/deneimzalıel sıkışma

Kodunuz, şifreniz, IP izniniz ve saatiniz doğru mu? Para oynatmaz; entegrasyon testinde ve izlemede kullanın.

{
  "tamam": true,
  "mesaj": "Anka · Örnek Site (ornek-site) · TRY · test kipi",
  "surum": "1.0.0+a1b2c3d",
  "oyunlar": ["hurkus"],
  "paraBirimi": "TRY",
  "test": true
}

paraBirimi kaydınızdaki para birimidir; kendi yapılandırmanızla karşılaştırın. test, kaydınızın test kipinde olup olmadığını gösterir.

GET/api/dogrulaaçık · imzasız

Adalet doğrulaması. İki biçimi vardır (ayrıntı: Oyun kuralları ve adalet).

Biten turun kaydı: ?tur=<no>&operator=<kod>

GET https://api.ormicast.store/api/dogrula?tur=48213&operator=ornek-site
{
  "tamam": true, "tur": 48213, "bitti": true,
  "tohumOzet": "c001faea70fc74477a2c7d8073a4d3a2444414c7cb6fdd32dfbae21abeb9b256",
  "tohum": "7c2e0b5a9d41f3e8a6b1c0d9e2f3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5",
  "istemciTohum": "8b6ea82bb9129a7aa2797d4c3e1ae26dbea87dacf11425819cec8c3e271be04f",
  "kasaPayi": 3, "tavan": 500,
  "cokus": 16.65, "kayitliCokus": 16.65
}

Tur sürüyorsa tohum açıklanmaz: {"tamam":true, "tur":48213, "bitti":false, "tohumOzet":"…"}. cokus tohumlardan yeniden hesaplanan, kayitliCokus turda kaydedilen değerdir; ikisi her zaman aynı olmalıdır.

Saf hesap: ?sunucuTohumu&istemciTohumu&kasaPayi[&tavan]

ParametreKural
sunucuTohumu, istemciTohumu8–128 karakter
kasaPayi0–15 (%)
tavan1–10000, varsayılan 10000
{ "tamam": true, "cokus": 16.65, "kasaPayi": 3, "tavan": 500 }

Cüzdan geri çağrıları

Operatör tek bir HTTPS uç uygular: geri çağrı adresi. Oyun bu adrese POST ile JSON gönderir, imza başlıkları aynıdır (sizin şifreniz). Olay türü gövdedeki olay alanındadır: bakiye · bahis · kazanc · iade.

Kaynak IP. Geri çağrılar oyun sunucusundan gelir; şu anki değer 2.31.112.61. Güvenliğin esası imzadır; IP süzgeci ek bir katmandır.

Akış

Açılış
Operatör→Oyun

POST /api/ac → {url}; siteniz url'yi iframe'ler.

Oyun→Operatör

bakiye: oyuncu bağlanınca güncel bakiye sorulur.

Bahis fazı
Oyun→Operatör

bahis · seri h:905112:b · tutar 5000. Tutarı düşün, yeni bakiyeyi dönün.

Tek atış, 4 sn. Cevap gelmezse bahis alınmaz ve iade kuyruğa yazılır.

Oyun→Operatör

Oyuncu bahis fazında iptal ederse: iade · seri h:905112:i · asilSeri h:905112:b.

Uçuş
Oyun→Operatör

Oyuncu bırakırsa (elle ya da oto): kazanc · seri h:905112:k · tutar 11850.

Bırakmayla aynı işlemde kuyruğa yazılır; ulaşana dek yeniden denenir.

Oyun

Uçak çöker. Bırakmayan bahis kaybetmiştir; kayıp için çağrı gelmez.

İstek alanları

AlanTürHangi olaydaAçıklama
olaystringhepsibakiye | bahis | kazanc | iade
operatorstringhepsiOperatör kodunuz; kendi kodunuzla karşılaştırın.
oyuncustringhepsi/api/ac'de verdiğiniz oyuncu kodu.
oyunstringhepsihurkus
turstringbahis, kazanc, iadeTur numarası.
seristringbahis, kazanc, iadeTekil işlem kimliği h:<bahisId>:b|k|i.
zamannumber, mshepsiX-Zflow-Zaman ile aynı; her yeniden denemede tazelenir.
paraBirimistringhepsiKaydınızdaki para birimi.
tutarinteger, kuruş, > 0bahis, kazanc, iadeİşlem tutarı.
asilSeristringiadeİade edilen bahsin serisi (h:<bahisId>:b).

Olaylar

bakiye · para oynatmaz

Oyuncu bağlandığında ve bir bahis reddinden sonra sorulur. tur, seri, tutar gelmez. Güncel bakiyeyi dönün.

{"olay":"bakiye","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","zaman":1793880000000,"paraBirimi":"TRY"}

bahis · tutarı düşün

Bakiye yetiyorsa tutarı düşün ve yeni bakiyeyi dönün. Yetmiyorsa hiçbir şey düşmeden yetersiz dönün; eksi bakiyeye izin vermeyin.

{"olay":"bahis","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","zaman":1793880000000,"paraBirimi":"TRY","tur":"48213","seri":"h:905112:b","tutar":5000}
{ "tamam": true, "bakiye": 245000 }
{ "tamam": false, "hata": "yetersiz", "bakiye": 3000, "mesaj": "Bakiye yetersiz" }

kazanc · tutarı yatırın

Oyuncu bıraktığında gelir. Tutar floor(bahis × çarpan) değeridir; risk grubunun en çok kazanç ve günlük tavan sınırlarıyla kesilmiş olabilir. İlgili bahis (h:<bahisId>:b) daima daha önce başarıyla işlenmiştir.

{"olay":"kazanc","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","tur":"48213","seri":"h:905112:k","zaman":1793880007000,"paraBirimi":"TRY","tutar":11850}

iade · bahsi geri verin

Bahsin tamamını geri verir. Şu durumlarda gelir: oyuncu bahis fazında iptal etti; bahis çağrınız 4 sn içinde cevaplanmadı; bahis kabul edilirken tur uçuşa geçti; arıza sonrası tur iptal edildi.

{"olay":"iade","operator":"ornek-site","oyuncu":"u12345","oyun":"hurkus","tur":"48213","seri":"h:905112:i","zaman":1793880002000,"paraBirimi":"TRY","tutar":5000,"asilSeri":"h:905112:b"}
  • asilSeri işlenmiş bir bahisse tutarı geri yatırın.
  • asilSeri hiç gelmemişse ya da reddettiyseniz para oynatmayın, ama yer tutucu kayıt yazın ve tamam:true dönün. Aynı seriyle sonradan gelen bahis tekrar sayılır ve para çekmez. (Cevapsız kalan bahis isteği size geç ulaşabilir.)

Tekillik (seri)

Aynı seri ikinci kez gelirse para yeniden oynatılmaz. İlk işlemin sonucunu (tamam ya da aynı hata) güncel bakiyeyle tekrar dönün.

  • seri cüzdanınızda benzersiz anahtar olmalıdır. Bakiye hareketini ve seri kaydını tek veritabanı işleminde yazın.
  • Kazanç ve iade, cevabınız ulaşana kadar yeniden gönderilir; aynı seri birçok kez gelebilir.
  • Gövdedeki zaman her denemede tazelenir, yani gövde baytları denemeden denemeye değişir. Tekilliği gövde özetiyle değil, seri ile kurun.
  • Olaylar sırasız gelebilir: bir iade, ilgili bahis isteğinden önce ulaşabilir (bkz. yer tutucu).

Cevap biçimi

Cevap her zaman HTTP 200 ve JSON'dur.

{ "tamam": true, "bakiye": 245000 }
{ "tamam": false, "hata": "oyuncu", "bakiye": 245000, "mesaj": "Hesabınız geçici olarak kısıtlı" }
  • bakiye: işlemden sonraki bakiye, kuruş, sayı. Başarıda zorunlu; retlerde isteğe bağlı.
  • mesaj: en çok 200 karakter. Bahis retlerinde oyuncuya gösterilebilir; kısa ve oyuncuya uygun Türkçe yazın.
  • Oyun şunları geçici sayar: 200 dışı HTTP durumu, JSON olmayan gövde, tamam alanı olmayan gövde, tamam:true olup sayısal bakiye içermeyen gövde, ağ hatası, zaman aşımı.
  • Tanınmayan hata kodu red sayılır.

Hata kodları ve oyunun davranışı

hataNe zamanBahisteKazanç / iadede
yetersizBakiye yetmiyorBahis alınmaz; oyuncu "Bakiye yetersiz" görür.Kesin ret: yeniden denenmez, mutabakat listesine düşer.
oyuncuOyuncu yok, kapalı ya da kısıtlıBahis alınmaz; mesajınız gösterilir (yoksa "Bahis kabul edilmedi").Kesin ret → mutabakat.
imzaİmza ya da operatör doğrulanamadıBahis alınmaz (mesajınız).Yeniden denenir (gecici gibi; saat farkı ya da şifre yenileme anı için).
geciciGeçici arıza (veritabanı, bakım)Bahis alınmaz; "Geçici bir sorun oldu, yeniden deneyin". İade gönderilmez: para düşmemiş olmalı.Yeniden denenir (takvim aşağıda).
para_birimiPara birimi tutmuyorBahis alınmaz (mesajınız).Kesin ret → mutabakat.
redDiğer retler (sorumlu oyun sınırı, kural)Bahis alınmaz; mesajınız oyuncuya gösterilir.Kesin ret → mutabakat.

Kazanç ve iadeyi reddetmeyin. Oyuncu bu parayı kazanmıştır ya da parası iade edilmektedir. Geçici bir sorununuz varsa gecici dönün; oyun yeniden dener. imza cevabı da yeniden denenir (her denemede zaman tazelenir). gecici ve imza dışındaki her kod kesin rettir ve elle mutabakat gerektirir.

Zaman aşımı ve yeniden deneme

OlayBeklemeDeneme
bakiye4 snTek deneme; ulaşılamazsa geçici sayılır.
bahis4 snTek atış. Cevapsız kalırsa bahis başarısız sayılır, oyuncuya "Geçici bir sorun" gösterilir ve iade kuyruğa yazılır (bahsi işlemişseniz iade geri alır).
kazanc, iadedeneme başına 8 snGiden kutusu (outbox): hemen gönderilir, olmazsa 2, 5, 15, 60, 300 sn sonra, ardından her 300 sn. 24 saat sonra vazgecildi olur ve mutabakat listesine düşer.

Kazanç, bırakmayla aynı veritabanı işleminde giden kutusuna yazılır. Oyun tarafında bir kazanç ya da iade kaybolmaz; tek risk sizin uzun süre ulaşılamaz olmanızdır. Başarılı her kazanç ve iade cevabındaki bakiye oyuncunun ekranına anında yansır.

Örnek uygulama

Aşağıdaki örnekler kuralları göstermek içindir; gerçek uygulamada bakiye ve seri kaydı aynı veritabanı işleminde, seri benzersiz anahtarla tutulur.

Node.js

import { createServer } from 'node:http';
import { createHmac, timingSafeEqual } from 'node:crypto';

const OPERATOR = 'ornek-site', PARA = 'TRY';
const SIFRE = process.env.ZFLOW_SIFRE;

// bellek içi örnek defter (kuruş). Gerçekte: veritabanı, tek işlem, seri UNIQUE.
const bakiyeler = new Map([['u12345', 250_000]]);
const islemler = new Map();     // seri → ilk cevap
const iadeEdilen = new Set();   // iadesi gelmiş bahis serileri (yer tutucu)

function imzaTutar(zaman, ham, imza) {
  if (!/^\d{1,16}$/.test(zaman) || !/^[0-9a-f]{64}$/i.test(imza)) return false;
  const beklenen = createHmac('sha256', SIFRE).update(`${zaman}.`).update(ham).digest('hex');
  return timingSafeEqual(Buffer.from(beklenen), Buffer.from(imza.toLowerCase()));
}

function isle(o) {
  if (o.operator !== OPERATOR) return { tamam: false, hata: 'imza', mesaj: 'Operatör tutmuyor' };
  if (o.paraBirimi !== PARA) return { tamam: false, hata: 'para_birimi', mesaj: 'Para birimi tutmuyor' };
  if (!bakiyeler.has(o.oyuncu)) return { tamam: false, hata: 'oyuncu', mesaj: 'Oyuncu bulunamadı' };
  const bakiye = () => bakiyeler.get(o.oyuncu);
  const ekle = (fark) => bakiyeler.set(o.oyuncu, bakiye() + fark);
  if (o.olay === 'bakiye') return { tamam: true, bakiye: bakiye() };

  // tekillik: aynı seri → para oynamaz, ilk sonuç + güncel bakiye
  const onceki = islemler.get(o.seri);
  if (onceki) return { ...onceki, bakiye: bakiye() };

  let cevap;
  if (o.olay === 'bahis') {
    if (iadeEdilen.has(o.seri)) cevap = { tamam: true };                 // iadesi önce geldi: çekme
    else if (bakiye() < o.tutar) cevap = { tamam: false, hata: 'yetersiz', mesaj: 'Bakiye yetersiz' };
    else { ekle(-o.tutar); cevap = { tamam: true }; }
  } else if (o.olay === 'kazanc') {
    ekle(o.tutar); cevap = { tamam: true };
  } else if (o.olay === 'iade') {
    if (islemler.get(o.asilSeri)?.tamam && !iadeEdilen.has(o.asilSeri)) ekle(o.tutar);
    iadeEdilen.add(o.asilSeri);                                         // yer tutucu
    cevap = { tamam: true };
  } else cevap = { tamam: false, hata: 'red', mesaj: 'Olay tanınmıyor' };

  islemler.set(o.seri, cevap);
  return { ...cevap, bakiye: bakiye() };
}

createServer((req, res) => {
  const parcalar = [];
  req.on('data', (p) => parcalar.push(p));
  req.on('end', () => {
    const ham = Buffer.concat(parcalar);                 // HAM gövde: imza bunun üzerinden
    const zaman = String(req.headers['x-zflow-zaman'] ?? '');
    const imza = String(req.headers['x-zflow-imza'] ?? '');
    let cevap;
    if (!imzaTutar(zaman, ham, imza)) cevap = { tamam: false, hata: 'imza', mesaj: 'İmza doğrulanamadı' };
    else if (Math.abs(Date.now() - Number(zaman)) > 60_000) cevap = { tamam: false, hata: 'gecici', mesaj: 'Saat farkı' };
    else try { cevap = isle(JSON.parse(ham.toString('utf8'))); }
    catch { cevap = { tamam: false, hata: 'gecici', mesaj: 'İşlenemedi' }; }
    res.writeHead(200, { 'Content-Type': 'application/json' });   // HER ZAMAN 200
    res.end(JSON.stringify(cevap));
  });
}).listen(8080);

PHP

<?php
// Tablo (örnek):
// CREATE TABLE zflow_islem (
//   seri VARCHAR(40) PRIMARY KEY,        -- h:<bahisId>:b|k|i  (tekil)
//   olay VARCHAR(8) NOT NULL, oyuncu VARCHAR(64) NOT NULL, tutar BIGINT NOT NULL,
//   asil_seri VARCHAR(40) NULL, tamam BOOLEAN NOT NULL, hata VARCHAR(16) NULL,
//   olusturma TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);
require 'zflow-dogrula.php';   // ZFLOW_SIFRE, ZFLOW_OPERATOR, zflow_imza_tutar, zflow_zaman_taze (İmza bölümü)
// $db (PDO) ve bakiye_kilitle, bakiye_ekle, islem_bul, islem_yaz, iade_yer_tutucu_var: kendi şemanıza göre yazılır
header('Content-Type: application/json');
http_response_code(200);                                      // HER ZAMAN 200
function cevap(array $c): never { echo json_encode($c, JSON_UNESCAPED_UNICODE); exit; }

$ham   = file_get_contents('php://input');
$zaman = $_SERVER['HTTP_X_ZFLOW_ZAMAN'] ?? '';
if (!zflow_imza_tutar(ZFLOW_SIFRE, $zaman, $ham, $_SERVER['HTTP_X_ZFLOW_IMZA'] ?? ''))
    cevap(['tamam' => false, 'hata' => 'imza', 'mesaj' => 'İmza doğrulanamadı']);
if (!zflow_zaman_taze($zaman)) cevap(['tamam' => false, 'hata' => 'gecici', 'mesaj' => 'Saat farkı']);
$o = json_decode($ham, true);
if (($o['operator'] ?? '') !== ZFLOW_OPERATOR) cevap(['tamam' => false, 'hata' => 'imza', 'mesaj' => 'Operatör tutmuyor']);

try {
    $db->beginTransaction();
    $bakiye = bakiye_kilitle($db, $o['oyuncu']);               // SELECT … FOR UPDATE; yoksa null
    if ($bakiye === null) { $db->rollBack(); cevap(['tamam' => false, 'hata' => 'oyuncu', 'mesaj' => 'Oyuncu bulunamadı']); }
    if ($o['olay'] === 'bakiye') { $db->commit(); cevap(['tamam' => true, 'bakiye' => $bakiye]); }

    $onceki = islem_bul($db, $o['seri']);                     // aynı seri: para oynamaz
    if ($onceki) { $db->commit(); cevap($onceki['tamam'] ? ['tamam' => true, 'bakiye' => $bakiye]
        : ['tamam' => false, 'hata' => $onceki['hata'], 'bakiye' => $bakiye]); }

    $t = (int) $o['tutar']; $tamam = true; $hata = null;
    switch ($o['olay']) {
        case 'bahis':
            if (iade_yer_tutucu_var($db, $o['seri'])) break;     // iadesi önce geldi: çekme
            if ($bakiye < $t) { $tamam = false; $hata = 'yetersiz'; break; }
            $bakiye = bakiye_ekle($db, $o['oyuncu'], -$t); break;
        case 'kazanc':
            $bakiye = bakiye_ekle($db, $o['oyuncu'], $t); break;
        case 'iade':
            $asil = islem_bul($db, $o['asilSeri']);
            if ($asil && $asil['tamam']) $bakiye = bakiye_ekle($db, $o['oyuncu'], $t);
            // asil bahis yoksa: bu iade satırı yer tutucudur (asil_seri ile aranır)
            break;
        default: $tamam = false; $hata = 'red';
    }
    islem_yaz($db, $o, $tamam, $hata);                         // seri PRIMARY KEY
    $db->commit();
    cevap($tamam ? ['tamam' => true, 'bakiye' => $bakiye]
                 : ['tamam' => false, 'hata' => $hata, 'bakiye' => $bakiye, 'mesaj' => $hata === 'yetersiz' ? 'Bakiye yetersiz' : 'İşlem reddedildi']);
} catch (Throwable $e) {
    if ($db->inTransaction()) $db->rollBack();
    cevap(['tamam' => false, 'hata' => 'gecici', 'mesaj' => 'Geçici sorun']);   // oyun yeniden dener
}

Olay bildirimleri

Sağlayıcı tarafındaki değişiklikler (oyun durumu, yeni ya da güncellenen oyun, bakım, duyuru, anahtar yenileme) sitenize anında bildirilir. Bildirimler kaydınızdaki bildirimUrl adresine gider; adresi iş ortağı panelinde Entegrasyon sayfasından girersiniz. Adres boşsa aynı gövde cüzdan geri çağrı adresinize gönderilir.

POST<bildirimUrl>imzalısiz uygularsınız
AlanTürAçıklama
turstringOlay türü (aşağıdaki tablo). Cüzdan çağrılarındaki tur numarasıyla karıştırmayın.
olay_idstringTekil olay kimliği; yeniden denemede aynı kalır.
zamannumber, msGönderim zamanı; X-Zflow-Zaman ile aynı, her denemede tazelenir.
operatorstringOperatör kodunuz; kendi kodunuzla karşılaştırın.
veriobjectTüre göre içerik.
  • İmza: cüzdan çağrılarıyla aynı üç başlık ve aynı şifre (Geri çağrı doğrulama). Kaynak IP 2.31.112.61.
  • Cevap: HTTP 200 ve {"tamam":true}. Başka her cevap (200 dışı durum, gövdesiz cevap, tamam:false, zaman aşımı) yeniden denenir.
  • Yeniden deneme: hemen, sonra 2, 5, 15, 60, 300 sn ve ardından her 300 sn; 24 saat sonra vazgecildi. Teslim günlüğü iş ortağı panelindedir.
  • Tekillik: olay_id'yi benzersiz anahtar olarak saklayın; aynı kimlik ikinci kez gelirse işlemeden {"tamam":true} dönün.
  • Sıra: olaylar sırasız gelebilir. oyun.* olaylarında veri.oyun.surum elinizdekinden küçükse yok sayın. Bildirimi önce kaydedip hızlıca 200 dönün, işi arka planda yapın.

Olay türleri

turveriNe zaman
oyun.eklendi{oyun} (katalog oyunu)Sitenize yeni oyun açıldı.
oyun.guncellendi{oyun}Ad, görsel, RTP ya da sınır değişti.
oyun.durum{disKod, durum, bitis?, mesaj?}; durum acik | bakim | kapaliOyun bakıma girdi, kapandı ya da yeniden açıldı.
bakim.planlandi{id, bas, bit, oyunlar, mesaj}; oyunlar dizi ya da "hepsi"İleri tarihli bakım planlandı.
bakim.basladi · bakim.bitti{id}Planlı bakım başladı / bitti.
duyuru{id, seviye, baslik, metin, bitis?}; seviye bilgi | uyari | kritikAnka'dan sitelere duyuru.
anahtar.yenilendi{}Şifreniz yenilendi. Yalnız uyarıdır: yeni şifre bildirimle gitmez, panelden alınır.
deneme{}Panelde "bildirimi dene" düğmesi.
{
  "tur": "oyun.durum",
  "olay_id": "ev_000184213",
  "zaman": 1793880000000,
  "operator": "ornek-site",
  "veri": { "disKod": "hurkus", "durum": "bakim", "bitis": "2026-11-06T03:00:00.000Z", "mesaj": "Planlı bakım" }
}
{
  "tur": "bakim.planlandi",
  "olay_id": "ev_000184216",
  "zaman": 1793880180000,
  "operator": "ornek-site",
  "veri": { "id": 12, "bas": "2026-11-06T02:00:00.000Z", "bit": "2026-11-06T03:00:00.000Z", "oyunlar": "hepsi", "mesaj": "Sunucu bakımı" }
}
{
  "tur": "duyuru",
  "olay_id": "ev_000184219",
  "zaman": 1793880240000,
  "operator": "ornek-site",
  "veri": { "id": 7, "seviye": "bilgi", "baslik": "Yeni oyun yakında", "metin": "Kaan temalı yeni crash oyunu Aralık'ta katalogda.", "bitis": "2026-12-01T00:00:00.000Z" }
}

oyun.eklendi ve oyun.guncellendi örnekleri (tam katalog oyunuyla) API başvurusunda ve Postman koleksiyonunun Olay bildirimi örnekleri klasöründedir.

Önerilen işleme

OlaySiteniz ne yapmalı
oyun.durum · bakim / kapaliOyunu lobiden hemen gizleyin; bitis varsa "Bakımda · saat" gösterin.
oyun.durum · acikOyunu yeniden gösterin.
oyun.eklendi · oyun.guncellendiKataloğu yenileyin (GET /api/katalog) ya da gelen oyun nesnesini surum karşılaştırarak yazın.
bakim.* · duyuruPersonel ekranınızda gösterin; isterseniz oyunculara duyurun.
anahtar.yenilendiEkibinizi uyarın; yeni şifreyi panelden alıp sunucunuza yazın. Bu sürede bildirimler ve cüzdan çağrıları imza hatası alır (yeniden denenir).
// imzaTutar ve zamanTaze: "Geri çağrı doğrulama" bölümü
const islenen = new Set();        // gerçekte: veritabanı, olay_id UNIQUE

export async function bildirim(ham, basliklar) {
  if (!imzaTutar(SIFRE, basliklar['x-zflow-zaman'], ham, basliklar['x-zflow-imza'])) return { durum: 401 };
  const o = JSON.parse(ham.toString('utf8'));
  if (o.operator !== OPERATOR) return { durum: 401 };
  if (islenen.has(o.olay_id)) return { durum: 200, govde: { tamam: true } };   // tekrar
  islenen.add(o.olay_id);

  switch (o.tur) {
    case 'oyun.durum':
      lobi.goster(o.veri.disKod, o.veri.durum === 'acik', o.veri.bitis); break;
    case 'oyun.eklendi': case 'oyun.guncellendi':
      kuyruk.ekle('katalog-yenile'); break;
    default:
      personelEkrani.yaz(o);                                        // bakim.*, duyuru, anahtar.yenilendi, deneme
  }
  return { durum: 200, govde: { tamam: true } };
}

Bakım ve duyuru

  • Bakım tüm oyunlara ya da seçili oyunlara, tüm sitelere ya da seçili sitelere uygulanabilir; hemen ya da planlı (bas / bit).
  • Bakım başlayınca yeni tur açılmaz (açık tur normal biter, sıradaki bahisler iade edilir), /api/ac 503 bakim döner, oyuncu ekranında "Kısa süreli bakım" kartı çıkar, katalogda durum:"bakim" görünür ve oyun.durum + bakim.basladi bildirimleri gider. Bitince tersi olur.
  • Duyurular bildirimle, iş ortağı paneli şeridinde ve isteğe bağlı oyun içi şeritte görünür.

Oyun kuralları ve adalet

Tur

  • Bahis fazı (varsayılan 5 sn) → uçuş → çöküş (varsayılan 3 sn bekleme) → yeni tur.
  • Oyuncunun iki bahis kutusu vardır; her kutuya turda bir bahis. Otomatik bırakma çarpanı 1.01 ile grubun oto tavanı arasındadır.
  • Uçuş sırasında basılan bahis sonraki tura sıraya girer; para o tur başlarken çekilir. İptal yalnız bahis fazında mümkündür.
  • Çarpan zamanla üstel büyür: m(t) = floor(100 · e^(k·t)) / 100, k = ln 2 / ikiKatSaniye (varsayılan 6 sn'de 2.00x).
  • Bırakma sunucu saatiyle hesaplanır: kazanç = min(floor(bahis × m), enÇokKazanç, günlük tavandan kalan).
  • Turun çöküş noktası tektir ve oyuncuya göre asla değişmez.

RTP

RTP = 100 − kasaPayi (varsayılan kasaPayi 3 → RTP %97) P(çöküş ≥ x) = (1 − e) / x e = kasaPayi / 100

Hangi çarpanda bırakılırsa bırakılsın beklenen dönüş x · (1 − e) / x = 1 − e olur; RTP oyuncu stratejisinden bağımsızdır. Çarpan tavanı ve risk grubu kazanç sınırları RTP'yi çok az düşürebilir. Kasa payı tur açılırken belirlenir ve tur boyunca herkes için aynıdır.

Çöküş formülü

h = HMAC-SHA256(anahtar = sunucuTohumu, ileti = istemciTohumu) özetinin ilk 52 biti çöküş = max(1.00, floor(100 · (1 − e) · 2^52 / (2^52 − h)) / 100), sonra min(tavan)
  • Sunucu tohumu gizli bir sırdan türetilir ve veritabanında saklanmaz. Tur açılırken yalnız SHA-256 özeti (tohumOzet) yayınlanır; tohumun kendisi tur bitince açıklanır. Tur bitmeden hiç kimse, panel dahil, çöküşü bilemez.
  • İstemci tohumu: turun ilk üç bahsindeki oyuncu tohumları bahis sırasıyla | ile birleştirilip SHA-256 alınır; bahis yoksa sha256("zflow"). Uçuş başlarken sabitlenir.

Doğrulama adımları

  1. Özeti not edinTur açılırken oyundaki Provably Fair menüsünde görünen tohumOzet'i alın.
  2. Tohumları alınTur bitince GET /api/dogrula?tur=<no>&operator=<kod> ile tohum, istemciTohum, kasaPayi, tavan değerlerini okuyun.
  3. Özeti denetleyinsha256(tohum) değeri, turdan önce gördüğünüz tohumOzet ile aynı olmalıdır.
  4. Çöküşü hesaplayınFormülü kendiniz çalıştırın (aşağıda) ya da saf hesap ucunu kullanın; sonuç turdaki çöküşle aynı olmalıdır.
import { createHash, createHmac } from 'node:crypto';

export function cokus(sunucuTohumu, istemciTohumu, kasaPayi, tavan = 10000) {
  const d = createHmac('sha256', sunucuTohumu).update(istemciTohumu).digest();
  let h = 0n;
  for (let i = 0; i < 7; i++) h = (h << 8n) | BigInt(d[i]);
  h >>= 4n;                                                  // ilk 52 bit
  const N = 1n << 52n, pay = BigInt(Math.round(kasaPayi * 100));
  let k = ((10000n - pay) * N) / (100n * (N - h));          // çarpan × 100, aşağı yuvarlı
  const t = BigInt(Math.max(100, Math.round(tavan * 100)));
  if (k < 100n) k = 100n;
  if (k > t) k = t;
  return Number(k) / 100;
}
export const tohumOzeti = (tohum) => createHash('sha256').update(tohum).digest('hex');
export const istemciTohumu = (bahisTohumlari) =>
  createHash('sha256').update(bahisTohumlari.length ? bahisTohumlari.slice(0, 3).join('|') : 'zflow').digest('hex');

// test vektörü → 16.65
cokus('7c2e0b5a9d41f3e8a6b1c0d9e2f3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5', istemciTohumu([]), 3, 500);

Not: tohumlar HMAC'e onaltılık dizgi olarak (UTF-8 metin) girer, ikili değere çevrilmez.

RTP, sınırlar ve risk grupları

Her operatörün kendi ayarı vardır. Varsayılanlar temkinlidir; ayarları iş ortağı panelinden ya da yönetim ucundan (PUT /api/yonetim/ayar) değiştirirsiniz. Her değişiklik önce/sonra/kim bilgisiyle geçmişe yazılır ve en geç 15 saniyede, tur içinde değil bir sonraki turdan etkinleşir. Tutarlar kuruştur; aşağıdaki ₺ karşılıkları TRY içindir.

RTP seçenekleri

Sağlayıcı her oyun için izinli RTP seçeneklerini belirler; siteniz bunlardan birini seçer (iş ortağı paneli → Oyunlar). kasaPayi = 100 − RTP. Seçim değişince oyun.guncellendi bildirimi gider ve katalogdaki rtp güncellenir. Oyuncu bazlı RTP yoktur: tur herkes için ortaktır.

Oyunİzinli RTPVarsayılan
Hürkuş K-VI (hurkus)%95 · %96 · %97%97 (kasaPayi 3)

Sınırlar yalnız sıkılaştırılabilir. Risk grupları, çarpan tavanı, tur ve pozisyon tavanı ile günlük tavan için Anka sitenize bir üst sınır koyar. Siz bu değerleri yalnız aşağı çekebilirsiniz; sunucu min(site, sağlayıcı) uygular ve üst sınırı aşan değeri reddeder.

Genel ayarlar

AyarAralıkVarsayılanAnlamı
acikbooleantrueKapalıysa tur açılmaz, oyuncu "kısa süreliğine kapalı" kartını görür.
kasaPayi0,5–15 (%)3Kasa payı; RTP = 100 − kasaPayi. Yalnız izinli RTP seçeneklerine karşılık gelen değerler (Hürkuş: 3, 4, 5).
kasaPayiSaatlik24 değer | nullnullİstanbul saatine göre saat başına kasa payı; tur açılırken o saatin değeri alınır ve turda sabittir.
ikiKatSaniye3–12 sn6Çarpanın 2.00x'e ulaşma süresi; oyunun hızı.
bahisSuresiSn3–15 sn5Her turdan önce bahis alınan süre.
cokusBeklemeSn2–6 sn3Çöküşten sonra yeni tura kadar bekleme.
carpanTavani2–10000500Bir turun ulaşabileceği en yüksek çarpan.
turEnCokBahisAdet10–50001000Bir turda alınacak en çok bahis sayısı.
turEnCokBahisTutarkuruş5.000.000 (50.000 ₺)Bir turda alınacak toplam bahis tutarı.
pozisyonTavanikuruş20.000.000 (200.000 ₺)Turdaki açık bahislerin en kötü durumda ödeyebileceği toplam; aşacak yeni bahis alınmaz.
devralmaEsigiSn5–120 sn20Arıza sonrası uçuştaki tur bu süreden eskiyse iptal edilir ve bahisler iade edilir.
hizliTutarlar4 × kuruş10 · 20 · 50 · 100 ₺Bahis kutusundaki hızlı tutar düğmeleri.
hiz.bahisDk5–60060Oyuncunun dakikada koyabileceği en çok bahis.
hiz.baglantiDk5–60020Dakikada izin verilen en çok bağlantı.
rtpSapmaUyari1–50 puan8Gerçekleşen RTP beklenenden bu kadar saparsa raporda işaretlenir (en az 200 bahis).
buyukKazanckuruş500.000 (5.000 ₺)Bu tutar ve üstü kazanç "büyük kazanç" sesiyle kutlanır ve raporda işaretlenir.
metinleranahtar → metin{}Arayüz metinlerini değiştirir; boş anahtar varsayılan metni kullanır.

Risk grupları

Her oyuncu bir gruptadır: yeni, normal (varsayılan), vip, supheli. Grup /api/ac isteğindeki risk alanıyla ya da PUT /api/yonetim/oyuncu/:kod/risk ile atanır.

Sınıryeninormalvipsupheli
enAzBahis1 ₺1 ₺1 ₺1 ₺
enCokBahis200 ₺1.000 ₺5.000 ₺50 ₺
enCokKazanc2.000 ₺10.000 ₺50.000 ₺500 ₺
carpanTavani200x500x500x50x
otoTavani200x500x500x50x
gunlukKazancTavani10.000 ₺50.000 ₺200.000 ₺2.000 ₺
enAzBahis / enCokBahis
Tek bahsin alt ve üst tutarı.
enCokKazanc
Tek bahiste ödenecek en yüksek kazanç; fazlası ödenmez.
carpanTavani
Grubun ulaşabileceği en yüksek çarpan. Genel tavandan düşükse bahis o çarpanda kendiliğinden bırakılır; elle bırakmada da fazlası ödenmez.
otoTavani
Otomatik bırakma çarpanı için girilebilecek en yüksek değer.
gunlukKazancTavani
Oyuncunun bir günde (İstanbul saati) bu oyundan elde edebileceği en yüksek net kazanç (kazanç − bahis); aşan kısım ödenmez.

Yönetim uçları

Önek /api/yonetim/. Hepsi imzalıdır ve yalnız imzalayan operatörün verisini görür. Başarıda gövde doğrudan nesnedir (tamam alanı yoktur); hata gövdesi {tamam:false, hata, mesaj}. kim alanı değişikliği yapan kişiyi kayda yazar. Alanların tamamı ve örnekler: API başvurusu.

UçAçıklama
GET ozetBugünkü bahis, kazanç, GGR, RTP; açık tur; operatör bilgisi; bekleyen ve vazgeçilen çağrı sayısı.
GET operatorOperatör kaydınız (şifre hariç).
GET ayar{ayar} (bkz. Sınırlar).
PUT ayar{ayar, kim} → {ayar}. Tam ayar gönderin: eksik alanlar mevcut değere değil varsayılana döner (önce GET, sonra PUT). Doğrulanır; bağlı oyunculara yayınlanır.
GET ayar-gecmisi?limit=50[{id, kim, zaman, once, sonra}]
GET turlar?once=<no>&limit=50Tur listesi: çöküş, bahis adedi ve toplamları, tohum özeti.
GET tur/:noTur ayrıntısı (tohumlar, zamanlar) ve turdaki bahisler.
GET rapor?bas=&bit=&kirilim=Tarihler YYYY-MM-DD (İstanbul günü); kırılım gun | saat | oyuncu | risk. {beklenenRtp, satirlar:[{anahtar, bahisAdet, bahisToplam, kazancToplam, ggr, rtp, sapma}]}
GET oyuncular?ara=&risk=&limit=50Oyuncu listesi ve son 7 günün toplamları.
GET oyuncu/:kodOyuncu kartı: risk grubu, son 24 saat, son 20 bahis.
PUT oyuncu/:kod/risk{risk, kim} → {tamam, risk}
GET mutabakat?limit=100Bekleyen, vazgeçilen ve reddettiğiniz kazanç/iade çağrıları: [{id, olay, seri, bahisId, tutar, deneme, hata, olusturma, durum}]
GET varliklarSes ve görsel yuvaları (logo, uçak, arka plan, sesler).
PUT varlik/:yuvaİkili gövde (Content-Type dosya türü), başlık X-Zflow-Varlik-Meta: {"kim":"…","acik":true,"ses":0.8}. Bu istekte imza boş gövde üzerinden hesaplanır.
PATCH varlik/:yuva{acik?, ses?, kim}
DELETE varlik/:yuva?kim=Varsayılana döner (kim şu an kayda yazılmaz).
GET tema{tema, font, ad, metinler}
PUT tema{tema?, font?, ad?, metinler?, kim}

Mutabakat ve GGR ekstresi

Günlük mutabakat

  • Defterinizdeki Hürkuş hareketlerini günlük olarak GET /api/yonetim/rapor?kirilim=gun toplamlarıyla karşılaştırın (İstanbul günü).
  • GET /api/yonetim/mutabakat listesi boş olmalıdır. Buradaki kayıtlar size ulaşmamış ya da reddettiğiniz kazanç/iade çağrılarıdır; sağlayıcıyla birlikte kapatılır.

GGR

GGR = Σ bahis − Σ kazanç

Yalnız sonuçlanmış bahisler (bırakılan ya da kaybeden) sayılır. İade edilen ve reddedilen bahisler ile demo oturumları GGR'ye girmez. Test kipindeki operatörler ekstreye girmez.

Aylık ekstre

Her takvim ayı (YYYY-MM) için operatör başına bir ekstre satırı hesaplanır. Dönemler İstanbul saatine (Europe/Istanbul) göre kesilir.

matrah = max(0, GGR + devreden) hakediş = floor(matrah × oran / 100) sonraki devir = min(0, GGR + devreden)
  • oran: sözleşmenizdeki sağlayıcı payı (%).
  • Eksi GGR devreder: bir ay oyuncular kasadan fazla kazanırsa eksi tutar sonraki ayın GGR'sinden düşülür; eksi ay için hakediş sıfırdır.
  • Ay bitmeden ekstre canlı hesaplanır. Ay bittikten sonra sağlayıcı satırı kesinleştirir: bir kez yazılır ve değişmez; devreden bir önceki kesin ekstreden gelir.
Örnek (oran %10)GGRDevredenMatrahHakedişSonraki devir
Ekim−40.000 ₺0 ₺0 ₺0 ₺−40.000 ₺
Kasım100.000 ₺−40.000 ₺60.000 ₺6.000 ₺0 ₺

API başvurusu

Bu bölüm openapi.json dosyasından oluşturulur. Her uçta alanlar, örnek istek (cURL, Node.js, PHP, Python; imza kodu dahil), örnek cevaplar ve isteği tarayıcıda imzalayıp gönderen Dene paneli vardır.

Dene paneli yalnız test içindir. Sunucu docs.ormicast.store kökeninden gelen tarayıcı isteklerini yalnız test kipindeki operatörler için kabul eder. Şifre yalnız bu sekmenin oturum belleğinde (sessionStorage) tutulur ve sekme kapanınca silinir. IP izni listeniz doluysa tarayıcınızın çıkış IP'si de listede olmalıdır.

API başvurusu yükleniyor…

Hata kodları

API cevapları

API uçları hatada uygun HTTP durumu ve {tamam:false, hata, mesaj} gövdesi döner.

HTTPhataAnlamı
400gecersizAlan doğrulaması başarısız; mesaj alanı ve kuralı söyler.
400govde_bozukGövde JSON olarak çözülemedi.
400para_birimiİstekteki para birimi kaydınızdakiyle aynı değil.
401imzaBaşlık yok, operatör tanınmadı ya da imza tutmadı. mesaj: X-Zflow-Operator başlığı yok, operatör ya da imza tanınmadı, imza_yok, zaman_gecersiz, imza_tutmadi, eski_zaman.
401oturum_yokOyuncu jetonu geçersiz ya da süresi doldu (oyun ekranı uçları).
403kapaliOperatör kaydı kapalı.
403ipİstek izinli olmayan bir IP adresinden geldi.
404bulunamadiTur, oyuncu ya da uç bulunamadı.
415gecersizGövde application/json değil.
503bakimOyun bakımda (/api/ac, /api/demo); gövdede mesaj ve varsa bitis.
500kaynak_hatasiBeklenmeyen sunucu hatası; yeniden deneyin, sürerse destekle iletişime geçin.

Cüzdan cevap kodları

yetersiz · oyuncu · imza · gecici · para_birimi · red — ayrıntı: Cüzdan cevap biçimi.

Oyuncunun gördüğü bahis retleri

Destek ekibiniz için: oyuncunun bahsi oyun içinde şu sebeplerle alınmayabilir.

KodOyuncuya gösterilen
kapaliOyun şu anda kapalı
bahis_kapaliBahis alınmıyor
tutarTutar sınırların dışında
otoOtomatik bırakma çarpanı geçersiz
pozisyonBu tur için bahis sınırına ulaşıldı
tur_doluBu turda daha fazla bahis alınmıyor
kutu_doluBu kutuda zaten bahsiniz var
hizÇok hızlı bahis; biraz bekleyin
yetersizBakiye yetersiz
bakimKısa süreli bakım · bitiş saati
redBahis kabul edilmedi (ya da cüzdanınızın mesajı)
geciciGeçici bir sorun oldu, yeniden deneyin

Sürüm notları

SürümTarihDeğişiklik
v1.005.11.2026İlk yayın: HMAC imza, /api/ac (kısa /o/<jeton> açılış adresi, 503 bakim), /api/demo ve açık demo linki, /api/katalog (durum, surum, guncelleme, ETag / 304), /api/dene, /api/dogrula; cüzdan geri çağrıları (bakiye, bahis, kazanc, iade) ve yeniden deneme takvimi; olay bildirimleri (oyun.*, bakim.*, duyuru, anahtar.yenilendi, deneme); RTP seçenekleri, operatör ayarları ve risk grupları; yönetim uçları; aylık GGR ekstresi; iş ortağı paneli; OpenAPI 3.1, Postman koleksiyonu ve tarayıcıda Dene paneli.

Durum

Durum denetleniyor… · https://api.ormicast.store/saglik → {"durum":"ok"}

İzleme sisteminize bu adresi ekleyin: durum ok ise API trafik alıyordur; kapaniyor (HTTP 503) bir kopyanın yayın sırasında devreden çıktığını gösterir.