Abonelikler API
Cihazlar. Public ya da sunucu anahtarı, kapsam subscriptions:write. SDK'ların yaptığı çağrılar bunlardır; yalnızca özel istemci ya da içe aktarım için gerekir.
POST /v1/subscriptions — kaydet (upsert)
İstemci IP'si başına sınırlı. Mobilde (appId, token), web'de (appId, endpoint) ile upsert eder; her açılışta çağırmak doğrudur.
Mobil gövde
{
"platform": "ios", // ya da "android"
"token": "<APNs cihaz token'ı / FCM registration token'ı>",
"externalId": "user_123", // isteğe bağlı → abone olurken login
"tags": { "plan": "premium" }, // isteğe bağlı, kullanıcıya merge
"language": "tr", "timezone": "Europe/Istanbul", "country": "TR",
"appVersion": "3.4.1", "sdkVersion": "0.1.0", "osVersion": "17.5", "deviceModel": "iPhone 15 Pro"
}
Web gövde
{
"platform": "web",
"endpoint": "https://fcm.googleapis.com/fcm/send/…",
"keys": { "p256dh": "…", "auth": "…" },
"browser": "chrome",
"standalone": true, // PWA olarak kurulu
"externalId": "user_123", "tags": {}, "language": "tr", "timezone": "Europe/Istanbul"
}
Yanıt 200
{ "id": "66f1…", "platform": "ios", "userId": "66f2…" }
Yeniden abone olmak çıkmış ya da geçersiz satırı canlandırır. externalId verilirse kimlik kuralları tam login gibi çalışır.
PATCH /v1/subscriptions/:id — cihaz alanları
{ "optedIn": false, "appVersion": "3.5.0", "osVersion": "18.0", "deviceModel": "…" }
Yalnızca cihaz düzeyi. Kişiye dair her şey aşağıdaki /user üzerinden gider; böylece sahip olduğu her cihaza ulaşır. 200 { "id", "optedIn" }.
POST /v1/subscriptions/:id/session — uygulama ön plana geldi
{ "appVersion": "3.5.0", "osVersion": "18.0" }
Gövde isteğe bağlı. lastActiveAt'i yeniler ve önceki oturum 30 dakika ya da daha önce başladıysa sessionCount'u artırıp lastSessionAt'i yazar — OneSignal'ın oturum kuralı, sunucuda uygulanır; SDK'lar her ön plana dönüşte çift sayım korkusu olmadan ping atar. POST /v1/subscriptions (her SDK'nın açılışta koştuğu upsert) aynı kuralı uygular; eski SDK'lı bir uygulama da sayım alır, yalnızca daha kaba.
200 { "id", "sessionCount", "lastSessionAt" }. Sayaçlar segment alanıdır: sessionCount gte 5, lastSessionAt lt -30d.
POST /v1/subscriptions/:id/login
{ "externalId": "user_123" }
200 { "userId": "…", "externalId": "user_123" }. Anonim kullanıcıyı yeniden adlandırır ya da cihazı taşır — bkz. Kimlik.
POST /v1/subscriptions/:id/logout
Gövde yok. 200 { "userId": "<yeni anonim kullanıcı>" }.
PATCH /v1/subscriptions/:id/user — sahip kullanıcının özellikleri
POST olarak da açık (Android'in HttpURLConnection'ı PATCH gönderemez). PATCH /v1/users/:id ile aynı gövde:
{ "tags": { "plan": "platinum", "streak": null }, "language": "tr", "timezone": "Europe/Istanbul", "country": "TR" }
Tag'ler merge; null anahtarı siler. Yazım kullanıcının her cihazına ulaşır. 200 { "userId", "tags" }.
DELETE /v1/subscriptions/:id
204. Cihazı kaldırır; cihazsız kalan anonim sahip de kaldırılır.
POST /v1/subscriptions/rotate — web endpoint'i değişti
Service worker pushsubscriptionchange'de gönderir:
{ "old": "https://…/eski-endpoint", "new": { "endpoint": "https://…/yeni", "keys": { "p256dh": "…", "auth": "…" } } }
200 { "id" } — satır yerinde güncellenir, abone kaybolmaz. Eski endpoint bilinmiyorsa 404.
Hatalar
Bilinmeyen ya da yabancı id için 404 not_found (başka uygulamanın id'si var olmayandan ayırt edilemez), alan ayrıntılı 422 invalid_body, 429 rate_limited.