ARNPROXY

एकीकरण प्रवाह

पहले कैटलॉग या सत्यापित दायरा पढ़ें, कोट या revision जाँचें, एक बार भेजें, फिर सहेजी कार्रवाई और डिलीवरी स्थिति देखें।

कैटलॉग और खरीद

API v1
products → catalog → quote → purchase
                         ↓
purchase_status → order_delivery → order_proxies

बहु-देश खरीद में देशवार अलग ऑर्डर और एक बहु-पंक्ति बिल बनता है। छूट देशवार है। accepted का अर्थ कतार में स्वीकृति है, डिलीवरी नहीं।

नवीनीकरण

API v1
renewal_options → renewal_quote → renewal → renewal_status

अतिरिक्त लॉगिन

API v1
extra_login_options → extra_login_create → extra_login_operation_status

Residential सूची और ट्रैफ़िक

API v1
residential_catalog → residential_quote → residential_purchase
                                              ↓
residential_purchase_status → order_delivery → residential_package_refresh

Idempotency-Key

हर इच्छित बदलाव के लिए एक Idempotency-Key सहेजें। टाइमआउट या HTTP 5xx विफलता का प्रमाण नहीं। उसी कुंजी से स्थिति पूछें; अनिश्चितता में नई कुंजी से दोबारा कार्रवाई न करें।

उपयोग का उद्देश्य: केवल उप-उद्देश्य चुनें

सामान्य ऑर्डर में ग्राहक से दो विकल्प न चुनवाएँ। catalog.purposes में id=201 खोजें और केवल उसके children दिखाएँ। purchase में purpose_id निश्चित पूर्णांक 201 है और subpurpose_id चुने गए उप-विकल्प की ID है। पुराने एकीकरणों के साथ संगतता के लिए कैटलॉग का पदानुक्रम बना हुआ है।

quote की पंक्तियों में उद्देश्य न भेजें: location_id, time_id और quantity पर्याप्त हैं। उद्देश्य purchase चरण में अनिवार्य है।

Node.js / JavaScript
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.
Python
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 रहता है।

purchase · lines[]
{
    "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 हो सकते हैं। हर देश की अलग ऑर्डर प्रविष्टि बनती है; जुड़ा हुआ चेकआउट एक इनवॉइस में संसाधित होता है। मात्रा छूट हर देश की अपनी मात्रा पर लगती है।

POST /orders/create
{
    "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 न भेजें। ट्रैफ़िक जोड़ने पर मौजूदा पैकेज का उद्देश्य बना रहता है।

POST /residential/orders/create
{
    "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 न भेजें। ट्रैफ़िक जोड़ने पर मौजूदा पैकेज का उद्देश्य बना रहता है।

POST /residential/orders/create
{
    "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 में लौटती है; आपकी एप्लिकेशन उसे फ़ाइल में सहेजती है।

POST /proxies/export
{
    "proxy_ids": [
        10001
    ],
    "format": "csv",
    "columns": [
        "id",
        "endpoint"
    ]
}

POST /account/api/v1/proxies/export

कस्टम कनेक्शन प्रारूप

CSV कॉलम id, endpoint, ip, port, login और password में से चुनें। कस्टम प्रारूप केवल दस्तावेज़ित %...% टोकन स्वीकार करते हैं और कोड नहीं चलाते। लॉगिन/पासवर्ड वाले आउटपुट के लिए credentials अनुमति चाहिए। सामग्री JSON में लौटती है; आपकी एप्लिकेशन उसे फ़ाइल में सहेजती है।

POST /proxies/export
{
    "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 से दोबारा खरीद न करें।

वर्तमान भाषा में खोजें। बंद करें: Esc