# Isi saldo dengan kripto

> API LocalSERP Proxy: isi saldo kripto, jumlah pasti, pembayaran telah dikirim (TXID opsional), dan status. Parameter, contoh respons, kode curl, Python, dan Node.js.

- URL: https://localserpproxy.com/id/docs/api/top-ups/
- Terakhir diperbarui: 2026-10-15
- Publisher: LocalSERP Proxy (https://localserpproxy.com)

Isi saldo dengan kripto: dapatkan alamat deposit dan jumlah yang tepat, kirim jumlah tersebut persis, laporkan bahwa pembayaran telah dikirim (ID transaksi opsional), lalu pantau proses isi saldo hingga dana masuk. Saldo dapat digunakan untuk membayar paket apa pun.

**Endpoint di halaman ini**

- `GET /v1/catalog/coins`: Mata uang kripto dan jaringan yang diterima (beserta alamat deposit tetapnya)
- `POST /v1/topups`: Mulai isi saldo kripto (alamat tetap, jumlah pasti)
- `POST /v1/topups/{topUpId}/txid`: Laporkan pembayaran sebagai telah dikirim (TXID opsional)
- `GET /v1/topups/{topUpId}`: Dapatkan isi saldo (periksa status terkini)
- `GET /v1/topups`: Lihat daftar isi saldo kripto

URL dasar `https://localserpproxy.com/api/v1`. Autentikasi, error, dan batas: lihat [ringkasan API](https://localserpproxy.com/id/docs/api/)].

## Mata uang kripto dan jaringan yang diterima (dengan alamat deposit tetap)

`GET /v1/catalog/coins`

Publik: tidak perlu kunci API.

**Respons** `200 OK`

```json
{
  "data": [
    {
      "code": "BTC",
      "name": "Bitcoin",
      "networks": [
        {
          "id": "bitcoin",
          "name": "Bitcoin",
          "confirmationsRequired": 2,
          "estimatedMinutes": null,
          "memoRequired": false,
          "address": "DEPOSIT_ADDRESS"
        }
      ]
    }
  ]
}
```

*curl*

```bash
curl -s "https://localserpproxy.com/api/v1/catalog/coins"
```

*Python*

```python
import os
import requests

API = "https://localserpproxy.com/api/v1"

r = requests.get(f"{API}/catalog/coins", timeout=30)
r.raise_for_status()
print(r.json())
```

*Node.js*

```javascript
// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';

const res = await fetch(`${API}/catalog/coins`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());
```

## Mulai isi saldo dengan kripto (alamat tetap, jumlah pasti)

`POST /v1/topups`

- `amountUsd` ≥ 25.00 USD dan ≤ batas maksimum (default 10,000.00): `422` di `amountUsd` jika tidak.
- `coin` + `network` harus salah satu dari `GET /v1/catalog/coins` (jika tidak, `409 coin_unavailable`).
- Mengembalikan `address` **tetap** milik jaringan dan `amountCrypto` pasti = `amountUsd` / `rate`, dibulatkan **ke atas** sesuai presisi koin (BTC/LTC/ETH/SOL 8 desimal, USDT/USDC 6), ditambah selisih kecil unik pada digit terakhir agar tidak ada 2 isi saldo terbuka di jaringan yang sama meminta jumlah yang sama. `rate` dikunci hingga `expiresAt` (30 menit); `txidDeadline` = `expiresAt` + 72 jam.
- Opsional `purchase` (isi yang sama dengan `POST /v1/orders`): divalidasi dan dihitung harganya sekarang (`422` dengan nama kolom berawalan `purchase.`, `409 plan_unavailable`…). `amountUsd` harus mencukupi total `purchase` − saldo saat ini (`422 too_small` di `amountUsd`). Saat isi saldo dikreditkan, pesanan dibuat dari saldo dalam transaksi yang sama; `purchase.status` menjadi `completed` (dengan `orderId`) atau `failed` (`failureReason`; dana tetap ada di saldo).

Autentikasi: kunci API di header `Authorization: Bearer API_KEY`.

**Parameter**

| Nama | Di | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- | --- |
| `Idempotency-Key` | header | string | Tidak | Kunci unik (misalnya UUID) untuk mengulangi POST dengan aman. Berlaku 24 jam. — maks. 128 karakter |

**Isi permintaan**

| Kolom | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- |
| `amountUsd` | string (USD, 2 decimals) | Ya | USD untuk ditambahkan: ≥ 25.00, ≤ 10,000.00 secara default. |
| `coin` | string | Ya | — |
| `network` | string | Ya | — |
| `purchase` | object | Tidak | Rencana pembelian dari saldo setelah isi saldo dikreditkan (isi yang sama dengan `POST /v1/orders`). |

*Contoh: Saldo*

```json
{
  "amountUsd": "50.00",
  "coin": "USDT",
  "network": "tron"
}
```

*Contoh: Checkout*

```json
{
  "amountUsd": "25.00",
  "coin": "BTC",
  "network": "bitcoin",
  "purchase": {
    "planId": "res-10",
    "quantity": 1
  }
}
```

**Respons** `201 Created`

```json
{
  "id": "top_7d2kq9x1",
  "status": "verifying",
  "final": false,
  "amountUsd": "25.00",
  "coin": "USDT",
  "network": "tron",
  "address": "DEPOSIT_ADDRESS",
  "amountCrypto": "25.000137",
  "rate": "1.00",
  "paymentUri": "PAYMENT_URI",
  "expiresAt": "2026-10-05T14:33:11Z",
  "txidDeadline": "2026-10-08T14:33:11Z",
  "confirmationsRequired": 20,
  "confirmations": 7,
  "txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "txidSubmittedAt": "2026-10-05T14:09:42Z",
  "amountReceivedCrypto": "25.000137",
  "explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "creditedUsd": null,
  "creditedAt": null,
  "rejection": null,
  "purchase": {
    "planId": "res-10",
    "planName": "Local team",
    "quantity": 1,
    "options": {},
    "promoCode": null,
    "total": "7.50",
    "status": "pending",
    "orderId": null,
    "failureReason": null
  },
  "createdAt": "2026-10-05T14:03:11Z"
}
```

*curl*

```bash
curl -s -X POST "https://localserpproxy.com/api/v1/topups" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"amountUsd":"50.00","coin":"USDT","network":"tron"}'
```

*Python*

```python
import os, uuid
import requests

API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}", "Idempotency-Key": str(uuid.uuid4())}

r = requests.post(f"{API}/topups", headers=HEADERS, json={"amountUsd": "50.00", "coin": "USDT", "network": "tron"}, timeout=30)
r.raise_for_status()
print(r.json())
```

*Node.js*

```javascript
// Node.js 18+ (built-in fetch), ES module
import { randomUUID } from 'node:crypto';

const API = 'https://localserpproxy.com/api/v1';

const res = await fetch(`${API}/topups`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Idempotency-Key': randomUUID(), 'Content-Type': 'application/json' },
  body: JSON.stringify({ amountUsd: '50.00', coin: 'USDT', network: 'tron' }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());
```

## Laporkan pembayaran sebagai terkirim (TXID opsional)

`POST /v1/topups/{topUpId}/txid`

Laporkan pembayaran sebagai terkirim setelah dana meninggalkan dompet atau bursa Anda: ini adalah versi API dari tombol “Saya sudah mengirim pembayaran”. ID transaksi (TXID) bersifat opsional: kirim isi kosong (`{}`), atau tambahkan `txid` jika Anda memilikinya. Pembayaran Anda dicocokkan dengan isi saldo ini berdasarkan jumlah pastinya (`amountCrypto`) pada jaringan dan alamat isi saldo tersebut, jadi kirim jumlah yang persis sama.

Dapat diterima saat isi saldo berstatus `awaiting_payment`, `expired` atau `rejected`, dan sebelum `txidDeadline` (`expiresAt` + 72 jam): laporan yang terlambat tidak akan menyebabkan pembayaran hilang. `txid`, jika diberikan, akan diperiksa berdasarkan format jaringan (`422` di `txid`) dan tidak boleh diklaim oleh isi saldo lain (`409 txid_already_used`). Isi saldo yang sudah ditutup akan mengembalikan `409 topup_closed`. Isi saldo kemudian berstatus `verifying` selama pembayaran diperiksa di blockchain, dan berakhir dengan status `credited` setelah jaringan mengonfirmasi transaksi, atau `rejected` (dengan `rejection`).

Autentikasi: kunci API di header `Authorization: Bearer API_KEY`.

**Parameter**

| Nama | Di | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- | --- |
| `topUpId` | path | string | Ya | — |

**Isi permintaan**

| Kolom | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- |
| `txid` | string | Tidak | Opsional. Hash transaksi: 64 karakter heksadesimal (bitcoin, litecoin, tron), 0x + 64 karakter heksadesimal (ethereum), tanda tangan base58 (solana). Kosong atau tidak dicantumkan: pembayaran dicocokkan berdasarkan jumlah pastinya. — maks. 128 karakter |

*Contoh: Pembayaran terkirim*

```json
{}
```

*Contoh: Dengan TXID (opsional)*

```json
{
  "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
}
```

**Respons** `200 OK`

```json
{
  "id": "top_7d2kq9x1",
  "status": "verifying",
  "final": false,
  "amountUsd": "25.00",
  "coin": "USDT",
  "network": "tron",
  "address": "DEPOSIT_ADDRESS",
  "amountCrypto": "25.000137",
  "rate": "1.00",
  "paymentUri": "PAYMENT_URI",
  "expiresAt": "2026-10-05T14:33:11Z",
  "txidDeadline": "2026-10-08T14:33:11Z",
  "confirmationsRequired": 20,
  "confirmations": 7,
  "txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "txidSubmittedAt": "2026-10-05T14:09:42Z",
  "amountReceivedCrypto": "25.000137",
  "explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "creditedUsd": null,
  "creditedAt": null,
  "rejection": null,
  "purchase": {
    "planId": "res-10",
    "planName": "Local team",
    "quantity": 1,
    "options": {},
    "promoCode": null,
    "total": "7.50",
    "status": "pending",
    "orderId": null,
    "failureReason": null
  },
  "createdAt": "2026-10-05T14:03:11Z"
}
```

*curl*

```bash
curl -s -X POST "https://localserpproxy.com/api/v1/topups/top_7d2kq9x1/txid" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

*Python*

```python
import os
import requests

API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}

r = requests.post(f"{API}/topups/top_7d2kq9x1/txid", headers=HEADERS, json={}, timeout=30)
r.raise_for_status()
print(r.json())
```

*Node.js*

```javascript
// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';

const res = await fetch(`${API}/topups/top_7d2kq9x1/txid`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({}),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());
```

## Isi saldo (pantau status terkini)

`GET /v1/topups/{topUpId}`

Pantau rute ini untuk mengikuti proses isi saldo: setiap 10 dtk selama `status = verifying`, setiap 30 dtk saat menunggu pembayaran, lalu berhenti saat `final = true`. Isi saldo menjadi `expired` jika pembayaran belum dilaporkan terkirim sebelum `expiresAt`; pembayaran masih dapat dilaporkan hingga `txidDeadline`.

Autentikasi: kunci API di header `Authorization: Bearer API_KEY`.

**Parameter**

| Nama | Di | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- | --- |
| `topUpId` | path | string | Ya | — |

**Respons** `200 OK`

```json
{
  "id": "top_7d2kq9x1",
  "status": "verifying",
  "final": false,
  "amountUsd": "25.00",
  "coin": "USDT",
  "network": "tron",
  "address": "DEPOSIT_ADDRESS",
  "amountCrypto": "25.000137",
  "rate": "1.00",
  "paymentUri": "PAYMENT_URI",
  "expiresAt": "2026-10-05T14:33:11Z",
  "txidDeadline": "2026-10-08T14:33:11Z",
  "confirmationsRequired": 20,
  "confirmations": 7,
  "txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "txidSubmittedAt": "2026-10-05T14:09:42Z",
  "amountReceivedCrypto": "25.000137",
  "explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
  "creditedUsd": null,
  "creditedAt": null,
  "rejection": null,
  "purchase": {
    "planId": "res-10",
    "planName": "Local team",
    "quantity": 1,
    "options": {},
    "promoCode": null,
    "total": "7.50",
    "status": "pending",
    "orderId": null,
    "failureReason": null
  },
  "createdAt": "2026-10-05T14:03:11Z"
}
```

*curl*

```bash
curl -s "https://localserpproxy.com/api/v1/topups/top_7d2kq9x1" \
  -H "Authorization: Bearer $API_KEY"
```

*Python*

```python
import os
import requests

API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}

r = requests.get(f"{API}/topups/top_7d2kq9x1", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())
```

*Node.js*

```javascript
// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';

const res = await fetch(`${API}/topups/top_7d2kq9x1`, {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());
```

## Daftar isi saldo kripto

`GET /v1/topups`

Autentikasi: kunci API di header `Authorization: Bearer API_KEY`.

**Parameter**

| Nama | Di | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- | --- |
| `page` | query | integer | Tidak | ≥ 1, default `1` |
| `perPage` | query | integer | Tidak | 1–100, default `20` |
| `status` | query | `awaiting_payment` · `verifying` · `credited` · `rejected` · `expired` | Tidak | `final` = dikreditkan, atau kedaluwarsa / ditolak setelah `txidDeadline`. |

**Respons** `200 OK`

```json
{
  "data": [
    {
      "id": "top_7d2kq9x1",
      "status": "verifying",
      "final": false,
      "amountUsd": "25.00",
      "coin": "USDT",
      "network": "tron",
      "address": "DEPOSIT_ADDRESS",
      "amountCrypto": "25.000137",
      "rate": "1.00",
      "paymentUri": "PAYMENT_URI",
      "expiresAt": "2026-10-05T14:33:11Z",
      "txidDeadline": "2026-10-08T14:33:11Z",
      "confirmationsRequired": 20,
      "confirmations": 7,
      "txid": "9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
      "txidSubmittedAt": "2026-10-05T14:09:42Z",
      "amountReceivedCrypto": "25.000137",
      "explorerUrl": "https://tronscan.org/#/transaction/9d2e5c0b1f7a4e3d8c6b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f41c7",
      "creditedUsd": null,
      "creditedAt": null,
      "rejection": null,
      "purchase": {
        "planId": "res-10",
        "planName": "Local team",
        "quantity": 1,
        "options": {},
        "promoCode": null,
        "total": "7.50",
        "status": "pending",
        "orderId": null,
        "failureReason": null
      },
      "createdAt": "2026-10-05T14:03:11Z"
    }
  ],
  "pagination": {
    "page": 1,
    "perPage": 20,
    "total": 1,
    "totalPages": 1
  }
}
```

*curl*

```bash
curl -s "https://localserpproxy.com/api/v1/topups" \
  -H "Authorization: Bearer $API_KEY"
```

*Python*

```python
import os
import requests

API = "https://localserpproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}

r = requests.get(f"{API}/topups", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())
```

*Node.js*

```javascript
// Node.js 18+ (built-in fetch), ES module
const API = 'https://localserpproxy.com/api/v1';

const res = await fetch(`${API}/topups`, {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());
```

---

LocalSERP Proxy: LocalSERP Proxy adalah layanan proxy residensial AS untuk memeriksa hasil pencarian lokal, iklan, dan harga kota demi kota, dengan pembayaran kripto tanpa mengunggah dokumen identitas.
