Geliştiriciler · API v1.0.0
NotiPilot Device API — Geliştirici Dokümanı
API sürümü: 1.0.0 · Base path: /api/v1
NotiPilot, mobil uygulamanızdaki cihazları kaydedip segmentlere ayırmanızı ve NotiPilot paneli üzerinden bu cihazlara push bildirim göndermenizi sağlar. Mobil uygulamanız yalnızca iki endpoint ile konuşur:
| Endpoint | Ne zaman çağrılır? |
|---|---|
POST /api/v1/register-device |
Bildirim izni alındıktan sonra, her uygulama açılışında ve push token değiştiğinde |
POST /api/v1/identify-device |
Kullanıcı giriş yaptığında (cihazı kendi kullanıcı ID'nizle eşleştirmek için) |
Bildirim gönderimi NotiPilot panelinden yapılır; mobil uygulamanın gönderim yapmasına gerek yoktur.
Platform rehberleri
| Platform | Kimler için? |
|---|---|
| Expo | Expo (managed workflow / development build) uygulamaları |
| React Native | Bare / CLI React Native projeleri |
| Flutter | Flutter (Android + iOS) uygulamaları |
| Ionic | Ionic + Capacitor uygulamaları |
| Firebase | Zaten Firebase Cloud Messaging kullanan projeler (tüm teknolojiler) |
| Shopify | Shopify mağazası için mobil uygulaması olanlar (müşteri eşleştirme, e-ticaret segmentleri) |
| Android | Native Android — Java |
| Kotlin | Native Android — Kotlin (View / Jetpack Compose) |
| iOS | Native iOS — Apple Developer / APNs kurulumu ve Objective-C |
| Swift | Native iOS — Swift (UIKit / SwiftUI) |
Sürüm desteği ve versiyonlama politikası
1. Nasıl çalışır?
Mobil uygulama ──(Expo Push Token + cihaz bilgileri)──▶ NotiPilot API
│
NotiPilot paneli ──(başlık, mesaj, segment)──▶ Expo Push Service ──▶ FCM (Android) / APNs (iOS) ──▶ Cihaz
NotiPilot 1.0.0, teslimat için Expo Push Service kullanır. Bu nedenle:
- Her cihazın bir Expo Push Token'ı (
ExponentPushToken[...]) olmalıdır. Expo ve React Native uygulamalarında bu token doğrudanexpo-notificationsile alınır. Native Android/iOS uygulamalarda cihazın FCM/APNs token'ı Expo token'ına dönüştürülür (ilgili rehberlerde adım adım anlatılmıştır). - Uygulamanızın bir Expo (EAS) projesi olmalı ve FCM V1 / APNs kimlik bilgileri bu projeye yüklenmiş olmalıdır (
eas credentials). - NotiPilot paneline uygulamanızı eklerken Expo Project ID ve Expo Access Token bilgilerini girersiniz.
API'ye doğrudan FCM veya APNs token'ı da gönderebilirsiniz (
provider: "fcm" | "apns"). Bu cihazlar kaydedilir ve segmentlerde görünür, ancak 1.0.0 sürümünde bildirim yalnızca Expo token'ı olan cihazlara teslim edilir. Doğrudan FCM/APNs teslimatı yol haritasındadır.
2. Başlamadan önce
- NotiPilot panelinde Uygulama Ekle ekranından uygulamanızı oluşturun.
- Expo Project ID alanına EAS proje ID'nizi (UUID,
app.json→extra.eas.projectId) girin. - Expo Access Token alanına expo.dev → Access Tokens sayfasından oluşturduğunuz token'ı girin. (Expo projenizde "Enhanced Security for Push Notifications" açıksa zorunludur.)
- Mobil uygulamada API'ye gönderdiğiniz
app_id, panelde girdiğiniz Expo Project ID ile birebir aynı olmalıdır. Kayıtlı olmayan birapp_idgönderilirse API404 unknown_appdöner.
3. Genel kurallar
| Konu | Değer |
|---|---|
| Base URL | https://app.notipilot.com/api/v1 |
| Protokol | Yalnızca HTTPS |
| İstek gövdesi | Content-Type: application/json, UTF-8 |
| Kimlik doğrulama | Gerekmez. Cihaz API'si mobil uygulamaya gömülü olduğundan gizli anahtar kullanmaz; app_id gizli bir değer değildir. Yetkilendirme app_id'nin panelde kayıtlı olmasıyla sağlanır. |
| Rate limit | IP başına dakikada 300 istek. Aşılırsa 429 ve Retry-After başlığı döner. |
| Sürüm başlığı | Her yanıtta X-NotiPilot-API-Version: 1.0.0 başlığı bulunur. |
Geriye dönük uyumluluk için
/api/register-deviceve/api/identify-device(sürümsüz) adresleri de v1 ile aynı şekilde çalışır. Yeni entegrasyonlarda/api/v1kullanın.
4. Endpoint'ler
4.1 POST /api/v1/register-device
Cihazı kaydeder veya günceller (upsert). Eşleştirme anahtarı app_id + device_uid ikilisidir; aynı cihaz için tekrar tekrar çağırmak güvenlidir.
İstek alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
app_id |
string (≤255) | ✅ | Paneldeki Expo Project ID |
device_uid |
string (≤191) | ✅ | Kurulum başına kalıcı, benzersiz cihaz kimliği (bkz. Cihaz kimliği) |
token |
string (≤512) | ✅ | Push token. Expo token'ı için format: ExponentPushToken[...] |
platform |
"android" | "ios" | "web" |
✅ | Cihaz platformu |
provider |
"expo" | "fcm" | "apns" |
– | Gönderilmezse token formatından otomatik tespit edilir |
external_id |
string (≤191) | null | – | Kendi sisteminizdeki kullanıcı ID'si. null gönderirseniz eşleştirme kaldırılır (çıkış yapma senaryosu) |
attributes |
object | – | Segmentasyon özellikleri (bkz. Attributes) |
tags |
string[] | – | Serbest etiketler (en fazla 50, her biri ≤64 karakter) |
consent_marketing |
boolean | – | Pazarlama bildirimi onayı. Varsayılan: true |
Örnek istek
curl -X POST "https://app.notipilot.com/api/v1/register-device" \
-H "Content-Type: application/json" \
-d '{
"app_id": "1c2d3e4f-5a6b-7c8d-9e0f-112233445566",
"device_uid": "8f14e45f-ceea-467a-9575-0b3f5c6b2a11",
"token": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
"platform": "android",
"attributes": {
"locale": "tr",
"country": "TR",
"city": "Istanbul",
"app_version": "2.4.0"
},
"tags": ["beta"]
}'
Başarılı yanıt — 200 OK
{
"success": true,
"message": "Device registered successfully",
"device_id": 1234,
"expo_token_id": 567,
"provider": "expo"
}
4.2 POST /api/v1/identify-device
Cihazı kendi kullanıcı ID'nizle (external_id) eşleştirir ve isteğe bağlı olarak attributes/tags günceller. Kullanıcı giriş yaptığında çağırın.
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
app_id |
string | ✅ | Paneldeki Expo Project ID |
device_uid |
string | ✅ | register-device'ta kullandığınız değerle aynı |
external_id |
string (≤191) | ✅ | Sizin kullanıcı ID'niz |
attributes |
object | – | Mevcut attributes ile birleştirilir |
tags |
string[] | – | Gönderilirse mevcut etiketlerin yerine geçer |
consent_marketing |
boolean | – | |
token, platform |
string | – | Cihaz daha önce kaydedilmediyse, bu ikisi gönderildiğinde tam kayıt yapılır |
curl -X POST "https://app.notipilot.com/api/v1/identify-device" \
-H "Content-Type: application/json" \
-d '{
"app_id": "1c2d3e4f-5a6b-7c8d-9e0f-112233445566",
"device_uid": "8f14e45f-ceea-467a-9575-0b3f5c6b2a11",
"external_id": "user_98765",
"attributes": { "gender": "female" }
}'
{ "success": true, "message": "Device identified", "device_id": 1234 }
Cihaz henüz kayıtlı değilse ve token gönderilmediyse cihaz token'sız olarak oluşturulur ("auto_registered": true). Bu cihaza, register-device ile token gönderilene kadar bildirim gitmez.
4.3 GET /api/v1/version
Sağlık kontrolü ve sürüm bilgisi.
{ "success": true, "api_version": "1.0.0", "min_supported_version": "1.0.0" }
5. Attributes ve segmentler
NotiPilot paneli, cihazların attributes değerlerinden otomatik segment üretir (ör. "Türkçe konuşanlar", "İstanbul", "Türkiye + İstanbul"). Konum bazlı segmentler yalnızca country ve city gönderen cihazlar için oluşur. Bu alanları göndermezseniz cihaz yalnızca "Tüm kullanıcılar" gönderimlerine dahil olur.
Standart anahtarlar (panel bunları tanır ve etiketler):
| Anahtar | Format | Örnek |
|---|---|---|
locale |
ISO 639-1 dil kodu (küçük harf) | "tr", "en", "de" |
country |
ISO 3166-1 alpha-2 ülke kodu (büyük harf) | "TR", "DE", "NL" |
city |
Şehir adı, tutarlı yazımla | "Istanbul", "Ankara" |
gender |
male | female | other |
"female" |
Kendi anahtarlarınızı da ekleyebilirsiniz (app_version, plan, favorite_team …).
Kurallar
- En fazla 50 anahtar. Anahtarlar
A-Z a-z 0-9 _ . -karakterlerinden oluşur, en fazla 64 karakter. - Değerler string, sayı, boolean veya
nullolabilir. String değerler en fazla 255 karakter. - Değerlerde
,ve:karakterlerini kullanmayın (segment anahtarlarında ayırıcı olarak kullanılır). - Birleştirme (merge): Gönderdiğiniz attributes mevcut değerlerle birleştirilir; göndermediğiniz anahtarlar korunur. Bir anahtarı silmek için değerini
nullgönderin. attributesalanını hiç göndermezseniz kayıtlı attributes değişmez.- E-posta, telefon, T.C. kimlik no gibi kişisel verileri attributes'a koymayın. Kullanıcıyı eşleştirmek için
external_idkullanın.
Şehir/ülke bilgisini nereden almalı? Cihazın bölge ayarı (locale → ülke) konum izni gerektirmez ve her zaman kullanılabilir. Şehir için; kullanıcının profilindeki şehir (en güvenilir yöntem), konum izni verdiyse reverse-geocoding, ya da kendi backend'inizde IP tabanlı konum tespiti kullanılabilir. Konum izni verilmediğinde de en azından country ve locale göndermeniz önerilir.
6. Cihaz kimliği nasıl üretilmeli?
device_uid alanı için:
- Uygulama ilk açıldığında bir UUID v4 üretin ve kalıcı olarak saklayın (Android:
SharedPreferences/DataStore, iOS: Keychain, Expo:expo-secure-store). - Uygulama güncellemelerinde değişmemeli; uygulama silinip yeniden kurulduğunda değişmesi normaldir.
- IMEI, MAC adresi veya reklam kimliği (IDFA/GAID) kullanmayın.
7. Hata yanıtları
Tüm hata yanıtları aynı yapıdadır:
{
"success": false,
"error": "validation_failed",
"message": "Validation failed",
"errors": { "platform": "Must be one of: android, ios, web" }
}
| HTTP | error |
Anlamı | Ne yapmalı? |
|---|---|---|---|
| 400 | invalid_json |
Gövde geçerli JSON değil | İsteği düzeltin, tekrar denemeyin |
| 400 | validation_failed |
Bir veya daha fazla alan geçersiz; ayrıntılar errors içinde |
İsteği düzeltin, tekrar denemeyin |
| 404 | unknown_app |
app_id NotiPilot'ta kayıtlı değil |
Paneldeki Expo Project ID'yi kontrol edin |
| 429 | rate_limited |
Rate limit aşıldı | retry_after saniye sonra tekrar deneyin |
| 500 | server_error |
Sunucu tarafı hata | Üstel geri çekilme (exponential backoff) ile tekrar deneyin |
İstemci tarafında önerilen yaklaşım: yalnızca 429 ve 5xx durumlarında (ve ağ hatalarında) yeniden deneyin; 4xx hatalarını loglayın.
8. Önerilen akış
- Uygulama açılır →
device_uidokunur (yoksa üretilir). - Bildirim izni istenir (Android 13+ ve iOS'ta zorunlu).
- İzin verildiyse push token alınır →
register-deviceçağrılır (locale/country/city ile birlikte). - Kullanıcı giriş yapar →
identify-deviceçağrılır (external_idile). - Kullanıcı çıkış yapar →
register-device,"external_id": nullile çağrılır. - Push token yenilenirse (
onNewToken/ token listener) →register-devicetekrar çağrılır.
9. Bildirim içeriği
Panelden gönderilen bildirim title, body ve isteğe bağlı JSON data alanlarından oluşur. data içeriği uygulamanıza iletilir; derin bağlantı (deep link) gibi senaryolar için kullanın, örneğin:
{ "screen": "product", "product_id": "12345" }
Android'de bildirimler default kanalına (channelId: "default") gönderilir; uygulamanızda bu ID ile bir bildirim kanalı oluşturun.
10. Değişiklik günlüğü
| Sürüm | Tarih | Değişiklikler |
|---|---|---|
| 1.0.0 | 2026-09 | İlk kararlı sürüm. /api/v1 base path, version endpoint'i, standart hata formatı (error kodları), rate limit, app_id doğrulaması, attributes birleştirme (merge) davranışı. |