# Ekspor daftar koneksi

`POST /account/api/v1/residential/export`

## Otorisasi

`Authorization: Bearer YOUR_ARNPROXY_API_KEY`

`Accept: application/json`

Izin yang diperlukan: `read + optional credentials`

`Content-Type: application/json`

## Parameter

| Nama | Tipe | Wajib / Bersyarat | Nilai bawaan | Keterangan |
|---|---|---|---|---|
| `list_id` (body) | integer | Wajib | — | ID catatan daftar koneksi ARNPROXY sendiri, bukan ID daftar penyedia. |
| `format` (body) | string | Opsional | `"host_port"` | host_port \| host_port_user_pass \| user_pass_host_port \| uri. Kredensial memerlukan credentials. Juga csv \| custom. |
| `protocol` (body) | string | Opsional | `"http"` | http atau socks5; hanya mengatur awalan keluaran uri. |
| `offset` (body) | integer | Opsional | `0` | 0–9999, di bawah jumlah port. |
| `limit` (body) | integer | Opsional | `100` | 1–1000; bawaan 100. |
| `columns` (body) | string[] | Bersyarat | — | Khusus CSV: id, endpoint, ip, port, login, password. Bawaan ["id","endpoint"]. login/password memerlukan credentials. |
| `template` (body) | string | Bersyarat | — | Wajib untuk custom, maksimal 200 karakter. %endpoint%, %ip%, %port%, %id%, %login%, %username%, %password%, %login_url%, %password_url%. Karakter kontrol dan placeholder asing ditolak. |

## Isi permintaan

Ganti YOUR_/FROM_ dengan nilai katalog, kutipan harga, atau cakupan terkait. Persetujuan pada contoh tetap false; setujui operasi nyata secara sengaja.

```json
{
  "list_id": "YOUR_LIST_ID",
  "format": "host_port",
  "offset": 0,
  "limit": 10
}
```

## Contoh penggunaan tambahan

ID dan harga hanya contoh; gunakan nilai nyata dari katalog dan penawaran yang sama. ID JSON dan expected_total_minor harus berupa angka. Contoh sengaja memakai terms=false; kirim terms=true hanya setelah persetujuan jelas pelanggan untuk operasi berbayar.

### Ekspor CSV

Pilih kolom CSV dari id, endpoint, ip, port, login, dan password. Format khusus hanya menerima token %...% yang didokumentasikan dan tidak menjalankan kode. Keluaran berisi kredensial memerlukan izin credentials. Konten dikembalikan dalam JSON; aplikasi Anda menyimpannya sebagai berkas.

```json
{
  "list_id": 10001,
  "format": "csv",
  "columns": [
    "id",
    "endpoint"
  ],
  "protocol": "http",
  "offset": 0,
  "limit": 10
}
```

### Format koneksi khusus

Pilih kolom CSV dari id, endpoint, ip, port, login, dan password. Format khusus hanya menerima token %...% yang didokumentasikan dan tidak menjalankan kode. Keluaran berisi kredensial memerlukan izin credentials. Konten dikembalikan dalam JSON; aplikasi Anda menyimpannya sebagai berkas.

```json
{
  "list_id": 10001,
  "format": "custom",
  "template": "http://%login_url%:%password_url%@%endpoint%",
  "protocol": "http",
  "offset": 0,
  "limit": 10
}
```

## Contoh permintaan

### 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/export'
```

### 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/export",
    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/export", {
  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/export');
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/export", 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/export");
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/export"))
    .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());
```

## Respons · HTTP 200

```json
{
  "ok": true,
  "data": {
    "list_id": 30001,
    "package_id": 20001,
    "authentication": "login_password",
    "format": "host_port",
    "protocol": null,
    "items": [
      "res.arnproxy.com:10000"
    ],
    "count": 1,
    "next_offset": 1,
    "credentials_included": false,
    "snapshot": {
      "source": "arnproxy_records",
      "observed_at": "2030-01-01T12:00:00+00:00",
      "fresh": true,
      "max_age_seconds": 3600,
      "reason": null
    },
    "source": "arnproxy_records",
    "provider_requests": 0,
    "proxy_connections_tested": false,
    "session_targeting_applied": false
  },
  "meta": {
    "request_id": "000000000000000000000001",
    "phase": "public_v1",
    "source": "arnproxy_records"
  }
}
```

| Nama | Tipe | Bersyarat | Keterangan |
|---|---|---|---|
| `ok` | boolean | — | Penanda berhasil; jika false, periksa error.code. |
| `data` | object | — | Hasil khusus operasi; contoh bersifat ilustratif dan sintetis. |
| `data.list_id` | integer | — | ID catatan ARNPROXY terkait; gunakan alih-alih ID internal penyedia. |
| `data.package_id` | integer | — | ID catatan ARNPROXY terkait; gunakan alih-alih ID internal penyedia. |
| `data.authentication` | string | — | Mode autentikasi daftar: login_password atau ip_auth. |
| `data.format` | string | — | Nilai khusus operasi untuk format. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `data.protocol` | string|null | — | Nilai khusus operasi untuk protocol. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `data.items` | array | — | Catatan halaman ini atau string koneksi terformat; daftar kosong dapat valid. |
| `data.items[]` | string | — | Catatan halaman ini atau string koneksi terformat; daftar kosong dapat valid. |
| `data.count` | integer | — | Jumlah catatan terlihat atau string koneksi yang dihasilkan. |
| `data.next_offset` | integer | — | Offset keluaran koneksi berikutnya, atau null jika selesai. |
| `data.credentials_included` | boolean | — | Apakah hasil/kunci berisi atau mengizinkan kredensial sensitif. |
| `data.snapshot` | object | — | Sumber/waktu/kesegaran snapshot paket; snapshot lama tidak memberi akses pengelolaan. |
| `data.snapshot.source` | string | — | Sumber data; catatan lokal dan kueri penyedia langsung merupakan bukti berbeda. |
| `data.snapshot.observed_at` | string | — | Stempel waktu sesuai representasi API; tanggal contoh sintetis. |
| `data.snapshot.fresh` | boolean | — | Apakah pengamatan memenuhi jendela kesegarannya. |
| `data.snapshot.max_age_seconds` | integer | — | Usia pengamatan maksimum agar dianggap segar, dalam detik. |
| `data.snapshot.reason` | string|null | — | Kode alasan tetap atau null, bukan teks kesalahan penyedia mentah. |
| `data.source` | string | — | Sumber data; catatan lokal dan kueri penyedia langsung merupakan bukti berbeda. |
| `data.provider_requests` | integer | — | Nilai khusus operasi untuk provider requests. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `data.proxy_connections_tested` | boolean | — | Nilai khusus operasi untuk proxy connections tested. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `data.session_targeting_applied` | boolean | — | Nilai khusus operasi untuk session targeting applied. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `meta` | object | — | Metadata korelasi permintaan dan sumber data. |
| `meta.request_id` | string | — | ID korelasi permintaan HTTP ini, bukan kunci operasi atau ID pesanan. |
| `meta.phase` | string | — | Nilai khusus operasi untuk phase. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
| `meta.source` | string | — | Sumber data; catatan lokal dan kueri penyedia langsung merupakan bukti berbeda. |

## Perilaku & catatan penting

- ID paket/daftar adalah catatan ARNPROXY, bukan kunci penyedia. Snapshot usang tidak memberi akses; gunakan residential_package_refresh bila perlu.
- Keluaran berkredensial memerlukan izin credentials. Jangan catat atau kirim string koneksi, kata sandi, atau header Authorization ke dukungan.

Autentikasi dan validasi dapat menolak permintaan sebelum dijalankan. Lihat referensi kesalahan dan simpan request_id untuk dukungan. Jangan kirim kunci atau kata sandi.

[Kesalahan & batas](https://docs.arnproxy.com/id/api-v1/errors)
