# Nexium Interactive API v1

Nexium Interactive site entegrasyon dökümanı. Oyunlar Nexium’dan; entegratörler yalnızca bizim `/v1` uçlarına bağlanır.

**Base URL (canlı):** `https://api.nexiumapicasino.world/api/v1`  
**Base URL (local):** `http://localhost/api/v1`  
**Doküman:** `https://docs.nexiumapicasino.world`  
**Panel:** `https://panel.nexiumapicasino.world`  
**Callback hub:** `https://api.nexiumapicasino.world/callback/`

**Auth:** `Authorization: Bearer {site_api_key}`  

**Cevap şekli:** `{ "code": 0, "message": "OK", "data": ... }`

Boş body gereken POST’larda `{}` gönderin. Tüm katalog uçları (`/providers`, `/games`) hem `POST` hem de `GET` sorgularını destekler.

---

## Hızlı başlangıç

1. Panelden API key alın (Sandbox veya canlı site).
2. `GET /v1/health` ile servis durumunu kontrol edin.
3. Canlı Casino, Sanal Oyunlar veya Slot sağlayıcılarını `POST /v1/providers` veya `GET /v1/providers?type=live` ile çekin.
4. Oyun listesini kategoriye göre filtreleyerek çekin (`POST /v1/games` ile `{"category": "Live"}` veya `{"category": "Slots"}` veya `{"category": "[VIRTUALS]"}`).
5. Oyuncu lobideyken `POST /v1/warm` ile kullanıcı oturumunu ısıtın.
6. Tıkta `POST /v1/launch` ile oyun URL alın (`provider_id` katalogdan otomatik çözülür).
7. Oyun görsellerini Nexium CDN path’ten kullanın (`/assets/games/{provider}/{symbol}.webp`).

**Kasa & Kredi Havuzu:** Launch ve site bakiyesi Nexium merkezi kredi havuzundan yönetilir. Bakiye tükendiğinde → `40202 SITE_CREDIT_EMPTY`. Altyapıya erişilemezse → `50302 PROVIDER_BALANCE_UNAVAILABLE`.

---

## Endpoint’ler

### GET `/v1/health`

Auth yok. Bakım ve bağımlılık durumu.

### POST `/v1/warm`

Kullanıcıyı önceden Nexium oyun motorunda oluşturur ve eşleme önbelleğine alır.

**Body:**
```json
{
  "username": "player1"
}
```

---

### POST / GET `/v1/providers`

Size tanımlı oyun sağlayıcılarını listeler. `type` parametresi ile Canlı Casino (`live`), Sanal Oyunlar (`virtual`) veya Slot (`slot`) filtrelemesi yapılabilir.

**Body (POST) / Query (GET):**
```json
{
  "type": "live"
}
```
*(Tüm sağlayıcıları almak için `{}` gönderin veya parametre vermeyin)*

**Örnek Yanıt:**
```json
{
  "code": 0,
  "message": "OK",
  "data": {
    "providers": [
      {
        "code": "6",
        "name": "Evolution",
        "type": "live"
      },
      {
        "code": "10",
        "name": "Dream Gaming",
        "type": "live"
      },
      {
        "code": "11",
        "name": "Asia Gaming",
        "type": "live"
      },
      {
        "code": "1",
        "name": "Pragmatic Play",
        "type": "slot"
      }
    ]
  }
}
```

---

### POST / GET `/v1/games`

Tüm oyun kataloğunu listeler. Canlı Casino (`Live`), Slot (`Slots`), Sanal Oyunlar (`[VIRTUALS]` / `Virtuals`) veya Mini Oyunlar (`Mini`) bazında ya da sağlayıcı koduna göre filtrelenebilir.

**Body (POST) / Query (GET):**
```json
{
  "category": "Live",
  "provider_code": "6"
}
```
*(Filtreleme seçenekleri: `category`: `"Live"` | `"Slots"` | `"[VIRTUALS]"` | `"Mini"`, `provider_code`: sağlayıcı ID/kodu örn. `"6"`, `"1"`, `"30"`)*

**Örnek Yanıt (Canlı Casino):**
```json
{
  "code": 0,
  "message": "OK",
  "data": {
    "games": [
      {
        "provider_code": "6",
        "provider_name": "Evolution",
        "provider_type": "live",
        "game_symbol": "crazytime",
        "game_name": "Crazy Time",
        "category": "Live",
        "type": "live",
        "game_image": "https://api.nexiumapicasino.world/assets/games/6/crazytime.webp",
        "launch_enable": true
      },
      {
        "provider_code": "6",
        "provider_name": "Evolution",
        "provider_type": "live",
        "game_symbol": "lightningroulette",
        "game_name": "Lightning Roulette",
        "category": "Live",
        "type": "live",
        "game_image": "https://api.nexiumapicasino.world/assets/games/6/lightningroulette.webp",
        "launch_enable": true
      }
    ]
  }
}
```

---

### POST `/v1/launch`

Slot, Canlı Casino ve Sanal Oyunları başlatır. `provider_id` opsiyoneldir; `game_symbol` üzerinden otomatik bulunur.

**Body:**
```json
{
  "username": "player1",
  "game_symbol": "vs20olympgate",
  "lang": "tr",
  "home_url": "https://yoursite.example/",
  "balance": 500.00
}
```

| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| `username` | string | Evet | Kullanıcı adı (maks 120 kar.) |
| `game_symbol` | string | Evet | Oyun sembolü (örn: `crazytime`, `vs20olympgate`, `210`) |
| `provider_id` | int | Hayır | Sağlayıcı ID. Verilmezse katalogdan otomatik çözülür |
| `lang` | string | Hayır | Dil kodu (`tr`, `en`, `de`, `ru`, varsayılan `tr`) |
| `home_url` | string | Hayır | Oyundan çıkış tıklandığında dönülecek URL |
| `balance` | float | Hayır | Oyuncunun oyuna başlarkenki anlık bakiyesi |

**data:**
```json
{
  "url": "https://...",
  "gplay_id": null,
  "warm": true,
  "launch_ms": 42
}
```

---

### POST `/v1/user` · `/v1/wallet` · `/v1/wallet (read-only)` · `/v1/wallet (read-only)` · `/v1/transactions`

- `/v1/user`: `{ "username": "player1" }` ile kullanıcı sorgulama / oluşturma.
- `/v1/wallet`: Kullanıcı bakiyesi sorgulama.
- `/v1/wallet (read-only)` / `/v1/wallet (read-only)`: `{ "username", "amount", "trans_guid" }` (idempotent `trans_guid`).
- `/v1/transactions`: Nexium ledger hareket geçmişi.

---

### POST / GET `/v1/callback/url`

Sitenin kendi callback adresini sorgulaması ve güncellemesi:

**Body (POST):**
```json
{
  "callback_url": "https://yoursite.example/api/callback"
}
```

**data:** `{ "callback_url": "https://yoursite.example/api/callback" }`

---

### POST `/v1/freespin/create`

Promosyon ve Freeround tanımlama servisi.

```json
{
  "username": "player1",
  "game_symbol": "vs20olympgate",
  "provider_id": 1,
  "spins": 5,
  "bet_amount": 1,
  "win": 500
}
```

`provider_id` yoksa katalogdan çözülür.

**data:** `{ "id", "ref", "status": "active", "mode": "upstream" }` — `ref` = freeround referansı.

### POST `/v1/freespin/cancel`

`{ "id": 1 }` veya `{ "ref": "<fr_id>" }`

### POST `/v1/bonus-call/start`

Oyun bonus tetikleme servisi. **Aktif oyun oturumu gerekir** (`gplay_id`).

```json
{
  "gplay_id": 19490613,
  "set_point": 1000,
  "memo": "",
  "username": "player1",
  "game_symbol": "vs20olympgate"
}
```

`gplay_id` + `set_point` zorunlu. Panel “Aktif oyuncular” listesinden alınır.

### POST `/v1/bonus-call/cancel`

`{ "id": 1 }` veya `{ "ref": "<call_id>" }` / `{ "call_id": 554866 }`

---

## Canlı Casino Entegrasyonu & Callback Detayları

Canlı Casino oyunlarında (Evolution, Dream Gaming, Asia Gaming) oyun döngüsü slot oyunlarından farklı olarak krupiye kararları ve masa iptalleri içerebilir:

1. **İptal / Rollback (`cancel` komutu):**  
   Masa arızası, oyun iptali veya krupiye kararıyla iade edilen bahisler için callback adresinize `command: "cancel"` gönderilir:
   ```json
   {
     "command": "cancel",
     "user_code": "player1",
     "bet_trans_guid": "guid-of-original-bet",
     "amount": 50.00,
     "game_type": "live",
     "round_id": "981247192"
   }
   ```
   Entegratörün daha önce kesilen tutarı iade etmesi ve güncel bakiyeyi dönmesi gerekir.
2. **`game_type: "live"` Alanı:**  
   Hem `bet` hem de `win` isteklerinde oyunun canlı olduğunu belirten `"game_type": "live"` parametresi yer alır.
3. **Milisaniye SLA:**  
   Canlı oyunlarda bahis kapanış süreleri kısıtlıdır; callback uçlarınızın 500ms altında yanıt vermesi zorunludur.

---

## RTP Yapılandırması

RTP oranları Nexium Admin Panel üzerinden yönetilir:
`POST /panel-api/admin-ops/sites/{id}/rtp` `{ "rtp": 95 }` (oturum + CSRF).

Güncel değer `GET .../sites/{id}/balance` → `rtp` alanı üzerinden okunabilir.

---

## Callback Hub (Nexium → Siteniz)

URL: `https://api.nexiumapicasino.world/callback/`  
Header: `Authorization: Bearer {site_api_key}` veya `X-Nexium-Token: {site_api_key}`

Komutlar: `authenticate`, `balance`, `bet`, `win`, `cancel`, `status`

Başarı: `{ "result": 0, "status": "OK", "data": { "balance": 1500.50 } }`  
Auth fail: `{ "result": 1, "status": "TOKEN_INVALID", "message": "Geçersiz token" }`

---

## Hata kodları (özet)

| code | Anlam |
|---|---|
| 0 | OK |
| 40101 | TOKEN_INVALID |
| 40202 | SITE_CREDIT_EMPTY |
| 40301 | SITE_FROZEN |
| 42200 / 42201 | PARAMETERS_INVALID |
| 50002 | SITE_CONFIG_MISSING |
| 50201 | PROVIDER_ERROR |
| 50301 | PROVIDER_UNAVAILABLE |
| 50310 | MAINTENANCE |

---

## Güvenlik

- API Key’i yalnızca sunucu tarafında saklayın; tarayıcıya veya mobil client içine kesinlikle gömmeyin.
- Callback isteklerinde IP doğrulamasını ve token kontrolünü aktif tutun.
- Production ortamında tüm callback ve API trafiği TLS 1.3 / HTTPS üzerinden yürütülür.
