एकीकरण प्रवाह
पहले कैटलॉग या सत्यापित दायरा पढ़ें, कोट या revision जाँचें, एक बार भेजें, फिर सहेजी कार्रवाई और डिलीवरी स्थिति देखें।
कैटलॉग और खरीद
products → catalog → quote → purchase
↓
purchase_status → order_delivery → order_proxiesबहु-देश खरीद में देशवार अलग ऑर्डर और एक बहु-पंक्ति बिल बनता है। छूट देशवार है। accepted का अर्थ कतार में स्वीकृति है, डिलीवरी नहीं।
नवीनीकरण
renewal_options → renewal_quote → renewal → renewal_statusअतिरिक्त लॉगिन
extra_login_options → extra_login_create → extra_login_operation_statusResidential सूची और ट्रैफ़िक
residential_catalog → residential_quote → residential_purchase
↓
residential_purchase_status → order_delivery → residential_package_refreshIdempotency-Key
हर इच्छित बदलाव के लिए एक Idempotency-Key सहेजें। टाइमआउट या HTTP 5xx विफलता का प्रमाण नहीं। उसी कुंजी से स्थिति पूछें; अनिश्चितता में नई कुंजी से दोबारा कार्रवाई न करें।
/orders/create/statusनवीनीकरण स्थिति →GET /renewals/statusलॉगिन कार्रवाई जाँचें →GET /extra-logins/statusResidential डिलीवरी स्थिति →GET /residential/orders/statusउपयोग का उद्देश्य: केवल उप-उद्देश्य चुनें
सामान्य ऑर्डर में ग्राहक से दो विकल्प न चुनवाएँ। catalog.purposes में id=201 खोजें और केवल उसके children दिखाएँ। purchase में purpose_id निश्चित पूर्णांक 201 है और subpurpose_id चुने गए उप-विकल्प की ID है। पुराने एकीकरणों के साथ संगतता के लिए कैटलॉग का पदानुक्रम बना हुआ है।
quote की पंक्तियों में उद्देश्य न भेजें: location_id, time_id और quantity पर्याप्त हैं। उद्देश्य purchase चरण में अनिवार्य है।
const response = await fetch(
'https://www.arnproxy.com/account/api/v1/catalog?product_id=' + productId,
{ headers: { Authorization: 'Bearer ' + apiKey } }
);
const catalog = await response.json();
if (!response.ok || !catalog.ok) throw new Error('Catalog request failed');
const purposeGroup = catalog.data.purposes.find(group => group.id === 201);
if (!purposeGroup) throw new Error('Purpose group 201 is not available');
const purposeOptions = purposeGroup.children.map(({ id, name }) => ({ id, name }));
// Show only purposeOptions. The customer selects selectedSubpurposeId.
const purchaseLine = {
location_id: selectedLocationId,
time_id: selectedTimeId,
quantity: selectedQuantity,
purpose_id: 201,
subpurpose_id: selectedSubpurposeId
};
// Add other_purpose (1–30 characters) only when selectedSubpurposeId === -1.
// No purchase is sent by this example.import json
import urllib.request
request = urllib.request.Request(
'https://www.arnproxy.com/account/api/v1/catalog?product_id=' + str(product_id),
headers={'Authorization': 'Bearer ' + api_key}
)
with urllib.request.urlopen(request, timeout=20) as response:
catalog = json.load(response)
if not catalog.get('ok'):
raise RuntimeError('Catalog request failed')
purpose_group = next((g for g in catalog['data']['purposes'] if g['id'] == 201), None)
if purpose_group is None:
raise RuntimeError('Purpose group 201 is not available')
purpose_options = [{'id': p['id'], 'name': p['name']} for p in purpose_group['children']]
# Display only purpose_options; the customer selects selected_subpurpose_id.
purchase_line = {
'location_id': selected_location_id,
'time_id': selected_time_id,
'quantity': selected_quantity,
'purpose_id': 201,
'subpurpose_id': selected_subpurpose_id,
}
# For Other (-1), also set other_purpose to 1–30 characters.
# This example does not submit a purchase.“अन्य” उपयोग उद्देश्य
अन्य चुनने पर subpurpose_id=-1 और 1–30 अक्षरों का other_purpose भेजें। दूसरे विकल्पों में other_purpose आवश्यक नहीं है। purpose_id फिर भी 201 रहता है।
{
"location_id": 10,
"time_id": 101,
"quantity": 1,
"purpose_id": 201,
"subpurpose_id": -1,
"other_purpose": "Custom purpose"
}Residential: नया पैकेज और GB जोड़ना
Residential ऑर्डर में ग्राहक को उपयोग का उद्देश्य नहीं चुनना होता। नए पैकेज के लिए सर्वर वेबसाइट खरीद जैसा ही निश्चित उद्देश्य अपने आप निर्धारित करता है; purpose_id, subpurpose_id या other_purpose न भेजें। ट्रैफ़िक जोड़ने पर मौजूदा पैकेज का उद्देश्य बना रहता है।
ID और कीमतें उदाहरण मात्र हैं; कैटलॉग और उसी कोट के वास्तविक मान उपयोग करें। JSON ID और expected_total_minor संख्याएँ हों। सुरक्षा के लिए उदाहरणों में terms=false है; वास्तविक भुगतान वाले कार्य के लिए ग्राहक की स्पष्ट सहमति के बाद ही terms=true भेजें।
एक उत्पाद प्रकार, दो देश
एक product_id में अधिकतम 20 अलग location_id हो सकते हैं। हर देश की अलग ऑर्डर प्रविष्टि बनती है; जुड़ा हुआ चेकआउट एक इनवॉइस में संसाधित होता है। मात्रा छूट हर देश की अपनी मात्रा पर लगती है।
{
"product_id": 5,
"lines": [
{
"location_id": 10,
"time_id": 101,
"quantity": 1,
"purpose_id": 201,
"subpurpose_id": 202
},
{
"location_id": 11,
"time_id": 102,
"quantity": 1,
"purpose_id": 201,
"subpurpose_id": 202
}
],
"currency": "TRY",
"expected_total_minor": 2000,
"promo_code": "",
"terms": false
}POST /account/api/v1/orders/create
Residential: नया पैकेज और GB जोड़ना · mode=new
Residential ऑर्डर में ग्राहक को उपयोग का उद्देश्य नहीं चुनना होता। नए पैकेज के लिए सर्वर वेबसाइट खरीद जैसा ही निश्चित उद्देश्य अपने आप निर्धारित करता है; purpose_id, subpurpose_id या other_purpose न भेजें। ट्रैफ़िक जोड़ने पर मौजूदा पैकेज का उद्देश्य बना रहता है।
{
"mode": "new",
"location_id": 20,
"time_id": 201,
"promo_code": "",
"currency": "TRY",
"expected_total_minor": 1000,
"expected_selection_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"terms": false
}POST /account/api/v1/residential/orders/create
Residential: नया पैकेज और GB जोड़ना · mode=topup
Residential ऑर्डर में ग्राहक को उपयोग का उद्देश्य नहीं चुनना होता। नए पैकेज के लिए सर्वर वेबसाइट खरीद जैसा ही निश्चित उद्देश्य अपने आप निर्धारित करता है; purpose_id, subpurpose_id या other_purpose न भेजें। ट्रैफ़िक जोड़ने पर मौजूदा पैकेज का उद्देश्य बना रहता है।
{
"mode": "topup",
"package_id": 10001,
"time_id": 201,
"promo_code": "",
"currency": "TRY",
"expected_total_minor": 1000,
"expected_selection_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"terms": false
}POST /account/api/v1/residential/orders/create
CSV निर्यात
CSV कॉलम id, endpoint, ip, port, login और password में से चुनें। कस्टम प्रारूप केवल दस्तावेज़ित %...% टोकन स्वीकार करते हैं और कोड नहीं चलाते। लॉगिन/पासवर्ड वाले आउटपुट के लिए credentials अनुमति चाहिए। सामग्री JSON में लौटती है; आपकी एप्लिकेशन उसे फ़ाइल में सहेजती है।
{
"proxy_ids": [
10001
],
"format": "csv",
"columns": [
"id",
"endpoint"
]
}POST /account/api/v1/proxies/export
कस्टम कनेक्शन प्रारूप
CSV कॉलम id, endpoint, ip, port, login और password में से चुनें। कस्टम प्रारूप केवल दस्तावेज़ित %...% टोकन स्वीकार करते हैं और कोड नहीं चलाते। लॉगिन/पासवर्ड वाले आउटपुट के लिए credentials अनुमति चाहिए। सामग्री JSON में लौटती है; आपकी एप्लिकेशन उसे फ़ाइल में सहेजती है।
{
"proxy_ids": [
10001
],
"format": "custom",
"template": "%login%:%password%@%endpoint%"
}POST /account/api/v1/proxies/export
स्वीकार होने का अर्थ डिलीवरी पूरी होना नहीं
HTTP 201/202 या state=accepted केवल स्वीकार होना बता सकता है। उसी कार्य को purchase_status / residential_purchase_status और डिलीवरी को order_delivery से देखें। poll_after_seconds तथा Retry-After का पालन करें। टाइमआउट के बाद नई Idempotency-Key से दोबारा खरीद न करें।