Partner Streaming API Documentation

Bu dokuman partner site veya sportsbook entegrasyon ekibi icindir. Amac, canli mac yayinlarini guvenli sekilde acmak, sadece yetkili kullanicilara yayin vermek ve iframe player entegrasyonunu standart hale getirmektir.

REST API Iframe Embed Session Based Playback Optional Login Flag Optional Balance M3U8 / RTMP Supported Betco Ready Flow

1. Kisa Ozet

Partner site ham stream linki kullanmaz. Bunun yerine once bu API uzerinden event bilgisi alir, sonra belirli bir kullanici icin playback session olusturur ve son olarak donen embedUrl veya playerUrl ile iframe/player acar.

Onerilen entegrasyon modeli: partner frontend degil, partner backend bu API ile gorussun.

2. Base URL

https://DiamondIPTV.com

Ornek local ortam:

http://localhost:3030

3. Authentication

Butun partner endpointlerinde su headerlar kullanilir:

x-partner-key: YOUR_PARTNER_KEY
x-partner-secret: YOUR_PARTNER_SECRET

Bu bilgiler browser tarafina acik edilmemelidir.

4. Entegrasyon Akisi

  1. Partner backend event listesini ceker.
  2. Kullanici maca tikladiginda partner backend secilen event icin access check veya direkt session create cagirir.
  3. Sistem domain, lisans bakiyesi, concurrency ve kullanici kurallarini kontrol eder.
  4. Basarili ise session uretilir.
  5. Partner frontend, donen embedUrl veya playerUrl ile iframe acar.
  6. Player Clappr tabanli playback akisini baslatir ve kendi playback cookie ile session baglamini olusturur.
  7. Top-level playlist URL’si session bazli live.json formatinda sunulur; alt playlistler opaque .m3u8, segmentler opaque .jpg asset URL’lerle akar.

5. Partner Tarafindan Gonderilecek Veri

Alan Durum Aciklama
eventId Zorunlu Izlenmek istenen mac/event kimligi
domain Onerilir Partner site domain bilgisi, whitelist kontrolu icin kullanilir
user.id Zorunlu Session ve audit log icin gerekli
user.isLoggedIn Opsiyonel Gonderilirse kontrol edilir. false ise login-required event reddedilir. Gonderilmezse sadece bu alan eksik diye bloklanmaz.
user.balance Opsiyonel Balance rule aktif eventlerde kullanilabilir. Gonderilmezse bu alan uzerinden kontrol yapilmaz.
user.creditLimit Opsiyonel Kredi limiti kurali varsa kullanilir
user.userName Opsiyonel Support veya watermark gibi gelecekteki ozellikler icin kullanilabilir

6. Health Check

GET /api/health

Bu endpoint servis durumunu kontrol etmek icin kullanilir.

{
  "ok": true,
  "service": "streaming-gateway-mvp",
  "now": "2026-04-12T12:00:00.000Z"
}

7. Event Listeleme

GET /api/partner/events

Partnerin gorebilecegi event listesini dondurur.

curl -X GET https://DiamondIPTV.com/api/partner/events \
  -H "x-partner-key: YOUR_PARTNER_KEY" \
  -H "x-partner-secret: YOUR_PARTNER_SECRET"

Ornek response:

{
  "ok": true,
  "partner": "Betco Demo",
  "licenseBalance": 28750,
  "eventCount": 2,
  "events": [
    {
      "id": "evt-bcd9e8c2810a",
      "title": "Criciuma vs Botafogo SP",
      "sport": "Football",
      "league": "Serie B",
      "regionName": "Brazil",
      "homeTeam": "Criciuma",
      "awayTeam": "Botafogo SP",
      "startsAt": "2026-04-11T02:30:00+03:00",
      "status": "ended",
      "streamAccessCost": 0,
      "sourceProvider": "mackolik",
      "sourceEventId": "4453723",
      "externalProvider": "betradar",
      "externalEventId": "sr:sport_event:1000001",
      "mappingStatus": "auto-matched"
    },
    {
      "id": "evt-2a0afb178698",
      "title": "Peru (K) vs Uruguay (K)",
      "sport": "Football",
      "league": "Grup Aşaması",
      "regionName": "",
      "homeTeam": "Peru (K)",
      "awayTeam": "Uruguay (K)",
      "startsAt": "2026-04-11T00:00:00+03:00",
      "status": "ended",
      "streamAccessCost": 0,
      "sourceProvider": "mackolik",
      "sourceEventId": "4405971",
      "externalProvider": "",
      "externalEventId": "",
      "mappingStatus": "unmapped"
    }
  ]
}

Not: id bizim session ve access endpointlerinde kullanilacak internal event ID’mizdir. externalEventId doluysa partner bunu kendi taraftaki canonical event kimligiyle eslestirme icin kullanabilir.

8. Event Detayi

GET /api/partner/events/:id

Belirli bir event’in detayini getirir.

curl -X GET https://DiamondIPTV.com/api/partner/events/evt-001 \
  -H "x-partner-key: YOUR_PARTNER_KEY" \
  -H "x-partner-secret: YOUR_PARTNER_SECRET"

Ornek response:

{
  "ok": true,
  "event": {
    "id": "evt-bcd9e8c2810a",
    "title": "Criciuma vs Botafogo SP",
    "sport": "Football",
    "league": "Serie B",
    "regionName": "Brazil",
    "homeTeam": "Criciuma",
    "awayTeam": "Botafogo SP",
    "startsAt": "2026-04-11T02:30:00+03:00",
    "status": "ended",
    "streamAccessCost": 0,
    "sourceProvider": "mackolik",
    "sourceEventId": "4453723",
    "externalProvider": "betradar",
    "externalEventId": "sr:sport_event:1000001",
    "mappingStatus": "auto-matched"
  }
}

9. Access Check

POST /api/partner/check-access

Session olusturmadan once sadece erisim durumunu kontrol etmek isterseniz bu endpoint kullanilir.

Ornek request:

{
  "eventId": "evt-001",
  "domain": "DiamondIPTV.com",
  "user": {
    "id": "user-42",
    "isLoggedIn": true,
    "balance": 1500,
    "creditLimit": 0
  }
}

Ornek response:

{
  "ok": true,
  "allowed": true,
  "reasons": [],
  "requiredLicenseBalance": 250,
  "remainingLicenseBalance": 30000
}

10. Session Create

POST /api/partner/session

Bu endpoint izleme session’i olusturur. Ana entegrasyon endpoint’i budur.

Ornek request:

{
  "eventId": "evt-001",
  "domain": "DiamondIPTV.com",
  "user": {
    "id": "user-42",
    "isLoggedIn": true,
    "balance": 1500,
    "creditLimit": 0
  }
}

Ornek basarili response:

{
  "ok": true,
  "sessionId": "sess-xxxx",
  "token": "signed-token",
  "expiresAt": "2026-04-12T12:15:00.000Z",
  "embedUrl": "/embed/sess-xxxx",
  "playerUrl": "/player/sess-xxxx",
  "activeViewerCount": 0,
  "maxConcurrentViewers": 2,
  "chargedAmount": 250,
  "remainingLicenseBalance": 29750
}

Partner tavsiyesi: event seciminde once externalEventId dolu mu kontrol edin. Doluysa kendi event referansinizla daha rahat eslesirsiniz. Ancak check-access ve session endpointlerine giderken her zaman bizim id alanimizi gonderin.

Ornek hatali response:

{
  "ok": false,
  "message": "Kullanici bu yayini izleyemez.",
  "reasons": [
    "Partner lisans bakiyesi yetersiz. Gerekli: 250, Kalan: 0"
  ]
}

11. Betco Benzeri Minimum Akis

  1. Partner backend GET /api/partner/events ile event listesini ceker.
  2. Partner kendi taraftaki event ile bizdeki eventi externalEventId veya id ile esler.
  3. Kullanici yayin izlemek istediginde partner backend POST /api/partner/session cagirir.
  4. Response icindeki embedUrl frontend iframe alanina yazilir.
  5. Player playback cookie ve proxy akislarini kendisi yonetir.

Partner tarafinda ekstra panel, billing veya operasyon endpoint’i implement etmeniz gerekmez.

12. Iframe Kullanimi

Onerilen kullanim sekli budur.

<iframe
  src="https://DiamondIPTV.com/embed/sess-xxxx"
  width="100%"
  height="640"
  frameborder="0"
  allowfullscreen></iframe>

13. Player URL

Iframe yerine ayri player sayfasi da kullanilabilir.

https://DiamondIPTV.com/player/sess-xxxx

Bu URL de session bagli calisir; tek basina kopyalanmasi genelde yeterli olmaz.

14. Ornek Partner Backend Akisi

async function openStreamForUser(eventId, user, domain) {
  const response = await fetch("https://DiamondIPTV.com/api/partner/session", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-partner-key": process.env.STREAM_PARTNER_KEY,
      "x-partner-secret": process.env.STREAM_PARTNER_SECRET
    },
    body: JSON.stringify({
      eventId,
      domain,
      user: {
        id: user.id,
        isLoggedIn: user.isLoggedIn,
        balance: user.balance
      }
    })
  });

  const payload = await response.json();
  if (!payload.ok) {
    throw new Error(payload.reasons?.join(" | ") || payload.message);
  }

  return payload.embedUrl;
}

15. Ornek Partner Frontend Akisi

async function onWatchClick(eventId) {
  const response = await fetch("/backend/open-stream", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ eventId })
  });

  const payload = await response.json();
  if (!payload.ok) {
    alert(payload.message || "Yayin acilamadi");
    return;
  }

  document.getElementById("stream-iframe").src = payload.embedUrl;
}

16. Playback Koruma Modeli

17. Lisans Bakiyesi

Bazi eventlerde her session acilisinda partner lisans bakiyesinden dusum yapilabilir.

Bu durumda response icinde:

"chargedAmount": 250,
"remainingLicenseBalance": 29750

18. Concurrency

Partner bazli ayni anda izleyici limiti uygulanabilir.

Limit doluysa session create reddedilir.

19. Heartbeat ve Session Close

Bu endpointler player tarafinda sistem tarafindan kullanilir; entegrasyon ekibinin ekstra implement etmesi zorunlu degildir.

Endpoint Amac
POST /api/playback/:sessionId/heartbeat Aktif izleyici takibi
POST /api/playback/:sessionId/close Player kapaninca session’i kapatmak

20. HTTP Status Ozet

Status Anlam
200 Basarili
401 Partner key/secret gecersiz
403 Session olusturulamadi veya playback reddedildi
404 Event veya stream bulunamadi
502 Upstream stream kaynagi gecici hata verdi

21. Onerilen Minimum Entegrasyon

  1. Partner backend event listesini ceker.
  2. Partner kullanicisi maca tiklar.
  3. Partner backend /api/partner/session cagirir.
  4. Donen embedUrl iframe’e yazilir.
  5. Hepsi bu kadar.

En basit saglam model budur.