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.
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.
https://DiamondIPTV.com
Ornek local ortam:
http://localhost:3030
Butun partner endpointlerinde su headerlar kullanilir:
x-partner-key: YOUR_PARTNER_KEY
x-partner-secret: YOUR_PARTNER_SECRET
Bu bilgiler browser tarafina acik edilmemelidir.
embedUrl veya playerUrl ile iframe acar.live.json formatinda sunulur; alt playlistler opaque .m3u8, segmentler opaque .jpg asset URL’lerle akar.| 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 |
GET /api/health
Bu endpoint servis durumunu kontrol etmek icin kullanilir.
{
"ok": true,
"service": "streaming-gateway-mvp",
"now": "2026-04-12T12:00:00.000Z"
}
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.
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"
}
}
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
}
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"
]
}
GET /api/partner/events ile event listesini ceker.externalEventId veya id ile esler.POST /api/partner/session cagirir.embedUrl frontend iframe alanina yazilir.Partner tarafinda ekstra panel, billing veya operasyon endpoint’i implement etmeniz gerekmez.
Onerilen kullanim sekli budur.
<iframe
src="https://DiamondIPTV.com/embed/sess-xxxx"
width="100%"
height="640"
frameborder="0"
allowfullscreen></iframe>
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.
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;
}
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;
}
m3u8 partnera verilmez.Bazi eventlerde her session acilisinda partner lisans bakiyesinden dusum yapilabilir.
Bu durumda response icinde:
"chargedAmount": 250,
"remainingLicenseBalance": 29750
Partner bazli ayni anda izleyici limiti uygulanabilir.
Limit doluysa session create reddedilir.
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 |
| 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 |
/api/partner/session cagirir.embedUrl iframe’e yazilir.En basit saglam model budur.