Ganti login tambahan
POST
/account/api/v1/extra-logins/replaceKonfirmasikan operasi dengan sengaja
Operasi ini dapat mengubah catatan, saldo, atau pengaturan layanan. Baca cakupan dan catatan terlebih dahulu. Jika hasil tidak pasti, periksa operasi yang sama, jangan memulai yang baru.
Otorisasi
| Authorization | Bearer YOUR_ARNPROXY_API_KEY |
|---|---|
| Izin yang diperlukan | proxy_management |
| Accept | application/json |
| Content-Type | application/json |
| Idempotency-Key | 16–100 huruf, angka, _ atau -. Simpan dan gunakan nilai yang sama untuk operasi yang sama. |
Parameter
| Nama | Tipe | Keterangan |
|---|---|---|
Idempotency-Key | string | 16–100 huruf/angka/_/-. Pertahankan nilai untuk operasi/status; jangan pakai lagi dengan isi berbeda. |
id | integer | ID catatan milik sendiri untuk operasi ini; 1–2147483647. Bukan nomor pesanan tampilan atau ID penyedia. |
mode | string | random (bawaan) atau custom. Gunakan custom hanya bila custom_credentials_available=true dalam respons opsi. Baca panjang yang diperlukan dari username_length dan password_length. Nilai bawaan: "random" |
expected_revision | string | revision dari pembacaan cakupan/pengaturan terkait: 64 karakter heksadesimal kecil. |
terms | boolean | Persetujuan harus berupa boolean JSON true, bukan string "true". |
username | string | Hanya bila mode=custom didukung: tepat 12 huruf atau digit ASCII. Hilangkan dalam mode random. |
password | string | Hanya bila mode=custom didukung: tepat 12 huruf atau digit ASCII. Hilangkan dalam mode random. |
Isi permintaan
Ganti YOUR_/FROM_ dengan nilai katalog, kutipan harga, atau cakupan terkait. Persetujuan pada contoh tetap false; setujui operasi nyata secara sengaja.
{
"id": "YOUR_EXTRA_LOGIN_ID",
"mode": "random",
"expected_revision": "FROM_SCOPE_REVISION",
"terms": false
}Contoh permintaan
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/extra-logins/replace'Contoh tidak dijalankan di halaman ini. Simpan kunci API dalam variabel lingkungan server, bukan URL atau kode browser. Siapkan request.json untuk contoh POST.
{"curl":"printf \u0027Authorization: Bearer %s\\n\u0027 \u0022$ARNPROXY_API_KEY\u0022 |\n curl --silent --show-error --header @- \\\n --header \u0027Accept: application\/json\u0027 \\\n --connect-timeout 10 --max-time 30 \\\n --header \u0027Idempotency-Key: YOUR_SAVED_OPERATION_KEY\u0027 \\\n --request POST --header \u0027Content-Type: application\/json\u0027 \\\n --data-binary @request.json \\\n \u0027https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0027","python":"import os, requests\n\nheaders = {\u0022Authorization\u0022: \u0022Bearer \u0022 + os.environ[\u0022ARNPROXY_API_KEY\u0022]}\nheaders[\u0022Idempotency-Key\u0022] = \u0022YOUR_SAVED_OPERATION_KEY\u0022\nimport json\nwith open(\u0022request.json\u0022, encoding=\u0022utf-8\u0022) as f:\n payload = json.load(f)\nresponse = requests.post(\n \u0022https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0022,\n headers=headers, json=payload,\n timeout=(10, 30), allow_redirects=False\n)\nprint(response.status_code, response.text)\n# No automatic write retry.","javascript":"const headers = { Authorization: `Bearer ${process.env.ARNPROXY_API_KEY}` };\nheaders[\u0027Idempotency-Key\u0027] = \u0027YOUR_SAVED_OPERATION_KEY\u0027;\nconst { readFile } = await import(\u0027node:fs\/promises\u0027);\nheaders[\u0027Content-Type\u0027] = \u0027application\/json\u0027;\nconst body = await readFile(\u0027request.json\u0027, \u0027utf8\u0027);\nconst response = await fetch(\u0022https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0022, {\n method: \u0027POST\u0027, headers, redirect: \u0027error\u0027,\n signal: AbortSignal.timeout(30000), body\n});\nconsole.log(response.status, await response.text());\n\/\/ A write timeout is ambiguous; query its saved operation.","php":"\u003C?php\n$headers = [\u0027Accept: application\/json\u0027,\n \u0027Authorization: Bearer \u0027.getenv(\u0027ARNPROXY_API_KEY\u0027)];\n$headers[] = \u0027Idempotency-Key: YOUR_SAVED_OPERATION_KEY\u0027;\n$headers[] = \u0027Content-Type: application\/json\u0027;\n$ch = curl_init(\u0027https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0027);\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER =\u003E true,\n CURLOPT_HTTPHEADER =\u003E $headers,\n CURLOPT_FOLLOWLOCATION =\u003E false,\n CURLOPT_SSL_VERIFYPEER =\u003E true, CURLOPT_SSL_VERIFYHOST =\u003E 2,\n CURLOPT_CONNECTTIMEOUT =\u003E 10, CURLOPT_TIMEOUT =\u003E 30,\n CURLOPT_POST =\u003E true,\n CURLOPT_POSTFIELDS =\u003E file_get_contents(\u0027request.json\u0027),\n]);\n$result = curl_exec($ch);\nif ($result === false) {\n \/\/ Do not repeat a write; use the original operation key.\n throw new RuntimeException(\u0027Transport result unknown\u0027);\n}\necho curl_getinfo($ch, CURLINFO_HTTP_CODE).PHP_EOL.$result;\ncurl_close($ch);","go":"package main\n\nimport (\n \u0022fmt\u0022\n \u0022io\u0022\n \u0022net\/http\u0022\n \u0022os\u0022\n \u0022time\u0022\n)\n\nfunc main() {\n client := \u0026http.Client{Timeout: 30*time.Second,\n CheckRedirect: func(req *http.Request, via []*http.Request) error {\n return http.ErrUseLastResponse\n }}\n var body io.Reader\n file, err := os.Open(\u0022request.json\u0022); if err != nil { panic(err) }\n defer file.Close(); body = file\n req, err := http.NewRequest(\u0022POST\u0022, \u0022https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0022, body)\n if err != nil { panic(err) }\n req.Header.Set(\u0022Authorization\u0022, \u0022Bearer \u0022+os.Getenv(\u0022ARNPROXY_API_KEY\u0022))\n req.Header.Set(\u0022Idempotency-Key\u0022, \u0022YOUR_SAVED_OPERATION_KEY\u0022)\n req.Header.Set(\u0022Content-Type\u0022, \u0022application\/json\u0022)\n res, err := client.Do(req); if err != nil { panic(err) }\n defer res.Body.Close()\n data, err := io.ReadAll(res.Body); if err != nil { panic(err) }\n fmt.Println(res.StatusCode, string(data))\n}","csharp":"using System;\nusing System.IO;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Text;\n\nusing var handler = new HttpClientHandler { AllowAutoRedirect = false };\nusing var client = new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(30) };\nusing var request = new HttpRequestMessage(HttpMethod.Post,\n \u0022https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0022);\nrequest.Headers.Authorization = new AuthenticationHeaderValue(\n \u0022Bearer\u0022, Environment.GetEnvironmentVariable(\u0022ARNPROXY_API_KEY\u0022));\nrequest.Headers.Add(\u0022Idempotency-Key\u0022, \u0022YOUR_SAVED_OPERATION_KEY\u0022);\nrequest.Content = new StringContent(\n await File.ReadAllTextAsync(\u0022request.json\u0022), Encoding.UTF8, \u0022application\/json\u0022);\nusing var response = await client.SendAsync(request);\nConsole.WriteLine((int)response.StatusCode);\nConsole.WriteLine(await response.Content.ReadAsStringAsync());\n\/\/ Never automatically retry an ambiguous write.","java":"import java.net.URI;\nimport java.net.http.*;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.*;\n\n\/\/ Inside your application method:\nvar client = HttpClient.newHttpClient();\nvar request = HttpRequest.newBuilder(URI.create(\u0022https:\/\/www.arnproxy.com\/account\/api\/v1\/extra-logins\/replace\u0022))\n .header(\u0022Authorization\u0022, \u0022Bearer \u0022 + System.getenv(\u0022ARNPROXY_API_KEY\u0022))\n .header(\u0022Accept\u0022, \u0022application\/json\u0022)\n .header(\u0022Idempotency-Key\u0022, System.getenv(\u0022ARNPROXY_OPERATION_KEY\u0022))\n .header(\u0022Content-Type\u0022, \u0022application\/json\u0022)\n .POST(HttpRequest.BodyPublishers.ofString(\n Files.readString(Path.of(\u0022request.json\u0022), StandardCharsets.UTF_8)))\n .build();\nvar response = client.send(request, HttpResponse.BodyHandlers.ofString());\nSystem.out.println(response.statusCode());"}Respons
200Respons berhasil
{
"ok": true,
"data": {
"state": "completed",
"phase": "done",
"action": "replace_extra_login",
"old_login_id": 40001,
"new_login_id": 40002,
"proxy_ids": [
12345
],
"reason_code": null,
"resume_available": false,
"replayed": false,
"primary_credentials_modified": false,
"credentials_included": false,
"strategy": "create_verify_then_revoke_old"
},
"meta": {
"request_id": "000000000000000000000001",
"phase": "public_v1",
"source": "arnproxy_records"
}
}Kolom dan tipe respons
| Nama | Tipe | Keterangan |
|---|---|---|
ok | boolean | Penanda berhasil; jika false, periksa error.code. |
data | object | Hasil khusus operasi; contoh bersifat ilustratif dan sintetis. |
data.state | string | Status catatan/operasi. accepted bukan terkirim; completed bukan tes koneksi. |
data.phase | string | Nilai khusus operasi untuk phase. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
data.action | string | Nilai khusus operasi untuk action. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
data.old_login_id | integer | ID catatan ARNPROXY terkait; gunakan alih-alih ID internal penyedia. |
data.new_login_id | integer | ID catatan ARNPROXY terkait; gunakan alih-alih ID internal penyedia. |
data.proxy_ids | array | ID proxy dalam cakupan yang terlihat bagi akun ini. |
data.proxy_ids[] | integer | ID proxy dalam cakupan yang terlihat bagi akun ini. |
data.reason_code | string|null | Kode alasan tetap atau null, bukan teks kesalahan penyedia mentah. |
data.resume_available | boolean | Izin melanjutkan langkah belum dikirim; jangan ulang otomatis jika false. |
data.replayed | boolean | Hasil tersimpan dari operasi sama, bukan bukti debit/tindakan baru. |
data.primary_credentials_modified | boolean | Nilai khusus operasi untuk primary credentials modified. Pertahankan tipe yang dikembalikan dan baca catatan perilaku. |
data.credentials_included | boolean | Apakah hasil/kunci berisi atau mengizinkan kredensial sensitif. |
data.strategy | string | Penggantian login memverifikasi akses baru sebelum mencabut akses lama terpilih. |
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. |
Respons kesalahan
{
"ok": false,
"error": { "code": "INVALID_API_KEY" },
"meta": { "request_id": "000000000000000000000001" }
}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 →
Perilaku & catatan penting
- Login tambahan terpisah dari login utama. Membuatnya tidak mengubah login utama atau menghapus login tambahan lain. Baca custom_credentials_available, username_length, dan password_length dari respons opsi sebelum membuat kredensial.
- id adalah ID login tambahan, bukan ID proxy. Login baru diverifikasi sebelum hanya login lama terpilih dicabut. Tabel proxy utama tidak berubah.
- Tindakan dapat berlaku pada seluruh grup otorisasi, misalnya pesanan atau paket, bukan hanya proxy terpilih. Periksa proxy_ids, authorization_scope, dan may_affect_other_proxies sebelum melanjutkan. Ambil revision baru jika cakupan berubah.
- Timeout/5xx bukan bukti perubahan gagal. Gunakan Idempotency-Key awal untuk status. Jangan ulang dengan kunci baru; GET tidak mengirim ulang perubahan.