# पैकेज और टॉपअप का कोट

`POST /account/api/v1/residential/quote`

## प्राधिकरण

`Authorization: Bearer YOUR_ARNPROXY_API_KEY`

`Accept: application/json`

आवश्यक अनुमति: `read`

`Content-Type: application/json`

## पैरामीटर

| नाम | प्रकार | आवश्यक / सशर्त | डिफ़ॉल्ट | विवरण |
|---|---|---|---|---|
| `mode` (body) | string | आवश्यक | — | new पैकेज बनाता है; topup अपने पैकेज में GB जोड़ता है। |
| `time_id` (body) | integer | आवश्यक | — | संबंधित कैटलॉग/options की अवधि/GB प्लान ID, दिन या GB की गिनती नहीं। |
| `location_id` (body) | integer | सशर्त | — | केवल mode=new में आवश्यक; topup में वर्जित। |
| `package_id` (body) | integer | सशर्त | — | केवल mode=topup में आवश्यक; new में वर्जित। |
| `promo_code` (body) | string | वैकल्पिक | `""` | वैकल्पिक प्रमोशन, अधिकतम 100 बाइट। कोट और खरीद/नवीनीकरण में समान रखें। |

## अनुरोध का मुख्य भाग

YOUR_/FROM_ को संबंधित कैटलॉग, कोट या दायरे के मान से बदलें। उदाहरणों में सहमति false है; वास्तविक कार्रवाई केवल जानबूझकर मंज़ूर करें।

```json
{
  "mode": "topup",
  "package_id": "YOUR_PACKAGE_ID",
  "time_id": "FROM_RESIDENTIAL_CATALOG",
  "promo_code": ""
}
```

## अतिरिक्त उपयोग उदाहरण

ID और कीमतें उदाहरण मात्र हैं; कैटलॉग और उसी कोट के वास्तविक मान उपयोग करें। JSON ID और expected_total_minor संख्याएँ हों। सुरक्षा के लिए उदाहरणों में terms=false है; वास्तविक भुगतान वाले कार्य के लिए ग्राहक की स्पष्ट सहमति के बाद ही terms=true भेजें।

### Residential: नया पैकेज और GB जोड़ना · mode=new

residential_quote और residential_purchase, दोनों में उद्देश्य चुनने की ज़रूरत नहीं। मूल्य अनुरोध में केवल mode, time_id, location_id या package_id और वैकल्पिक promo_code भेजें। खरीद में कोट की मुद्रा, राशि, चयन हैश और स्पष्ट सहमति जोड़ें।

```json
{
  "mode": "new",
  "location_id": 20,
  "time_id": 201,
  "promo_code": ""
}
```

### Residential: नया पैकेज और GB जोड़ना · mode=topup

residential_quote और residential_purchase, दोनों में उद्देश्य चुनने की ज़रूरत नहीं। मूल्य अनुरोध में केवल mode, time_id, location_id या package_id और वैकल्पिक promo_code भेजें। खरीद में कोट की मुद्रा, राशि, चयन हैश और स्पष्ट सहमति जोड़ें।

```json
{
  "mode": "topup",
  "package_id": 10001,
  "time_id": 201,
  "promo_code": ""
}
```

## अनुरोध उदाहरण

### curl

```curl
printf 'Authorization: Bearer %s\n' "$ARNPROXY_API_KEY" |
  curl --silent --show-error --header @- \
    --header 'Accept: application/json' \
    --connect-timeout 10 --max-time 30 \
    --request POST --header 'Content-Type: application/json' \
    --data-binary @request.json \
    'https://www.arnproxy.com/account/api/v1/residential/quote'
```

### python

```python
import os, requests

headers = {"Authorization": "Bearer " + os.environ["ARNPROXY_API_KEY"]}
import json
with open("request.json", encoding="utf-8") as f:
    payload = json.load(f)
response = requests.post(
    "https://www.arnproxy.com/account/api/v1/residential/quote",
    headers=headers, json=payload,
    timeout=(10, 30), allow_redirects=False
)
print(response.status_code, response.text)
# No automatic write retry.
```

### javascript

```javascript
const headers = { Authorization: `Bearer ${process.env.ARNPROXY_API_KEY}` };
const { readFile } = await import('node:fs/promises');
headers['Content-Type'] = 'application/json';
const body = await readFile('request.json', 'utf8');
const response = await fetch("https://www.arnproxy.com/account/api/v1/residential/quote", {
  method: 'POST', headers, redirect: 'error',
  signal: AbortSignal.timeout(30000), body
});
console.log(response.status, await response.text());
// A write timeout is ambiguous; query its saved operation.
```

### php

```php
<?php
$headers = ['Accept: application/json',
    'Authorization: Bearer '.getenv('ARNPROXY_API_KEY')];
$headers[] = 'Content-Type: application/json';
$ch = curl_init('https://www.arnproxy.com/account/api/v1/residential/quote');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 30,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => file_get_contents('request.json'),
]);
$result = curl_exec($ch);
if ($result === false) {
    // Do not repeat a write; use the original operation key.
    throw new RuntimeException('Transport result unknown');
}
echo curl_getinfo($ch, CURLINFO_HTTP_CODE).PHP_EOL.$result;
curl_close($ch);
```

### go

```go
package main

import (
  "fmt"
  "io"
  "net/http"
  "os"
  "time"
)

func main() {
  client := &http.Client{Timeout: 30*time.Second,
    CheckRedirect: func(req *http.Request, via []*http.Request) error {
      return http.ErrUseLastResponse
    }}
  var body io.Reader
  file, err := os.Open("request.json"); if err != nil { panic(err) }
  defer file.Close(); body = file
  req, err := http.NewRequest("POST", "https://www.arnproxy.com/account/api/v1/residential/quote", body)
  if err != nil { panic(err) }
  req.Header.Set("Authorization", "Bearer "+os.Getenv("ARNPROXY_API_KEY"))
  req.Header.Set("Content-Type", "application/json")
  res, err := client.Do(req); if err != nil { panic(err) }
  defer res.Body.Close()
  data, err := io.ReadAll(res.Body); if err != nil { panic(err) }
  fmt.Println(res.StatusCode, string(data))
}
```

### csharp

```csharp
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

using var handler = new HttpClientHandler { AllowAutoRedirect = false };
using var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };
using var request = new HttpRequestMessage(HttpMethod.Post,
    "https://www.arnproxy.com/account/api/v1/residential/quote");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("ARNPROXY_API_KEY"));
request.Content = new StringContent(
    await File.ReadAllTextAsync("request.json"), Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
// Never automatically retry an ambiguous write.
```

### java

```java
import java.net.URI;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;

// Inside your application method:
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(URI.create("https://www.arnproxy.com/account/api/v1/residential/quote"))
    .header("Authorization", "Bearer " + System.getenv("ARNPROXY_API_KEY"))
    .header("Accept", "application/json")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(
        Files.readString(Path.of("request.json"), StandardCharsets.UTF_8)))
    .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
```

## उत्तर · HTTP 200

```json
{
  "ok": true,
  "data": {
    "mode": "topup",
    "product_id": 33,
    "location_id": 20,
    "time_id": 201,
    "gb": 1,
    "days": 30,
    "package_id": 20001,
    "currency": "TRY",
    "base_total": "15.00",
    "quantity_discount_rate": 0,
    "subtotal": "15.00",
    "promotion": {
      "code": "",
      "rate": 0,
      "amount": "0.00"
    },
    "total": "15.00",
    "total_minor": 1500,
    "last_service_date": "2030-02-01",
    "automatic_renewal": false,
    "stock_checked": false,
    "provider_checked": false,
    "selection_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  },
  "meta": {
    "request_id": "000000000000000000000001",
    "phase": "public_v1",
    "source": "arnproxy_records"
  }
}
```

| नाम | प्रकार | सशर्त | विवरण |
|---|---|---|---|
| `ok` | boolean | — | सफलता संकेत; false पर error.code देखें। |
| `data` | object | — | कार्रवाई-विशिष्ट परिणाम; उदाहरण कृत्रिम और समझाने के लिए हैं। |
| `data.mode` | string | — | mode का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.product_id` | integer | — | स्थानीय कैटलॉग स्थान या उत्पाद प्रकार ID। |
| `data.location_id` | integer | — | स्थानीय कैटलॉग स्थान या उत्पाद प्रकार ID। |
| `data.time_id` | integer | — | स्थानीय अवधि/GB प्लान ID, दिनों या GB की गिनती नहीं। |
| `data.gb` | integer | — | ट्रैफ़िक मात्रा; सूची/सेटिंग कार्रवाई ट्रैफ़िक नहीं खरीदती। |
| `data.days` | integer | — | प्लान अवधि दिनों में, GB प्लान की ट्रैफ़िक मात्रा से अलग। |
| `data.package_id` | integer | — | संबंधित ARNPROXY रिकॉर्ड ID; आंतरिक प्रदाता ID के बदले इसे लें। |
| `data.currency` | string | — | खाते की लेनदेन मुद्रा: TRY या USD। |
| `data.base_total` | string | — | धनराशि; शुद्धता के लिए लौटाया पाठ/पूर्णांक प्रारूप बनाए रखें। |
| `data.quantity_discount_rate` | integer | — | quantity discount rate का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.subtotal` | string | — | धनराशि; शुद्धता के लिए लौटाया पाठ/पूर्णांक प्रारूप बनाए रखें। |
| `data.promotion` | object | — | promotion का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.promotion.code` | string | — | code का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.promotion.rate` | integer | — | rate का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.promotion.amount` | string | — | धनराशि; शुद्धता के लिए लौटाया पाठ/पूर्णांक प्रारूप बनाए रखें। |
| `data.total` | string | — | धनराशि; शुद्धता के लिए लौटाया पाठ/पूर्णांक प्रारूप बनाए रखें। |
| `data.total_minor` | integer | — | लघुतम मुद्रा इकाई में पूर्णांक: 1000 = 10.00 TRY/USD। |
| `data.last_service_date` | string | — | अंतिम सेवा दिन: मौजूदा, पिछला या अनुमानित। अनुमान से नवीनीकरण नहीं होता। |
| `data.automatic_renewal` | boolean | — | automatic renewal का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `data.stock_checked` | boolean | — | कीमत/स्थानीय परिणाम अकेले प्रदाता या स्टॉक की गारंटी नहीं। |
| `data.provider_checked` | boolean | — | कीमत/स्थानीय परिणाम अकेले प्रदाता या स्टॉक की गारंटी नहीं। |
| `data.selection_hash` | string | — | संबंधित बदलाव/मूल्य पुष्टि में अपरिवर्तित लौटाने वाला ताज़गी संकेत। |
| `meta` | object | — | अनुरोध संबद्धता और डेटा-स्रोत मेटाडेटा। |
| `meta.request_id` | string | — | इस HTTP अनुरोध की पहचान; कार्रवाई कुंजी या ऑर्डर ID नहीं। |
| `meta.phase` | string | — | phase का कार्रवाई-विशिष्ट मान। लौटाया प्रकार बनाए रखें और व्यवहार नोट देखें। |
| `meta.source` | string | — | डेटा स्रोत; स्थानीय रिकॉर्ड और लाइव प्रदाता क्वेरी अलग प्रमाण हैं। |

## व्यवहार और महत्वपूर्ण नोट

- पैकेज/सूची ID ARNPROXY रिकॉर्ड ID हैं, प्रदाता कुंजियाँ नहीं। पुराना स्नैपशॉट पहुँच नहीं देता; ज़रूरत पर residential_package_refresh लें।
- mode=new नया पैकेज, mode=topup मौजूदा में GB जोड़ता है। पहले residential_catalog/quote लें। शेष-राशि स्वीकृति और पृष्ठभूमि डिलीवरी अलग हैं; उसी कार्रवाई कुंजी को ट्रैक करें।
- residential_quote और residential_purchase, दोनों में उद्देश्य चुनने की ज़रूरत नहीं। मूल्य अनुरोध में केवल mode, time_id, location_id या package_id और वैकल्पिक promo_code भेजें। खरीद में कोट की मुद्रा, राशि, चयन हैश और स्पष्ट सहमति जोड़ें।

प्रमाणीकरण और जाँच निष्पादन से पहले अनुरोध रोक सकते हैं। त्रुटि संदर्भ देखें और सहायता के लिए request_id रखें। कुंजी या पासवर्ड न भेजें।

[त्रुटियाँ और सीमाएँ](https://docs.arnproxy.com/hi/api-v1/errors)
