# Residential-Tarife und Preise

`GET /account/api/v1/residential/catalog`

## Autorisierung

`Authorization: Bearer YOUR_ARNPROXY_API_KEY`

`Accept: application/json`

Erforderliche Berechtigung: `read`

## Parameter

| Name | Typ | Erforderlich / Bedingt | Standardwert | Beschreibung |
|---|---|---|---|---|
| `package_id` (query) | integer | Optional | — | ARNPROXY-Paket-ID aus residential_packages, niemals ein Anbieter-package_key. |

## Anfragebeispiel

### 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 \
    'https://www.arnproxy.com/account/api/v1/residential/catalog'
```

### python

```python
import os, requests

headers = {"Authorization": "Bearer " + os.environ["ARNPROXY_API_KEY"]}
response = requests.get(
    "https://www.arnproxy.com/account/api/v1/residential/catalog",
    headers=headers,
    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 response = await fetch("https://www.arnproxy.com/account/api/v1/residential/catalog", {
  method: 'GET', headers, redirect: 'error',
  signal: AbortSignal.timeout(30000)
});
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')];
$ch = curl_init('https://www.arnproxy.com/account/api/v1/residential/catalog');
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,
]);
$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
  req, err := http.NewRequest("GET", "https://www.arnproxy.com/account/api/v1/residential/catalog", body)
  if err != nil { panic(err) }
  req.Header.Set("Authorization", "Bearer "+os.Getenv("ARNPROXY_API_KEY"))
  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.Get,
    "https://www.arnproxy.com/account/api/v1/residential/catalog");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("ARNPROXY_API_KEY"));
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/catalog"))
    .header("Authorization", "Bearer " + System.getenv("ARNPROXY_API_KEY"))
    .header("Accept", "application/json")
    .GET()
    .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
```

## Antworten · HTTP 200

```json
{
  "ok": true,
  "data": {
    "product_id": 33,
    "currency": "TRY",
    "locations": [
      {
        "location_id": 20,
        "packages": [
          {
            "time_id": 201,
            "name": "1 GB",
            "gb": 1,
            "days": 30,
            "price": "15.00",
            "price_minor": 1500
          }
        ]
      }
    ],
    "purposes": [],
    "package_id": null,
    "purchase_available": true,
    "stock_checked": false,
    "provider_checked": false,
    "source": "website_residential_prices"
  },
  "meta": {
    "request_id": "000000000000000000000001",
    "phase": "public_v1",
    "source": "arnproxy_records"
  }
}
```

| Name | Typ | Bedingt | Beschreibung |
|---|---|---|---|
| `ok` | boolean | — | Erfolgskennzeichen; bei false error.code prüfen. |
| `data` | object | — | Vorgangsspezifisches Ergebnis; Beispiele sind synthetisch und dienen der Veranschaulichung. |
| `data.product_id` | integer | — | Lokale Katalog-ID für Standort oder Produkttyp. |
| `data.currency` | string | — | Kontowährung der Transaktion: TRY oder USD. |
| `data.locations` | array | — | Vorgangsspezifischer Wert für locations. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.locations[]` | object | — | Vorgangsspezifischer Wert für locations. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.locations[].location_id` | integer | — | Lokale Katalog-ID für Standort oder Produkttyp. |
| `data.locations[].packages` | array | — | Vorgangsspezifischer Wert für packages. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.locations[].packages[]` | object | — | Vorgangsspezifischer Wert für packages. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.locations[].packages[].time_id` | integer | — | Lokale Laufzeit-/GB-Plan-ID, keine Anzahl von Tagen oder GB. |
| `data.locations[].packages[].name` | string | — | Vorgangsspezifischer Wert für name. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.locations[].packages[].gb` | integer | — | Trafficmenge; Listen-/Einstellungsvorgänge kaufen keinen Traffic. |
| `data.locations[].packages[].days` | integer | — | Laufzeit in Tagen, getrennt vom Trafficvolumen des GB-Plans. |
| `data.locations[].packages[].price` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.locations[].packages[].price_minor` | integer | — | Ganzzahl in kleinster Währungseinheit: 1000 bedeutet 10.00 TRY/USD. |
| `data.purposes` | array | — | Das Feld purposes bleibt zur Antwortkompatibilität ein leeres Array und wird Kunden nicht zur Auswahl angezeigt. |
| `data.package_id` | integer|null | — | Zugehörige ARNPROXY-Datensatz-ID statt interner Anbieter-ID verwenden. |
| `data.purchase_available` | boolean | — | Verfügbarkeit nach Bedingungen/Berechtigungen; keine Bestands- oder Anbietergarantie. |
| `data.stock_checked` | boolean | — | Preis/lokales Ergebnis allein garantiert weder Anbieter noch Bestand. |
| `data.provider_checked` | boolean | — | Preis/lokales Ergebnis allein garantiert weder Anbieter noch Bestand. |
| `data.source` | string | — | Datenquelle; lokale Datensätze und Live-Anbieterabfragen sind unterschiedliche Nachweise. |
| `meta` | object | — | Metadaten zu Anfragezuordnung und Datenquelle. |
| `meta.request_id` | string | — | Kennung dieser HTTP-Anfrage, kein Vorgangsschlüssel oder Bestell-ID. |
| `meta.phase` | string | — | Vorgangsspezifischer Wert für phase. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `meta.source` | string | — | Datenquelle; lokale Datensätze und Live-Anbieterabfragen sind unterschiedliche Nachweise. |

## Verhalten & wichtige Hinweise

- Paket-/Listen-IDs sind ARNPROXY-Datensatz-IDs, keine Anbieterkennungen. Veralteter Snapshot gewährt keinen Zugriff; gegebenenfalls residential_package_refresh nutzen.
- Bei Residential-Bestellungen wählen Kunden keinen Verwendungszweck. Für ein neues Paket weist der Server automatisch denselben festen Zweck wie beim Website-Kauf zu; senden Sie weder purpose_id noch subpurpose_id oder other_purpose. Eine Traffic-Aufladung behält den bisherigen Zweck bei.
- Das Feld purposes bleibt zur Antwortkompatibilität ein leeres Array und wird Kunden nicht zur Auswahl angezeigt.

Authentifizierung und Validierung können eine Anfrage vor der Ausführung ablehnen. Beachten Sie die Fehlerreferenz und bewahren Sie request_id für den Support auf. Senden Sie niemals Schlüssel oder Passwörter.

[Fehler & Limits](https://docs.arnproxy.com/de/api-v1/errors)
