# Verlängerungspreis

`POST /account/api/v1/renewals/quote`

## Autorisierung

`Authorization: Bearer YOUR_ARNPROXY_API_KEY`

`Accept: application/json`

Erforderliche Berechtigung: `read`

`Content-Type: application/json`

## Parameter

| Name | Typ | Erforderlich / Bedingt | Standardwert | Beschreibung |
|---|---|---|---|---|
| `proxy_ids` (body) | integer[] | Erforderlich | — | 1–1000 eindeutige eigene Proxy-IDs. Bei gemeinsamem Umfang/Preis Produkttypen nicht mischen; einzelne Vorgänge haben engere Limits. |
| `time_id` (body) | integer | Erforderlich | — | Laufzeit-/GB-Plan-ID aus passendem Katalog/options, keine Tages- oder GB-Anzahl. |
| `promo_code` (body) | string | Optional | `""` | Optionaler Aktionscode, höchstens 100 Bytes. Zwischen Preisabfrage und Kauf/Verlängerung unverändert lassen. |

## Anfrageinhalt

Ersetzen Sie YOUR_/FROM_ durch Werte aus Katalog, Angebot oder Umfang. Beispiele lassen die Zustimmung auf false; bestätigen Sie echte Vorgänge nur bewusst.

```json
{
  "proxy_ids": [
    "YOUR_PROXY_ID"
  ],
  "time_id": "FROM_RENEWAL_OPTIONS",
  "promo_code": ""
}
```

## 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 \
    --request POST --header 'Content-Type: application/json' \
    --data-binary @request.json \
    'https://www.arnproxy.com/account/api/v1/renewals/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/renewals/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/renewals/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/renewals/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/renewals/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/renewals/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/renewals/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());
```

## Antworten · HTTP 200

```json
{
  "ok": true,
  "data": {
    "product_id": 5,
    "currency": "TRY",
    "proxy_ids": [
      12345
    ],
    "quantity": 1,
    "selection_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "time_id": 101,
    "period": "7 days",
    "days": 7,
    "base_total": "10.00",
    "quantity_discount_amount": "0.00",
    "subtotal": "10.00",
    "promotion": {
      "code": "",
      "rate": "0.00",
      "amount": "0.00"
    },
    "total": "10.00",
    "total_minor": 1000,
    "lines": [
      {
        "location_id": 10,
        "country": "Example country",
        "quantity": 1,
        "base_unit_price": "10.0000",
        "unit_price": "10.0000",
        "quantity_discount_rate": "0.00",
        "total_minor": 1000,
        "total": "10.00"
      }
    ],
    "proxies": [
      {
        "id": 12345,
        "location_id": 10,
        "last_service_date": "2030-02-01",
        "projected_last_service_date": "2030-02-08",
        "total": "10.00",
        "total_minor": 1000
      }
    ],
    "discount_scope": "country",
    "timezone": "Europe/Istanbul",
    "estimate_only": true,
    "renewal_available": true,
    "provider_checked": false,
    "calculated_at": "2030-01-01T12:00:00+00:00"
  },
  "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.proxy_ids` | array | — | Proxy-IDs im für dieses Konto sichtbaren Umfang. |
| `data.proxy_ids[]` | integer | — | Proxy-IDs im für dieses Konto sichtbaren Umfang. |
| `data.quantity` | integer | — | Gewählte oder bestellte Proxyanzahl. |
| `data.selection_hash` | string | — | Aktualitätskennung unverändert an die zugehörige Änderung/Preisbestätigung zurückgeben. |
| `data.time_id` | integer | — | Lokale Laufzeit-/GB-Plan-ID, keine Anzahl von Tagen oder GB. |
| `data.period` | string | — | Lesbare Laufzeitbezeichnung aus dem Katalog. |
| `data.days` | integer | — | Laufzeit in Tagen, getrennt vom Trafficvolumen des GB-Plans. |
| `data.base_total` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.quantity_discount_amount` | string | — | Vorgangsspezifischer Wert für quantity discount amount. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.subtotal` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.promotion` | object | — | Vorgangsspezifischer Wert für promotion. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.promotion.code` | string | — | Vorgangsspezifischer Wert für code. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.promotion.rate` | string | — | Vorgangsspezifischer Wert für rate. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.promotion.amount` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.total` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.total_minor` | integer | — | Ganzzahl in kleinster Währungseinheit: 1000 bedeutet 10.00 TRY/USD. |
| `data.lines` | array | — | Vorgangsspezifischer Wert für lines. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[]` | object | — | Vorgangsspezifischer Wert für lines. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[].location_id` | integer | — | Lokale Katalog-ID für Standort oder Produkttyp. |
| `data.lines[].country` | string | — | Vorgangsspezifischer Wert für country. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[].quantity` | integer | — | Gewählte oder bestellte Proxyanzahl. |
| `data.lines[].base_unit_price` | string | — | Vorgangsspezifischer Wert für base unit price. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[].unit_price` | string | — | Vorgangsspezifischer Wert für unit price. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[].quantity_discount_rate` | string | — | Vorgangsspezifischer Wert für quantity discount rate. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.lines[].total_minor` | integer | — | Ganzzahl in kleinster Währungseinheit: 1000 bedeutet 10.00 TRY/USD. |
| `data.lines[].total` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.proxies` | array | — | Vorgangsspezifischer Wert für proxies. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.proxies[]` | object | — | Vorgangsspezifischer Wert für proxies. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.proxies[].id` | integer | — | Zugehörige ARNPROXY-Datensatz-ID statt interner Anbieter-ID verwenden. |
| `data.proxies[].location_id` | integer | — | Lokale Katalog-ID für Standort oder Produkttyp. |
| `data.proxies[].last_service_date` | string | — | Letzter Diensttag: aktuell, vorherig oder prognostiziert. Eine Prognose führt keine Verlängerung aus. |
| `data.proxies[].projected_last_service_date` | string | — | Letzter Diensttag: aktuell, vorherig oder prognostiziert. Eine Prognose führt keine Verlängerung aus. |
| `data.proxies[].total` | string | — | Geldbetrag; Text-/Ganzzahldarstellung für Genauigkeit beibehalten. |
| `data.proxies[].total_minor` | integer | — | Ganzzahl in kleinster Währungseinheit: 1000 bedeutet 10.00 TRY/USD. |
| `data.discount_scope` | string | — | Vorgangsspezifischer Wert für discount scope. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.timezone` | string | — | Zeitzone der zugehörigen Datumsfelder; null bedeutet nicht verifiziert. |
| `data.estimate_only` | boolean | — | Vorgangsspezifischer Wert für estimate only. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.renewal_available` | boolean | — | Verfügbarkeit nach Bedingungen/Berechtigungen; keine Bestands- oder Anbietergarantie. |
| `data.provider_checked` | boolean | — | Preis/lokales Ergebnis allein garantiert weder Anbieter noch Bestand. |
| `data.calculated_at` | string | — | Zeitstempel im vom API gelieferten Format; Beispieldaten sind synthetisch. |
| `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

- Verlängerung nutzt bestehende Websitepreise und Guthabenverarbeitung. Betrag, Tage und Auswahlhash aus demselben renewal_quote übernehmen. Aktiviert keine automatische Verlängerung.
- Proxys einer Verlängerungsanfrage müssen denselben Produkttyp haben. Mengenrabatte werden anhand der gewählten Menge je Land berechnet, nicht aus der Summe aller Länder.

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)
