Vio eSIM API संदर्भ
एक ही बैकएंड पर दो REST सतहें: ग्राहक-सामना करने वाला API जो वेब ऐप और हमारे iOS/Android ऐप को शक्ति देता है, और Vio eSIM को प्रोग्रामेटिक रूप से पुनर्विक्रय करने के लिए एक अलग, API-कुंजी-प्रमाणीकृत पार्टनर API।
https://vioesim.com/api/v1https://vioesim.com/api/public/v1मोबाइल ऐप प्रमाणीकरण
वेब ऐप और नेटिव ऐप एक ही सेशन सिस्टम साझा करते हैं — नेटिव ऐप केवल कुकी स्टोर पर निर्भर होने के बजाय टोकन स्वयं रखता है।
रजिस्टर या लॉगिन करें। दोनों एंडपॉइंट यूज़र ऑब्जेक्ट के साथ एक token फ़ील्ड लौटाते हैं (साथ ही Set-Cookie हेडर जिसका उपयोग वेब ऐप इसके बजाय करता है)। token को Keychain (iOS) या Keystore-समर्थित स्टोर (Android) में सहेजें।
हर अनुरोध पर इसे वापस भेजें:
Authorization: Bearer <token>टोकन वैधता: जारी होने से 30 दिन, या जब तक /api/v1/auth/logout कॉल न हो। कोई रिफ्रेश-टोकन चरण नहीं है — जल्द समाप्त होने वाले टोकन को उपयोगकर्ता को फिर से लॉगिन करवाकर बस बदल दिया जाता है।
पार्टनर API प्रमाणीकरण
उन बाहरी व्यवसायों के लिए जो अपनी वेबसाइट या ऐप के माध्यम से Vio eSIM का पुनर्विक्रय करते हैं। एक पार्टनर एक सामान्य Vio eSIM खाता होता है: यहाँ से एक कुंजी जनरेट करें डैशबोर्ड → API कुंजियाँ (केवल एक बार दिखाई जाती है — इसे सहेज लें, इसे दोबारा नहीं देखा जा सकता), फिर इसे हर अनुरोध पर भेजें:
Authorization: Bearer vio_live_sk_...
# or
X-API-Key: vio_live_sk_...एक नई कुंजी जनरेट करने से पिछली कुंजी तुरंत अमान्य हो जाती है।
क्विकस्टार्ट — पार्टनर API
कैटलॉग ब्राउज़ करें और दो कॉल में eSIM खरीदें:
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 }'त्रुटियाँ और दर सीमाएँ
मोबाइल/वेब API { "error": "संदेश" } लौटाता है (वर्तमान में तुर्की संदेश)। पार्टनर API एक संरचित प्रारूप लौटाता है ताकि आप code पर शाखा बना सकें:
{ "error": { "code": "INSUFFICIENT_BALANCE", "message": "Insufficient wallet balance." } }| स्थिति | अर्थ |
|---|---|
| 401 | टोकन या API कुंजी गुम, अमान्य या समाप्त |
| 402 | केवल पार्टनर API — वॉलेट बैलेंस अपर्याप्त |
| 404 | संसाधन नहीं मिला, या कॉलर के स्वामित्व में नहीं |
| 409 | स्थिति संघर्ष (जैसे गैर-शून्य बैलेंस वाले खाते को हटाना) |
| 429 | दर सीमा तक पहुँचे — Retry-After हेडर (सेकंड में) देखें |
| 502 | शुल्क लिया गया लेकिन eSIM प्रावधान विफल — फिर से शुल्क न लें |
दर सीमाएँ (पार्टनर API): रीड 120 प्रति मिनट प्रति कुंजी, POST /orders 30 प्रति मिनट।
मोबाइल / वेब API
प्रमाणीकरण
रजिस्टर
एक खाता और सक्रिय सेशन बनाता है।
{
"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": "..."
}लॉगिन
बॉडी: { email, password }। रजिस्टर के समान प्रतिक्रिया प्रारूप। गलत क्रेडेंशियल पर 401, निलंबित खाते पर 403।
लॉगआउट
कोई बॉडी नहीं। सर्वर-साइड पर सेशन हटाता है — वास्तविक लॉगआउट पर इसे कॉल करें, केवल "स्थानीय रूप से टोकन भूलने" के बजाय, ताकि चोरी हुआ टोकन काम करना जारी न रखे।
वर्तमान उपयोगकर्ता
लॉग आउट होने पर { "user": null } लौटाता है (यह कभी त्रुटि नहीं होती) — ऐप स्टार्टअप पर लॉगिन स्क्रीन दिखानी है या नहीं, यह तय करने के लिए इसका उपयोग करें।
पासवर्ड भूल गए
बॉडी: { email, locale }। पता मौजूद है या नहीं, इसकी परवाह किए बिना हमेशा { success: true } लौटाता है, ताकि खाता गणना को रोका जा सके। रीसेट लिंक/टोकन के साथ एक ईमेल भेजता है (1 घंटे के लिए मान्य)।
पासवर्ड रीसेट करें
बॉडी: { token, newPassword }। ?token= के साथ GET फॉर्म दिखाने से पहले वैधता जाँच सकता है ({ "valid": true|false })।
पासवर्ड बदलें
बॉडी: { currentPassword, newPassword }। जब तक खाते में अभी तक पासवर्ड सेट न हो (जैसे सोशल लॉगिन), currentPassword आवश्यक है।
खाता
प्रोफ़ाइल अपडेट करें
केवल वे फ़ील्ड भेजें जिन्हें आप बदलना चाहते हैं।
| Field | Notes |
|---|---|
| firstName, lastName | वैकल्पिक · स्ट्रिंग |
| preferredCurrency | वैकल्पिक · USD, EUR, GBP, TRY में से एक |
| locale | वैकल्पिक · दो-अक्षर कोड, जैसे hi |
{ "success": true, "user": { ...same shape as /auth/me } }अवतार अपडेट करें
बॉडी: { "avatarUrl": "data:image/..." } — base64 data URI, अधिकतम ~1.5MB।
API कुंजी जनरेट करें
इस खाते के लिए एक नई पार्टनर API कुंजी जारी करता है, पिछली कुंजी को बदलते हुए। मूल कुंजी केवल इस प्रतिक्रिया में एक बार दिखाई जाती है — बाद में केवल इसका उपसर्ग पुनर्प्राप्त किया जा सकता है।
{
"success": true,
"key": "vio_live_sk_...",
"apiKeyPrefix": "vio_live_sk_ab12…9f8e",
"apiKeyGeneratedAt": "2026-08-22T17:00:00.781Z"
}खाता हटाएँ
App Store समीक्षा के लिए आवश्यक (खाता निर्माण वाले ऐप्स को इन-ऐप हटाने की सुविधा प्रदान करनी चाहिए)। पंक्तियों को स्थायी रूप से हटाने के बजाय खाते को गुमनाम बनाता है (ईमेल को घुमाया जाता है और पुनः पंजीकरण के लिए मुक्त किया जाता है, नाम/अवतार/पासवर्ड मिटा दिए जाते हैं), ताकि पिछले ऑर्डर कर/लेखांकन रिकॉर्ड के लिए बने रहें। उपयोगकर्ता के सभी सेशन और पंजीकृत पुश डिवाइस नष्ट कर देता है।
कैटलॉग
गंतव्य सूची प्राप्त करें
वैध प्लान वाले देश और क्षेत्र, मूल्य निर्धारित और UI के लिए स्वरूपित (यह ठीक वही है जो स्टोरफ्रंट स्वयं कॉल करता है)। वैकल्पिक ?filter=popular|regional|global|<खोज टेक्स्ट>।
गंतव्य विवरण
ISO कोड द्वारा एक देश का पूरा विवरण (विवरण, प्लान), जैसे /api/v1/destinations/jp।
खरीदारी
चेकआउट
पहले वॉलेट में फंड जोड़ने के बजाय सीधे एक प्लान खरीदता है।
| Field | Notes |
|---|---|
| planId* | |
| quantity | वैकल्पिक · 1–10, डिफ़ॉल्ट 1 |
| paymentMethod* | wallet | stripe | crypto |
| successUrl, cancelUrl | वैकल्पिक · stripe/crypto रीडायरेक्ट के लिए। रीडायरेक्ट को ऐप को फिर से खोलने के लिए साधारण वेब URL के बजाय यूनिवर्सल/ऐप लिंक का उपयोग करें। |
{ "success": true, "orderId": "..." }{ "success": true, "orderId": "...", "url": "https://checkout.stripe.com/..." }Stripe के माध्यम से वॉलेट जमा
कार्ड द्वारा वॉलेट में फंड जोड़ता है — यह चेकआउट से अलग प्रवाह है। बॉडी: { amount (सेंट में, न्यूनतम 200), currency, successUrl, cancelUrl }। { sessionId, url } लौटाता है।
क्रिप्टो के माध्यम से वॉलेट जमा
बॉडी: { amount (दशमलव स्ट्रिंग, न्यूनतम $2), currency, url_return }। url सहित एक Cryptomus इनवॉइस ऑब्जेक्ट लौटाता है।
ऑर्डर सूची
कॉलर के सभी ऑर्डर, नवीनतम से सबसे पुराने क्रम में लौटाता है।
ऑर्डर विवरण
esimIds के साथ एकल ऑर्डर — पूर्ण eSIM विवरण (QR, सक्रियण कोड) प्राप्त करने के लिए GET /api/v1/user/esims का उपयोग करें और id द्वारा मिलान करें।
मेरे eSIM
कॉलर के स्वामित्व वाला प्रत्येक eSIM: iccid, activationCode, qrCodeUrl, smdpAddress, status, dataUsage/totalVolume (MB में), activatedAt, expiresAt। यह "मेरे eSIM" स्क्रीन और QR डिस्प्ले को संचालित करने वाला डेटा है।
वॉलेट इतिहास
/auth/me में दिखाए गए वॉलेट बैलेंस के पीछे जमा/निकासी/खरीद/धनवापसी इतिहास।
सहायता
टिकट सूची
कॉलर के टिकट और उनके पूर्ण संदेश थ्रेड, नवीनतम से सबसे पुराने क्रम में।
नया टिकट
बॉडी: { subject, category, message } (category वैकल्पिक है)।
टिकट का जवाब दें
बॉडी: { message }। RESOLVED/CLOSED टिकट का जवाब देने से यह स्वचालित रूप से फिर से खुल जाता है।
पुश नोटिफिकेशन डिवाइस
यह केवल डिवाइस टोकन पंजीकरण संभालता है — वास्तविक भेजने के लिए APNs/FCM क्रेडेंशियल की आवश्यकता होती है। नीचे नोट देखें।
डिवाइस पंजीकृत करें
APNs या FCM टोकन प्राप्त करने के बाद कॉल करें। बॉडी: { platform: "IOS"|"ANDROID", pushToken, appVersion }। यह टोकन द्वारा अपसर्ट किया जाता है, इसलिए हर ऐप स्टार्टअप पर फिर से कॉल करना सुरक्षित और अनुशंसित है (टोकन घूम सकते हैं)।
डिवाइस पंजीकरण रद्द करें
बॉडी: { pushToken }। लॉगआउट पर कॉल करें ताकि साझा/रीसेट किए गए डिवाइस अन्य उपयोगकर्ताओं की सूचनाएँ प्राप्त करना जारी न रखें।
पार्टनर API
नीचे दिए गए सभी एंडपॉइंट के लिए ऊपर बताए गए API कुंजी हेडर की आवश्यकता है — यहाँ सेशन कुकीज़ लागू नहीं होतीं।
कैटलॉग
गंतव्य सूची प्राप्त करें
स्टोरफ्रंट के UI प्रारूप के बजाय पार्टनर-उन्मुख प्रारूप में पूरा कैटलॉग।
{
"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": [...] } ]
}गंतव्य विवरण
ISO कोड द्वारा एक देश (जैसे /api/public/v1/destinations/JP), प्लान प्रारूप ऊपर जैसा ही।
ऑर्डर
ऑर्डर बनाएँ
कॉलर के वॉलेट बैलेंस से एक प्लान खरीदता है और eSIM को समकालिक रूप से प्रावधानित करता है — प्रतिक्रिया में पहले से ही QR/सक्रियण डेटा शामिल है जो अंतिम ग्राहक को सौंपने के लिए तैयार है। सामान्य मामले में कोई पोलिंग आवश्यक नहीं है।
{ "planId": "cus...", "quantity": 1 }{
"id": "...", "orderNumber": "VIO-API-...", "status": "COMPLETED", "amountUsd": 4.25,
"esims": [
{ "id": "...", "iccid": "...", "activationCode": "...",
"qrCodeUrl": "https://...", "smdpAddress": "...", "status": "PENDING" }
]
}ऑर्डर सूची
वैकल्पिक ?limit= (डिफ़ॉल्ट 25, अधिकतम 100)। यह सारांश प्रारूप है — eSIM डेटा के लिए विवरण एंडपॉइंट का उपयोग करें।
ऑर्डर विवरण
प्रत्येक eSIM के लिए QR/सक्रियण डेटा और वास्तविक समय उपयोग (dataUsageMb / totalVolumeMb) के साथ पूर्ण ऑर्डर विवरण — ग्राहक को शेष डेटा दिखाने के लिए इसे पोल करें।
वॉलेट
वॉलेट बैलेंस
बल्क ऑर्डर देने से पहले जाँचें, या बैलेंस कम होने पर स्वयं को सचेत करने के लिए इसका उपयोग करें।
{ "balanceUsd": 128.40, "currency": "USD" }अभी तक नहीं बनाया गया
ताकि यहाँ न होने वाली किसी चीज़ को काम करने वाली न समझा जाए।
पुश नोटिफिकेशन भेजना
टोकन पंजीकरण काम करता है; वास्तविक भेजने के लिए APNs/FCM क्रेडेंशियल की आवश्यकता है।
पार्टनर-विशिष्ट मूल्य निर्धारण
पार्टनर API वर्तमान में स्टोरफ्रंट के समान खुदरा मूल्य लेता है। थोक/परक्राम्य मूल्य निर्धारण के लिए स्कीमा परिवर्तन और व्यावसायिक निर्णय की आवश्यकता है।
रिफ्रेश टोकन
सेशन एक अल्पकालिक एक्सेस + रिफ्रेश टोकन जोड़ी के बजाय एक दीर्घकालिक (30-दिवसीय) फ्लैट टोकन है। अभी के लिए पर्याप्त है; यदि अधिक सख्त सुरक्षा व्यवस्था की आवश्यकता हो तो बाद में पुनर्मूल्यांकन करें।
नेटिव Stripe भुगतान स्क्रीन
Stripe एकीकरण वर्तमान में होस्टेड Checkout (रीडायरेक्ट/वेबव्यू) का उपयोग करता है। नेटिव कार्ड-एंट्री UI के लिए PaymentIntents + Stripe SDK की आवश्यकता होगी।
पार्टनर के लिए Webhook
पार्टनर को स्थिति के लिए वर्तमान में GET /orders/:id को पोल करना होगा। अभी तक कोई आउटबाउंड webhook (जैसे "eSIM सक्रिय हो गया") उपलब्ध नहीं है।
