Ana içeriğe geç

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 HttpURLConnectionPATCH 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.