# Mit Guthaben verlängern

`POST /account/api/v1/renewals/create`

## Autorisierung

`Authorization: Bearer YOUR_ARNPROXY_API_KEY`

`Accept: application/json`

Erforderliche Berechtigung: `renewals`

`Content-Type: application/json`

`Idempotency-Key` · 16–100 Buchstaben, Ziffern, _ oder -. Für denselben Vorgang speichern und wiederverwenden.

## Parameter

| Name | Typ | Erforderlich / Bedingt | Standardwert | Beschreibung |
|---|---|---|---|---|
| `Idempotency-Key` (header) | string | Erforderlich | — | 16–100 Buchstaben/Ziffern/_/-. Für Vorgang und Status denselben Wert behalten; nicht mit anderem Inhalt wiederverwenden. |
| `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. |
| `currency` (body) | string | Erforderlich | — | TRY oder USD aus demselben Angebot; muss zur Kontowährung passen. |
| `expected_total_minor` (body) | integer | Erforderlich | — | total_minor desselben Angebots als Ganzzahl, nie Dezimalbetrag oder Text. 1–999999999999. |
| `expected_days` (body) | integer | Erforderlich | — | days aus demselben Angebot; 1–36500. |
| `expected_selection_hash` (body) | string | Erforderlich | — | selection_hash desselben Angebots: 64 kleine Hexadezimalzeichen. |
| `terms` (body) | boolean | Erforderlich | — | Zur ausdrücklichen Zustimmung muss der JSON-Wahrheitswert true gesendet werden, nicht die Zeichenfolge "true". |

## 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": "",
  "currency": "FROM_QUOTE",
  "expected_total_minor": "FROM_QUOTE_TOTAL_MINOR",
  "expected_days": "FROM_QUOTE_DAYS",
  "expected_selection_hash": "FROM_QUOTE_SELECTION_HASH",
  "terms": false
}
```

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

### python

```python
import os, requests

headers = {"Authorization": "Bearer " + os.environ["ARNPROXY_API_KEY"]}
headers["Idempotency-Key"] = "YOUR_SAVED_OPERATION_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/create",
    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}` };
headers['Idempotency-Key'] = 'YOUR_SAVED_OPERATION_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/create", {
  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[] = 'Idempotency-Key: YOUR_SAVED_OPERATION_KEY';
$headers[] = 'Content-Type: application/json';
$ch = curl_init('https://www.arnproxy.com/account/api/v1/renewals/create');
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/create", body)
  if err != nil { panic(err) }
  req.Header.Set("Authorization", "Bearer "+os.Getenv("ARNPROXY_API_KEY"))
  req.Header.Set("Idempotency-Key", "YOUR_SAVED_OPERATION_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/create");
request.Headers.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("ARNPROXY_API_KEY"));
request.Headers.Add("Idempotency-Key", "YOUR_SAVED_OPERATION_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/create"))
    .header("Authorization", "Bearer " + System.getenv("ARNPROXY_API_KEY"))
    .header("Accept", "application/json")
    .header("Idempotency-Key", System.getenv("ARNPROXY_OPERATION_KEY"))
    .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 201, 200

```json
{
  "ok": true,
  "data": {
    "state": "completed",
    "currency": "TRY",
    "total": "10.00",
    "total_minor": 1000,
    "renewal_batch_id": 100,
    "renewal_request_ids": [
      101
    ],
    "days": 7,
    "proxies": [
      {
        "id": 12345,
        "previous_last_service_date": "2030-02-01",
        "last_service_date": "2030-02-08",
        "total": "10.00"
      }
    ],
    "completed_at": "2030-01-01T12:00:00+00:00",
    "automatic_renewal": false,
    "source": "existing_website_renewal",
    "replayed": false
  },
  "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.state` | string | — | Datensatz-/Vorgangsstatus. accepted bedeutet nicht geliefert, completed keinen Verbindungstest. |
| `data.currency` | string | — | Kontowährung der Transaktion: TRY oder USD. |
| `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.renewal_batch_id` | integer | — | Vorgangsspezifischer Wert für renewal batch id. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.renewal_request_ids` | array | — | Vorgangsspezifischer Wert für renewal request ids. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.renewal_request_ids[]` | integer | — | Vorgangsspezifischer Wert für renewal request ids. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.days` | integer | — | Laufzeit in Tagen, getrennt vom Trafficvolumen des GB-Plans. |
| `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[].previous_last_service_date` | string | — | Letzter Diensttag: aktuell, vorherig oder prognostiziert. Eine Prognose führt keine Verlängerung aus. |
| `data.proxies[].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.completed_at` | string | — | Zeitstempel im vom API gelieferten Format; Beispieldaten sind synthetisch. |
| `data.automatic_renewal` | boolean | — | Vorgangsspezifischer Wert für automatic renewal. Rückgabetyp beibehalten und Verhaltenshinweise beachten. |
| `data.source` | string | — | Datenquelle; lokale Datensätze und Live-Anbieterabfragen sind unterschiedliche Nachweise. |
| `data.replayed` | boolean | — | Gespeichertes Ergebnis desselben Vorgangs, kein Beweis für neue Abbuchung/Aktion. |
| `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.
- Timeout/5xx beweist keinen Schreibfehler. Ursprünglichen Idempotency-Key für den Status verwenden. Nicht mit neuem Schlüssel wiederholen; GET sendet die Änderung nicht erneut.
- 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)

[Denselben Vorgang verfolgen: Verlängerungsstatus](https://docs.arnproxy.com/de/api-v1/renewals/status)
