Vio eSIM API Referansı
Aynı arka uç üzerinde iki REST yüzeyi: web uygulamamızı ve iOS/Android uygulamalarımızı çalıştıran müşteri API'si, ve Vio eSIM'i programatik olarak satmak için ayrı bir API anahtarıyla doğrulanan Partner API.
https://vioesim.com/api/v1https://vioesim.com/api/public/v1Mobil uygulama kimlik doğrulaması
Web uygulaması ve native uygulamalar aynı oturum sistemini paylaşır — native uygulama çerez yerine sadece token'ın kendisini taşır.
Kayıt olun veya giriş yapın. Her iki uç nokta da kullanıcı nesnesiyle birlikte bir token alanı döner (web uygulamasının kullandığı bir Set-Cookie başlığıyla birlikte). token'ı Keychain'de (iOS) veya Keystore destekli depoda (Android) saklayın.
Geri gönderin her istekte:
Authorization: Bearer <token>Token ömrü: Verildiği andan itibaren 30 gün, ya da /api/v1/auth/logout çağrılana kadar. Yenileme (refresh) token adımı yoktur — süresi dolmak üzere olan bir token, kullanıcıdan tekrar giriş yapmasını isteyerek yenilenir.
Partner API kimlik doğrulaması
Vio eSIM'i kendi sitesi veya uygulaması üzerinden satan dış işletmeler için. Bir partner, normal bir Vio eSIM hesabıdır: bir anahtar üretin Panel → API Anahtarları (tek seferlik gösterim — saklayın, tekrar gösterilmez), sonra her istekte gönderin:
Authorization: Bearer vio_live_sk_...
# or
X-API-Key: vio_live_sk_...Yeni bir anahtar üretmek öncekini anında geçersiz kılar.
Hızlı başlangıç — Partner API
Kataloğa göz atın ve iki çağrıda bir eSIM satın alın:
curl https://vioesim.com/api/public/v1/destinations \
-H "Authorization: Bearer vio_live_sk_..."
curl -X POST https://vioesim.com/api/public/v1/orders \
-H "Authorization: Bearer vio_live_sk_..." \
-H "Content-Type: application/json" \
-d '{ "planId": "cus...", "quantity": 1 }'Hatalar ve hız sınırları
Mobil/Web API { "error": "mesaj" } döner (şu an Türkçe mesajlar). Partner API, code üzerinden dallanabilmeniz için yapılandırılmış bir şekil döner:
{ "error": { "code": "INSUFFICIENT_BALANCE", "message": "Insufficient wallet balance." } }| Durum | Anlamı |
|---|---|
| 401 | Eksik/geçersiz/süresi dolmuş token veya API anahtarı |
| 402 | Sadece Partner API — cüzdan bakiyesi yetersiz |
| 404 | Kaynak bulunamadı veya çağıran tarafından sahiplenilmemiş |
| 409 | Çakışan durum (örn. bakiyesi sıfır olmayan bir hesabı silme) |
| 429 | Hız sınırına takıldı — saniye cinsinden Retry-After başlığına bakın |
| 502 | Ödeme alındı ama eSIM sağlanamadı — ücreti tekrar denemeyin |
Hız sınırları (Partner API): Okuma isteklerinde anahtar başına dakikada 120, POST /orders üzerinde dakikada 30.
Mobil / Web API
Kimlik Doğrulama
Kayıt Ol
Bir hesap ve aktif bir oturum oluşturur.
{
"firstName": "Ada",
"lastName": "Lovelace",
"email": "[email protected]",
"password": "min 8 chars"
}{
"success": true,
"user": {
"id", "firstName", "lastName", "fullName", "email",
"emailVerified", "walletBalance", "currency", "locale", "createdAt"
},
"token": "..."
}Giriş Yap
Gövde: { email, password }. Kayıt ile aynı cevap şekli. Hatalı bilgilerde 401, hesap askıya alınmışsa 403.
Çıkış Yap
Gövde yok. Oturumu sunucu tarafında siler — sadece "token'ı yerelde unut" değil, gerçek çıkışta bunu çağırın, böylece çalınan bir token çalışmaya devam edemez.
Mevcut kullanıcı
Çıkış yapılmışsa { "user": null } döner (asla hata değil) — uygulama açılışında giriş ekranını gösterip göstermeyeceğinize bunu kullanarak karar verin.
Şifremi unuttum
Gövde: { email, locale }. Adresin var olup olmadığına bakılmaksızın her zaman { success: true } döner, böylece hesapları taramak için kullanılamaz. Sıfırlama bağlantılı/token'lı bir e-posta gönderir (1 saat geçerli).
Şifreyi sıfırla
Gövde: { token, newPassword }. Formu göstermeden önce ?token= ile yapılan GET geçerliliği kontrol eder ({ "valid": true|false }).
Şifre değiştir
Gövde: { currentPassword, newPassword }. Hesabın henüz şifresi yoksa (örn. sosyal girişte) currentPassword gerekli değildir.
Hesap
Profili güncelle
Sadece değiştirmek istediğiniz alanları gönderin.
| Field | Notes |
|---|---|
| firstName, lastName | isteğe bağlı · metin |
| preferredCurrency | isteğe bağlı · USD EUR GBP TRY değerlerinden biri |
| locale | isteğe bağlı · 2 harfli kod, örn. tr |
{ "success": true, "user": { ...same shape as /auth/me } }Profil fotoğrafını güncelle
Gövde: { "avatarUrl": "data:image/..." } — base64 data URI, en fazla ~1.5MB.
API anahtarı üret
Bu hesap için önceki anahtarın yerine geçen yeni bir Partner API anahtarı verir. Ham anahtar bu cevapta yalnızca bir kez gösterilir — daha sonra sadece öneki alınabilir.
{
"success": true,
"key": "vio_live_sk_...",
"apiKeyPrefix": "vio_live_sk_ab12…9f8e",
"apiKeyGeneratedAt": "2026-08-22T17:00:00.781Z"
}Hesabı sil
App Store incelemesi için gereklidir (hesap oluşturan uygulamalar uygulama içi silme sunmalıdır). Satırları kalıcı olarak silmek yerine hesabı anonimleştirir (e-posta karıştırılıp yeniden kayda açılır, ad/avatar/şifre temizlenir), böylece geçmiş siparişler vergi/muhasebe kayıtları için saklanır. Kullanıcının tüm oturumlarını ve kayıtlı push cihazlarını yok eder.
Katalog
Destinasyonları listele
Aktif paketlere sahip ülkeler ve bölgeler, fiyatlandırılmış ve arayüz için biçimlendirilmiş (mağazanın kendisinin çağırdığı budur). İsteğe bağlı ?filter=popular|regional|global|<arama metni>.
Destinasyon detayı
ISO koduna göre tek bir ülke için tam detay (açıklama, paketler), örn. /api/v1/destinations/jp.
Satın Almalar
Ödeme
Önce cüzdana para yatırmak yerine doğrudan bir paket satın alır.
| Field | Notes |
|---|---|
| planId* | |
| quantity | isteğe bağlı · 1–10, varsayılan 1 |
| paymentMethod* | wallet | stripe | crypto |
| successUrl, cancelUrl | isteğe bağlı · stripe/crypto yönlendirmeleri için. Düz bir web URL'si değil, evrensel/uygulama bağlantısı kullanın ki yönlendirme uygulamayı yeniden açsın. |
{ "success": true, "orderId": "..." }{ "success": true, "orderId": "...", "url": "https://checkout.stripe.com/..." }Stripe ile cüzdan yükleme
Kartla cüzdana bakiye yükler — Ödeme akışından ayrı bir akıştır. Gövde: { amount (cent, min 200), currency, successUrl, cancelUrl }. { sessionId, url } döner.
Kripto ile cüzdan yükleme
Gövde: { amount (ondalık metin, min $2), currency, url_return }. url dahil Cryptomus fatura nesnesini döner.
Siparişleri listele
Çağıranın en yeniden en eskiye tüm siparişleri.
Sipariş detayı
esimIds dahil tek bir sipariş — tam eSIM detayını (QR, aktivasyon kodu) GET /api/v1/user/esims ile alıp id'ye göre eşleştirin.
eSIM'lerim
Çağıranın sahip olduğu her eSIM: iccid, activationCode, qrCodeUrl, smdpAddress, status, dataUsage/totalVolume (MB), activatedAt, expiresAt. "eSIM'lerim" ekranını ve QR gösterimini bu besler.
Cüzdan geçmişi
/auth/me'de gösterilen cüzdan bakiyesi için para yatırma/çekme/satın alma/iade geçmişi.
Destek
Talepleri listele
Çağıranın en yeniden en eskiye, tüm mesaj dizileriyle birlikte destek talepleri.
Yeni talep
Gövde: { subject, category, message } (category isteğe bağlı).
Talebe yanıt ver
Gövde: { message }. RESOLVED/CLOSED bir talebe yanıt vermek otomatik olarak yeniden açar.
Push bildirim cihazları
Sadece cihaz token'larını kaydeder — bildirim göndermek için APNs/FCM kimlik bilgileri gerekir, aşağıdaki uyarıya bakın.
Cihazı kaydet
Bir APNs veya FCM token'ı aldıktan sonra çağırın. Gövde: { platform: "IOS"|"ANDROID", pushToken, appVersion }. Token'a göre upsert yapar, bu yüzden her uygulama açılışında tekrar çağırmak sorunsuzdur ve önerilir (token'lar değişebilir).
Cihaz kaydını sil
Gövde: { pushToken }. Paylaşılan/sıfırlanan bir cihazın başka bir kullanıcının bildirimlerini almaya devam etmemesi için çıkışta çağırın.
Partner API
Aşağıdakilerin tümü yukarıda açıklanan API anahtarı başlığını gerektirir — burada oturum çerezi geçerli değildir.
Katalog
Destinasyonları listele
Partnere yönelik bir şekilde tam katalog (mağazanın arayüz şekli değil).
{
"countries": [
{
"code": "JP",
"name": { "en": "Japan", "tr": "Japonya", "...": "..." },
"flagEmoji": "🇯🇵",
"continent": "Asia",
"plans": [
{ "id": "cus...", "dataAmountMb": 1024, "durationDays": 7, "priceUsd": 4.25, "isTopUp": false }
]
}
],
"regions": [ { "code": "...", "name": {...}, "countryCount": 15, "plans": [...] } ]
}Destinasyon detayı
ISO koduna göre tek bir ülke (örn. /api/public/v1/destinations/JP), yukarıdakiyle aynı paket şekli.
Siparişler
Sipariş oluştur
Çağıranın cüzdan bakiyesinden düşerek bir paket satın alır ve eSIM'i eşzamanlı olarak sağlar — cevap, son müşterinize vermeye hazır QR/aktivasyon verisini zaten içerir. Normal senaryoda yoklama (polling) gerekmez.
{ "planId": "cus...", "quantity": 1 }{
"id": "...", "orderNumber": "VIO-API-...", "status": "COMPLETED", "amountUsd": 4.25,
"esims": [
{ "id": "...", "iccid": "...", "activationCode": "...",
"qrCodeUrl": "https://...", "smdpAddress": "...", "status": "PENDING" }
]
}Siparişleri listele
İsteğe bağlı ?limit= (varsayılan 25, en fazla 100). Özet şekli — eSIM verisi için detay uç noktasını kullanın.
Sipariş detayı
Her eSIM'in QR/aktivasyon verisi ve canlı kullanımı (dataUsageMb / totalVolumeMb) dahil tam sipariş detayı — müşterinize kalan verisini göstermek için bunu yoklayın.
Cüzdan
Cüzdan bakiyesi
Büyük bir sipariş grubu vermeden önce yoklayın veya bakiye azaldığında kendinizi uyarın.
{ "balanceUsd": 128.40, "currency": "USD" }Henüz yapılmayanlar
Böylece burada, çalışmadığı halde çalışıyor varsayılan bir şey olmuyor.
Push bildirim gönderimi
Token kaydı çalışıyor; gerçekten göndermek için APNs/FCM kimlik bilgileri gerekiyor.
Partnere özel fiyatlandırma
Partner API şu anda mağazayla aynı perakende fiyatı uygular. Toptan/anlaşmalı fiyatlandırma bir şema değişikliği ve bir iş kararı gerektirir.
Yenileme token'ları
Oturumlar, kısa ömürlü erişim + yenileme token'ı çifti değil, uzun ömürlü (30 gün) düz token'lardır. Şimdilik yeterli; daha katı bir güvenlik duruşu için ileride gözden geçirilebilir.
Native Stripe ödeme ekranı
Stripe entegrasyonu barındırılan Checkout'tur (yönlendirme/webview). Native bir kart girişi arayüzü, bunun yerine PaymentIntents + Stripe SDK'sını kullanırdı.
Partnerler için webhook'lar
Partnerler durum için GET /orders/:id'yi yoklamalıdır; henüz giden bir webhook (örn. "eSIM aktive edildi") yoktur.
