Masuk

Arbakti
atau

Belum punya akun?

Arbakti Store

Referensi API

Integrasikan Arbakti ke sistem Anda

Top up game dan PPOB, nomor OTP, suntik sosmed, cek ID game, dan payment gateway. Semua lewat REST JSON dengan satu akun.

Base URL

https://arbakti.id

Header auth

x-apikey: ARB-xxx

IP Anda

…

Format

JSON · HTTPS

  1. 1

    Buat API key

    Masuk, buka Akun → API, lalu buat key dengan akses layanan yang dibutuhkan.

  2. 2

    Daftarkan IP server

    Masukkan IP server Anda ke whitelist. Perubahan aktif setelah disetujui admin.

  3. 3

    Panggil /whoami

    Kalau keluar username dan saldo Anda, key dan whitelist sudah benar.

Autentikasi

Kirim API key di header x-apikey. Parameter apikey di query string atau body JSON juga diterima, tapi header lebih aman karena tidak tercatat di log URL.

Setiap request dicek dari IP pemanggilnya. IP yang tidak ada di whitelist akun ditolak dengan HTTP 403, walaupun key-nya benar.

Satu akun bisa punya sampai 5 key. Tiap key hanya bisa memanggil layanan yang dicentang saat dibuat:

AksesLayanan
topupAkun, top up & PPOB, validasi pelanggan, deposit saldo.
otpOTP / nomor virtual.
sosmedSuntik sosmed.
macroPayment Gateway Custom (/payment/*).
gopayPG GoPay Merchant (/payment/gopay/*).
bridgePayment Gateway Otomatis (/v1/*).
restREST API (/api/v3/*): AI, downloader, stalker, tools, dan lainnya.
idgameCek ID Game (/list-game, /api/game/*).
tmailTmail, email sementara (/api/v1/tmail/*).
cdnCDN, upload dan kelola file (/api/v1/cdn/*).
amAktivasi AM Premium (/api/v1/am/*).

Rate limit dihitung per akun per menit. /products di top up dan semua endpoint OTP, sosmed, dan /whoami ikut dihitung. Melewatinya menghasilkan HTTP 429.

Contoh
curl "https://arbakti.id/api/v1/whoami" \
  -H "x-apikey: ARB-xxx"

Response & error

Top up, OTP, dan sosmed membalas { status, msg, data }. status: false berarti gagal dan msg berisi alasannya. Payment Gateway Custom memakai { success, message, data }, dan Payment Gateway Otomatis memakai { error: { code, message }, request_id }.

HTTPArti
200 / 201Berhasil. Tetap cek field status / success, karena sebagian provider membalas 200 untuk hasil gagal.
400Parameter salah atau aturan bisnis ditolak (saldo kurang, ref_id dipakai).
401API key kosong atau salah.
403IP belum di-whitelist, atau key tidak punya akses ke layanan itu.
404Data tidak ditemukan atau bukan milik Anda.
422Tipe parameter salah (OTP dan sosmed).
429Melewati rate limit. Tunggu sampai jendela menit berikutnya; untuk REST API, kuota harian habis dan reset 00:00 WIB.
5xxGangguan di kami atau provider. Aman diulang dengan ref_id yang sama, lalu cek status.

Kode error Payment Gateway Otomatis

CodeHTTPArti
UNAUTHORIZED401API key salah atau tanpa akses bridge.
IP_NOT_WHITELISTED403IP belum ada di whitelist akun.
ACCOUNT_BLOCKED403Belum disetujui atau dinonaktifkan.
VALIDATION_ERROR400Parameter salah, lihat message.
AMOUNT_TOO_SMALL400Nominal di bawah minimum.
INSUFFICIENT_TENANT_BALANCE400Saldo tidak cukup.
BANK_ACCOUNT_NOT_SET400Rekening belum disetujui.
WITHDRAW_FROZEN400Withdraw ditahan sementara setelah ganti rekening.
CHANNEL_UNAVAILABLE503Channel sedang tidak aktif.
TRY_AGAIN_LATER503Terlalu banyak request.
UPSTREAM_TIMEOUT502Masih diproses. Ulangi dengan reference_id yang sama.
INTERNAL_ERROR500Kesalahan di kami. Sertakan request_id saat menghubungi CS.
Bentuk error
{
  "status": false,
  "msg": "Insufficient balance or user not found"
}

Akses: topup

Akun

Cek saldo, identitas key, dan atur callback URL. Profil dan rotasi key butuh akses topup.

GET /api/v1/status

Status server

Health check publik, tanpa API key. Field ip berisi IP Anda seperti yang kami lihat: IP inilah yang harus masuk whitelist.

Publik
Request
curl -X GET "https://arbakti.id/api/v1/status"
Response
{
  "status": true,
  "msg": "Server is running",
  "version": "1.0.0",
  "ip": "182.8.97.121",
  "timestamp": "2026-09-27T14:00:00.000Z",
  "services": {
    "database": "CONNECTED",
    "redis": "CONNECTED"
  }
}
GET /api/v1/whoami

Cek API key

Cara tercepat memastikan key, whitelist IP, dan rate limit sudah benar. Semua key bisa memanggilnya, apa pun aksesnya.

x-apikey
Request
curl -X GET "https://arbakti.id/api/v1/whoami" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": {
    "username": "tokoanda",
    "role": "member",
    "saldo": 99988,
    "ip": "182.8.97.121"
  }
}
GET /api/v1/profile

Profil & statistik

Data akun, saldo, whitelist IP, callback URL, dan ringkasan deposit serta belanja.

x-apikey
Request
curl -X GET "https://arbakti.id/api/v1/profile" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "msg": "User Profile statistics retrieved",
  "data": {
    "username": "tokoanda",
    "nomor_wa": "08123456789",
    "saldo": 99988,
    "role": "member",
    "apikey": "ARB-xxx",
    "whitelistIp": [
      "182.8.97.121"
    ],
    "callback_url": "https://tokoanda.com/webhook/arbakti",
    "stats": {
      "total_deposit": 10000,
      "total_pengeluaran": 12,
      "total_pembelian": 2,
      "saldo_saat_ini": 99988,
      "formatted": {
        "total_deposit": "Rp 10.000",
        "total_pengeluaran": "Rp 12",
        "saldo_saat_ini": "Rp 99.988"
      }
    },
    "createdAt": "2026-03-23T16:46:47.499Z",
    "updatedAt": "2026-03-25T15:41:51.254Z"
  }
}
PATCH /api/v1/profile/callback-url

Set callback URL

URL tujuan semua webhook akun ini. Wajib HTTPS. Kirim kosong atau null untuk mematikan webhook. Bisa juga diatur dari halaman Akun → Webhook.

x-apikey

Parameter

callback_url string

URL HTTPS penerima webhook.

Request
curl -X PATCH "https://arbakti.id/api/v1/profile/callback-url" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"callback_url":"https://tokoanda.com/webhook/arbakti"}'
Response
{
  "status": true,
  "msg": "Callback URL updated successfully",
  "data": {
    "callback_url": "https://tokoanda.com/webhook/arbakti"
  }
}
PATCH /api/v1/rotate-key

Rotasi API key

Membuat key baru dan langsung mencabut semua key lama di akun ini, termasuk key yang dibuat dari dashboard.

x-apikey
  • Simpan new_apikey sebelum melakukan request lain. Key lama tidak bisa dipakai lagi.
Request
curl -X PATCH "https://arbakti.id/api/v1/rotate-key" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "msg": "API Key rotated successfully",
  "new_apikey": "ARB-new-key"
}

Akses: topup

Top Up & PPOB

Produk prabayar (game, pulsa, data, token) dan pascabayar (tagihan PLN dan lainnya). Saldo terpotong saat order dibuat dan otomatis kembali kalau transaksi gagal.

GET /api/v1/products

Daftar produk

Produk yang sedang dijual. price sudah disesuaikan dengan role akun Anda.

x-apikey
  • Endpoint ini kena rate limit per akun. Simpan hasilnya di sisi Anda, jangan dipanggil per order.

Parameter

category string

Filter kategori, mis. Games.

brand string

Filter brand, mis. FREE FIRE.

keyword string

Cari di nama produk.

type string

prepaid atau pasca.

mode string

Varian produk, mis. Umum atau Membership.

Request
curl -X GET "https://arbakti.id/api/v1/products?category=Games&brand=FREE+FIRE" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "msg": "Products fetched successfully",
  "data": [
    {
      "product_name": "Free Fire 70 Diamond",
      "category": "Games",
      "brand": "FREE FIRE",
      "sku": "FF70",
      "price": 9350,
      "admin": 0,
      "type": "prepaid",
      "mode": "Umum",
      "seller_product_status": true,
      "buyer_product_status": true,
      "desc": "Masukkan User ID."
    }
  ]
}
POST /api/v1/transaction

Buat transaksi prabayar

Membeli satu produk. Status awal biasanya Pending; hasil akhir datang lewat webhook order.success / order.failed, atau cek manual.

x-apikey
  • ref_id 5–50 karakter dan unik secara global. ref_id yang sudah pernah dipakai akan ditolak.

Parameter

sku string wajib

Kode produk dari /products.

target string wajib

Tujuan: nomor HP, ID game, nomor meter.

ref_id string wajib

ID transaksi dari sistem Anda.

Request
curl -X POST "https://arbakti.id/api/v1/transaction" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"sku":"FF70","target":"12345678","ref_id":"ORDER-101"}'
Response
{
  "status": true,
  "msg": "Transaction processed",
  "data": {
    "ref_id": "ORDER-101",
    "sku": "FF70",
    "target": "12345678",
    "price": 9350,
    "status": "Pending",
    "sn": "",
    "message": "Transaksi Pending",
    "createdAt": "2026-09-27T14:00:00.000Z"
  }
}
GET /api/v1/check-status

Cek status transaksi

Status terakhir satu transaksi milik Anda.

x-apikey
  • Status: Pending, Sukses, Gagal. sn berisi serial number atau bukti dari provider saat sukses.

Parameter

ref_id string wajib

ref_id transaksi.

Request
curl -X GET "https://arbakti.id/api/v1/check-status?ref_id=ORDER-101" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": {
    "ref_id": "ORDER-101",
    "user": {
      "username": "tokoanda",
      "nomor_wa": "08123456789"
    },
    "sku": "FF70",
    "target": "12345678",
    "price": 9350,
    "status": "Sukses",
    "sn": "1234567890",
    "message": "Transaksi Sukses",
    "createdAt": "2026-09-27T14:00:00.000Z"
  }
}
GET /api/v1/transaction/history

Riwayat transaksi

Transaksi Anda, terbaru dulu, per halaman.

x-apikey

Parameter

page number

Halaman, mulai 1.

limit number

Baris per halaman, default 20, maks 100.

Request
curl -X GET "https://arbakti.id/api/v1/transaction/history?page=1&limit=20" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "ref_id": "ORDER-101",
      "sku": "FF70",
      "target": "12345678",
      "price": 9350,
      "status": "Sukses",
      "sn": "1234567890",
      "createdAt": "2026-09-27T14:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 57,
    "pages": 3
  }
}
POST /api/v1/transaction/check-bill

Pascabayar · cek tagihan

Langkah 1 dari 2. Mengambil nama pelanggan dan nominal tagihan tanpa memotong saldo.

x-apikey
  • total_price sudah memakai harga role Anda. prices menampilkan harga di tiap role.

Parameter

sku string wajib

Kode produk pascabayar, mis. PLNPASCA.

target string wajib

Nomor pelanggan.

ref_id string wajib

ID yang juga dipakai saat bayar.

Request
curl -X POST "https://arbakti.id/api/v1/transaction/check-bill" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"sku":"PLNPASCA","target":"530000000001","ref_id":"BILL-PLN-001"}'
Response
{
  "status": true,
  "msg": "Bill retrieved successfully",
  "data": {
    "ref_id": "BILL-PLN-001",
    "sku": "PLNPASCA",
    "target": "530000000001",
    "customer_name": "Nama Pelanggan",
    "bill_amount": 10000,
    "admin_fee": 4200,
    "total_price": 14200,
    "prices": {
      "member": 14200,
      "gold": 14140,
      "platinum": 14100,
      "titanium": 14060,
      "diamond": 14040
    },
    "desc": {
      "tarif": "R1",
      "daya": 1300,
      "lembar_tagihan": 1,
      "detail": [
        {
          "periode": "201901",
          "nilai_tagihan": "8000",
          "admin": "2500",
          "denda": "500"
        }
      ]
    }
  }
}
POST /api/v1/transaction/pay-bill

Pascabayar · bayar tagihan

Langkah 2 dari 2. Tagihan dicek ulang, saldo terpotong sebesar tagihan + admin, lalu dibayarkan.

x-apikey
  • Pakai sku, target, dan ref_id yang sama dengan cek tagihan.

Parameter

sku string wajib

Sama dengan cek tagihan.

target string wajib

Sama dengan cek tagihan.

ref_id string wajib

Sama dengan cek tagihan.

Request
curl -X POST "https://arbakti.id/api/v1/transaction/pay-bill" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"sku":"PLNPASCA","target":"530000000001","ref_id":"BILL-PLN-001"}'
Response
{
  "status": true,
  "msg": "Postpaid payment processed",
  "data": {
    "ref_id": "BILL-PLN-001",
    "customer_no": "530000000001",
    "customer_name": "Nama Pelanggan",
    "buyer_sku_code": "PLNPASCA",
    "message": "Transaksi Pending",
    "status": "Pending",
    "rc": "03"
  }
}
GET /api/v1/transaction/status-pasca

Pascabayar · cek status

Menanyakan status pembayaran tagihan ke provider. Kalau hasilnya Gagal, saldo otomatis dikembalikan.

x-apikey

Parameter

sku string wajib

Kode produk pascabayar.

target string wajib

Nomor pelanggan.

ref_id string wajib

ref_id pembayaran.

Request
curl -X GET "https://arbakti.id/api/v1/transaction/status-pasca?sku=PLNPASCA&target=530000000001&ref_id=BILL-PLN-001" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "msg": "Postpaid status retrieved successfully",
  "data": {
    "ref_id": "BILL-PLN-001",
    "customer_no": "530000000001",
    "customer_name": "Nama Pelanggan",
    "buyer_sku_code": "PLNPASCA",
    "message": "Transaksi Sukses",
    "status": "Sukses",
    "sn": "S1234554321N",
    "rc": "00"
  }
}

Akses: topup

Validasi Pelanggan

Cek nama pemilik ID sebelum order supaya tidak salah kirim. formatted_text siap ditempel ke chat.

POST /api/v1/stalk/pln

Cek pelanggan PLN

Nama dan daya dari nomor meter atau ID pelanggan PLN.

x-apikey

Parameter

customer_no string wajib

Nomor meter / ID pelanggan.

Request
curl -X POST "https://arbakti.id/api/v1/stalk/pln" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"customer_no":"86047565204"}'
Response
{
  "status": true,
  "msg": "PLN Inquiry success",
  "data": {
    "name": "MARWIYAH",
    "meter_no": "86047565204",
    "subscriber_id": "514540921869",
    "segment_power": "R1M/900",
    "formatted_text": "..."
  }
}
POST /api/v1/stalk/ml

Cek akun Mobile Legends

Nickname dan region dari User ID + Zone ID.

x-apikey

Parameter

id string wajib

User ID.

zone string wajib

Zone ID.

Request
curl -X POST "https://arbakti.id/api/v1/stalk/ml" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"id":"79699113","zone":"2149"}'
Response
{
  "status": true,
  "msg": "Stalk ML success",
  "data": {
    "username": "Lynzz_",
    "user_id": "79699113",
    "zone": "2149",
    "region": "ID",
    "formatted_text": "..."
  }
}
POST /api/v1/stalk/ff

Cek akun Free Fire

Nickname dari User ID.

x-apikey

Parameter

id string wajib

User ID.

Request
curl -X POST "https://arbakti.id/api/v1/stalk/ff" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"id":"8866371856"}'
Response
{
  "status": true,
  "msg": "Stalk FF success",
  "data": {
    "username": "Player01",
    "user_id": "8866371856",
    "zone": null,
    "formatted_text": "..."
  }
}
POST /api/v1/stalk/mcgg

Cek akun Magic Chess

Nickname dari User ID + Zone ID.

x-apikey

Parameter

id string wajib

User ID.

zone string wajib

Zone ID.

Request
curl -X POST "https://arbakti.id/api/v1/stalk/mcgg" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"id":"8482231","zone":"4223"}'
Response
{
  "status": true,
  "msg": "Stalk Magic Chess success",
  "data": {
    "username": "Lynzz_",
    "user_id": "8482231",
    "zone": "4223",
    "formatted_text": "..."
  }
}

Akses: topup

Deposit Saldo

Isi saldo akun lewat payment gateway. Saldo bertambah otomatis setelah dibayar, lalu webhook deposit.success dikirim.

POST /api/v1/deposit

Buat deposit

Membuat tagihan deposit. Isi data tergantung gateway: QRIS mengembalikan qrString/qrUrl, gateway lain checkoutUrl atau paymentUrl.

x-apikey
  • Minimum Rp 1.000, maksimum Rp 100.000.000. Lewat arbakti maksimum Rp 100.000.
  • Biaya deposit (kalau ada) ditambahkan ke total. Saldo yang masuk tetap sebesar amount.

Parameter

provider string wajib

Gateway yang aktif: arbakti, xendit, paydisini.

amount number wajib

Nominal saldo, angka tanpa titik.

Request
curl -X POST "https://arbakti.id/api/v1/deposit" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"provider":"arbakti","amount":50000}'
Response
{
  "status": true,
  "msg": "Deposit request created",
  "data": {
    "refId": "TRX-1790517600123-9f3a1c2b",
    "amount": 50000,
    "fee": 350,
    "total": 50350,
    "qrUrl": "https://...",
    "paymentUrl": "https://..."
  }
}
GET /api/v1/deposit/status

Cek status deposit

Menanyakan status pembayaran ke gateway. Kalau sudah dibayar, saldo langsung dikreditkan.

x-apikey
  • Status: PENDING, SUCCEEDED, EXPIRED.

Parameter

refId string wajib

refId dari buat deposit.

Request
curl -X GET "https://arbakti.id/api/v1/deposit/status?refId=DEP-tokoanda-1790517600123" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "msg": "Deposit succeeded",
  "data": {
    "externalId": "DEP-tokoanda-1790517600123",
    "amount": 50000,
    "fee": 350,
    "total": 50350,
    "provider": "xendit",
    "status": "SUCCEEDED"
  }
}
GET /api/v1/deposit/history

Riwayat deposit

50 deposit terakhir, terbaru dulu.

x-apikey
Request
curl -X GET "https://arbakti.id/api/v1/deposit/history" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "externalId": "DEP-tokoanda-1790517600123",
      "amount": 50000,
      "fee": 350,
      "total": 50350,
      "provider": "xendit",
      "status": "SUCCEEDED",
      "createdAt": "2026-09-27T14:00:00.000Z"
    }
  ]
}

Akses: otp

OTP / Nomor Virtual

Sewa nomor untuk menerima SMS OTP. Alurnya: services → countries → operators → order, lalu tunggu webhook otp.received atau cek order sampai kode masuk.

GET /api/v1/otp/services

Daftar aplikasi

Aplikasi yang nomornya bisa disewa.

x-apikey
Request
curl -X GET "https://arbakti.id/api/v1/otp/services" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "service_code": 13,
      "service_name": "WhatsApp",
      "service_img": "https://assets.cindigital.id/apps/whatsapp.png"
    }
  ]
}
GET /api/v1/otp/countries

Negara & harga

Negara dan server untuk satu aplikasi, dengan harga sesuai role Anda. Pakai number_id dan provider_id dari sini saat order.

x-apikey
  • rate adalah persentase keberhasilan server.

Parameter

service_id number wajib

service_code dari /otp/services.

Request
curl -X GET "https://arbakti.id/api/v1/otp/countries?service_id=13" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "number_id": 340437,
      "name": "Indonesia",
      "img": "https://assets.cindigital.id/flags/id.png",
      "prefix": "+62",
      "iso_code": "id",
      "rate": 81.6,
      "stock_total": 103,
      "pricelist": [
        {
          "provider_id": "3837",
          "server_id": 3,
          "stock": 103,
          "rate": 81.6,
          "price": 1155,
          "available": true
        }
      ]
    }
  ]
}
GET /api/v1/otp/operators

Daftar operator

Operator untuk satu negara dan server. Pakai id 1 (any) kalau operator tidak penting.

x-apikey

Parameter

country string wajib

Nama negara huruf kecil, mis. indonesia.

provider_id string wajib

provider_id dari pricelist.

Request
curl -X GET "https://arbakti.id/api/v1/otp/operators?country=indonesia&provider_id=3837" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "id": 1,
      "name": "any",
      "image": "https://assets.cindigital.id/carriers/indonesia/any.ico"
    },
    {
      "id": 3,
      "name": "telkomsel",
      "image": "https://assets.cindigital.id/carriers/indonesia/telkomsel.jpg"
    }
  ]
}
POST /api/v1/otp/order

Sewa nomor

Saldo langsung terpotong dan nomor aktif sekitar 20 menit. Setelah itu tunggu webhook otp.received atau cek order berkala.

x-apikey

Parameter

service_id number wajib

service_code aplikasi.

number_id number wajib

number_id negara.

provider_id string wajib

provider_id server.

operator_id number wajib

id operator.

ref_id string

ID dari sistem Anda. Kosongkan untuk dibuatkan otomatis.

Request
curl -X POST "https://arbakti.id/api/v1/otp/order" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"service_id":13,"number_id":340437,"provider_id":"3837","operator_id":1,"ref_id":"MYORDER-001"}'
Response
{
  "status": true,
  "msg": "Number rented",
  "data": {
    "ref_id": "MYORDER-001",
    "service_id": 13,
    "service_name": "WhatsApp",
    "country": "Indonesia",
    "operator": "any",
    "phone_number": "6281234567890",
    "price": 1155,
    "status": "received",
    "otp_code": null,
    "otp_msg": null,
    "refunded": false,
    "expired_at": "2026-09-27T14:20:00.000Z",
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}
GET /api/v1/otp/order/:ref_id

Cek order & kode

Status order dan kode OTP yang masuk.

x-apikey
  • Status: received menunggu SMS, completed selesai, canceled batal.
  • Order yang batal atau kedaluwarsa tanpa SMS otomatis dikembalikan ke saldo (refunded: true).

Parameter

ref_id path wajib

ref_id order.

Request
curl -X GET "https://arbakti.id/api/v1/otp/order/MYORDER-001" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": {
    "ref_id": "MYORDER-001",
    "service_id": 13,
    "service_name": "WhatsApp",
    "country": "Indonesia",
    "operator": "any",
    "phone_number": "6281234567890",
    "price": 1155,
    "status": "received",
    "otp_code": "123456",
    "otp_msg": "Kode WhatsApp Anda: 123-456",
    "refunded": false,
    "expired_at": "2026-09-27T14:20:00.000Z",
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}
POST /api/v1/otp/order/status

Selesai / batal / kirim ulang

done menutup order, cancel membatalkan, resend meminta SMS baru.

x-apikey
  • cancel hanya mengembalikan saldo kalau belum ada SMS masuk.

Parameter

ref_id string wajib

ref_id order.

action string wajib

done, cancel, atau resend.

Request
curl -X POST "https://arbakti.id/api/v1/otp/order/status" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"ref_id":"MYORDER-001","action":"cancel"}'
Response
{
  "status": true,
  "msg": "Order cancel requested",
  "data": {
    "ref_id": "MYORDER-001",
    "service_id": 13,
    "service_name": "WhatsApp",
    "country": "Indonesia",
    "operator": "any",
    "phone_number": "6281234567890",
    "price": 1155,
    "status": "canceled",
    "otp_code": null,
    "otp_msg": null,
    "refunded": true,
    "expired_at": "2026-09-27T14:20:00.000Z",
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}

Akses: sosmed

Suntik Sosmed

Followers, likes, views, komentar, dan lainnya. Alurnya: services → order, lalu tunggu webhook sosmed.* atau cek pesanan.

GET /api/v1/sosmed/services

Daftar layanan

Layanan yang bisa dipesan, dengan harga sesuai role Anda.

x-apikey
  • price adalah harga per 1.000. Total = price × quantity / 1000, dibulatkan ke atas.
  • refill: true berarti layanan bergaransi dan bisa diminta refill.
  • server menunjukkan server pemroses (1 atau 2). id unik di semua server, jadi cukup kirim id saat order.
Request
curl -X GET "https://arbakti.id/api/v1/sosmed/services" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "id": 1,
      "server": 1,
      "type": "default",
      "category_id": 2393541234,
      "category_name": "Instagram Followers",
      "service_name": "Instagram Followers HQ",
      "price": 60500,
      "min": 100,
      "max": 100000,
      "refill": true,
      "description": "Proses cepat",
      "platform_id": "66f0c1d2e3a4b5c6d7e8f901",
      "platform_name": "Instagram",
      "platform_slug": "instagram",
      "platform_image": "/uploads/sosmed/instagram.webp"
    }
  ]
}
POST /api/v1/sosmed/order

Buat pesanan

Saldo langsung terpotong. Untuk layanan custom_comments, isi additional dengan satu komentar per baris dan samakan quantity dengan jumlah baris.

x-apikey

Parameter

service number wajib

id layanan.

target string wajib

Link atau username tujuan.

quantity number wajib

Di antara min dan max layanan.

additional string

Komentar, dipisah \n. Wajib untuk custom_comments.

ref_id string

ID dari sistem Anda. Kosongkan untuk dibuatkan otomatis.

Request
curl -X POST "https://arbakti.id/api/v1/sosmed/order" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"service":1,"target":"https://instagram.com/username","quantity":1000,"ref_id":"MYSMM-001"}'
Response
{
  "status": true,
  "msg": "Order placed",
  "data": {
    "ref_id": "MYSMM-001",
    "service_id": 1,
    "service_name": "Instagram Followers HQ",
    "target": "https://instagram.com/username",
    "quantity": 1000,
    "price": 60500,
    "status": "Pending",
    "start_count": 0,
    "remains": 1000,
    "refill_status": null,
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}
GET /api/v1/sosmed/order/:ref_id

Cek pesanan

Status diperbarui dari provider tiap ±2 menit.

x-apikey
  • Status: Pending, Processing, Success, Partial (sebagian terkirim), Error.
  • start_count jumlah awal di target, remains sisa yang belum terkirim.

Parameter

ref_id path wajib

ref_id pesanan.

Request
curl -X GET "https://arbakti.id/api/v1/sosmed/order/MYSMM-001" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": {
    "ref_id": "MYSMM-001",
    "service_id": 1,
    "service_name": "Instagram Followers HQ",
    "target": "https://instagram.com/username",
    "quantity": 1000,
    "price": 60500,
    "status": "Processing",
    "start_count": 1520,
    "remains": 340,
    "refill_status": null,
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}
POST /api/v1/sosmed/refill

Minta refill

Untuk pesanan selesai yang layanannya bergaransi. Refill hanya bisa diminta sekali per pesanan; pantau refill_status lewat cek pesanan.

x-apikey

Parameter

ref_id string wajib

ref_id pesanan.

Request
curl -X POST "https://arbakti.id/api/v1/sosmed/refill" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"ref_id":"MYSMM-001"}'
Response
{
  "status": true,
  "msg": "Refill requested",
  "data": {
    "ref_id": "MYSMM-001",
    "service_id": 1,
    "service_name": "Instagram Followers HQ",
    "target": "https://instagram.com/username",
    "quantity": 1000,
    "price": 60500,
    "status": "Success",
    "start_count": 0,
    "remains": 0,
    "refill_status": "Pending",
    "created_at": "2026-09-27T14:00:00.000Z"
  }
}

Akses: idgame

Cek ID Game

Cek nickname dari ID game. Wajib API key dengan akses idgame, IP harus di-whitelist, dan rate limit mengikuti akun. Alurnya: list-game → (get-zone) → cek ID.

GET /list-game

Daftar game

Semua game yang bisa dicek. Pakai slug sebagai :game. Kalau hasZoneId: true, parameter zone wajib.

x-apikey
Request
curl -X GET "https://arbakti.id/list-game" \
  -H "x-apikey: ARB-xxx"
Response
{
  "name": "Cek Data Game",
  "author": "Arbakti",
  "data": [
    {
      "name": "+ Free Fire Indonesia",
      "slug": "free-fire-indonesia-gp",
      "endpoint": "/api/game/free-fire-indonesia-gp",
      "query": "?id=xxxx",
      "hasZoneId": false,
      "listZoneId": "/api/game/get-zone/free-fire-indonesia-gp"
    },
    {
      "name": "+ Genshin Impact",
      "slug": "genshin-impact-gp",
      "endpoint": "/api/game/genshin-impact-gp",
      "query": "?id=xxxx&zone=xxx",
      "hasZoneId": true,
      "listZoneId": "/api/game/get-zone/genshin-impact-gp"
    }
  ]
}
GET /api/game/get-zone/:game

Daftar zone

Pilihan zone/server untuk game yang zone-nya berupa daftar. Game dengan zone angka (mis. Mobile Legends) tidak punya daftar; isi langsung angkanya.

x-apikey

Parameter

game path wajib

slug dari /list-game.

Request
curl -X GET "https://arbakti.id/api/game/get-zone/genshin-impact-gp" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "message": "Zone ID Found",
  "data": [
    {
      "zoneId": "os_usa",
      "name": "America"
    },
    {
      "zoneId": "os_euro",
      "name": "Europe"
    },
    {
      "zoneId": "os_asia",
      "name": "Asia"
    },
    {
      "zoneId": "os_cht",
      "name": "TW, HK, MO"
    }
  ]
}
GET /api/game/:game

Cek ID

Nickname dari ID game. Hasil sukses di-cache 5 menit.

x-apikey
  • Selalu cek field status, bukan hanya HTTP code: sebagian provider membalas 200 dengan status: false.

Parameter

game path wajib

slug dari /list-game.

id string wajib

User ID pemain.

zone string

Zone/server. Wajib kalau hasZoneId: true.

Request
curl -X GET "https://arbakti.id/api/game/genshin-impact-gp?id=800000001&zone=os_asia" \
  -H "x-apikey: ARB-xxx"
Response
{
  "code": 200,
  "status": true,
  "message": "ID Found",
  "data": {
    "username": "Traveler",
    "user_id": "800000001",
    "zone": "os_asia"
  }
}

Akses: tmail

Tmail

Email sementara untuk menerima kode verifikasi atau uji coba. Wajib API key dengan akses tmail, IP harus di-whitelist, dan rate limit mengikuti akun. Alurnya: create → simpan token → cek messages sampai email masuk. Semua endpoint inbox butuh header x-tmail-token berisi token itu.

GET /api/v1/tmail/domains

Daftar domain

Domain yang bisa dipakai saat membuat email.

x-apikey
Request
curl -X GET "https://arbakti.id/api/v1/tmail/domains" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    "uberip.com"
  ]
}
POST /api/v1/tmail/create

Buat email

Membuat alamat email baru dan langsung login. Semua field opsional; yang kosong diisi acak.

x-apikey
  • Simpan token untuk membaca inbox, dan password untuk mengambil token baru lewat /tmail/login.

Parameter

username string

Bagian sebelum @. 3–32 karakter: huruf, angka, ., _, -.

domain string

Salah satu dari /tmail/domains. Default domain pertama.

password string

6–64 karakter.

Request
curl -X POST "https://arbakti.id/api/v1/tmail/create" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"username":"tokosaya","domain":"uberip.com"}'
Response
{
  "status": true,
  "msg": "Mailbox created",
  "data": {
    "id": "6710f2c4a1b2c3d4e5f60718",
    "address": "[email protected]",
    "password": "3f9a1c7e2b8d4a60",
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
  }
}
POST /api/v1/tmail/login

Ambil token

Token baru untuk email yang sudah ada, dari alamat dan password saat create.

x-apikey

Parameter

address string wajib

Alamat email.

password string wajib

Password dari /tmail/create.

Request
curl -X POST "https://arbakti.id/api/v1/tmail/login" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"address":"[email protected]","password":"3f9a1c7e2b8d4a60"}'
Response
{
  "status": true,
  "data": {
    "id": "6710f2c4a1b2c3d4e5f60718",
    "address": "[email protected]",
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
  }
}
GET /api/v1/tmail/messages

Kotak masuk

Daftar email masuk, terbaru di atas. 30 email per halaman.

x-apikey
  • Cek berkala (mis. tiap 5–10 detik) sampai email yang ditunggu muncul.
  • price adalah biaya per pesan masuk. Kalau lebih dari 0, tiap pesan dipotong sekali dari saldo saat pertama kali muncul. Pesan yang belum terbayar karena saldo kurang datang dengan locked: true serta subject dan intro kosong.

Parameter

x-tmail-token header wajib

token dari /tmail/create atau /tmail/login.

page number

Halaman, mulai 1.

Request
curl -X GET "https://arbakti.id/api/v1/tmail/messages?page=1" \
  -H "x-apikey: ARB-xxx" \
  -H "x-tmail-token: eyJ0eXAi..."
Response
{
  "status": true,
  "data": {
    "address": "[email protected]",
    "price": 0,
    "messages": [
      {
        "id": "6710f3a9c4d5e6f708192a3b",
        "from": {
          "address": "[email protected]",
          "name": "Example"
        },
        "to": [
          {
            "address": "[email protected]",
            "name": ""
          }
        ],
        "subject": "Kode verifikasi Anda",
        "intro": "Kode verifikasi Anda 482913. Berlaku 10 menit.",
        "seen": false,
        "hasAttachments": false,
        "size": 2048,
        "createdAt": "2026-09-29T08:15:00+00:00",
        "locked": false
      }
    ]
  }
}
GET /api/v1/tmail/messages/:id

Baca email

Isi lengkap satu email. Email otomatis ditandai sudah dibaca.

x-apikey
  • html berupa array potongan HTML; gabungkan dulu sebelum ditampilkan, dan tampilkan di iframe sandbox.

Parameter

id path wajib

id dari /tmail/messages.

x-tmail-token header wajib

Token email.

Request
curl -X GET "https://arbakti.id/api/v1/tmail/messages/6710f3a9c4d5e6f708192a3b" \
  -H "x-apikey: ARB-xxx" \
  -H "x-tmail-token: eyJ0eXAi..."
Response
{
  "status": true,
  "data": {
    "id": "6710f3a9c4d5e6f708192a3b",
    "from": {
      "address": "[email protected]",
      "name": "Example"
    },
    "to": [
      {
        "address": "[email protected]",
        "name": ""
      }
    ],
    "subject": "Kode verifikasi Anda",
    "seen": true,
    "text": "Kode verifikasi Anda 482913. Berlaku 10 menit.",
    "html": [
      "<p>Kode verifikasi Anda <b>482913</b>. Berlaku 10 menit.</p>"
    ],
    "attachments": [],
    "createdAt": "2026-09-29T08:15:00+00:00"
  }
}
DELETE /api/v1/tmail/messages/:id

Hapus email

Menghapus satu email dari inbox.

x-apikey

Parameter

id path wajib

id dari /tmail/messages.

x-tmail-token header wajib

Token email.

Request
curl -X DELETE "https://arbakti.id/api/v1/tmail/messages/6710f3a9c4d5e6f708192a3b" \
  -H "x-apikey: ARB-xxx" \
  -H "x-tmail-token: eyJ0eXAi..."
Response
{
  "status": true,
  "msg": "Message deleted"
}
DELETE /api/v1/tmail/account

Hapus alamat

Menghapus alamat email beserta seluruh isinya. Token langsung tidak berlaku.

x-apikey

Parameter

x-tmail-token header wajib

Token email.

Request
curl -X DELETE "https://arbakti.id/api/v1/tmail/account" \
  -H "x-apikey: ARB-xxx" \
  -H "x-tmail-token: eyJ0eXAi..."
Response
{
  "status": true,
  "msg": "Mailbox deleted"
}

Akses: cdn

CDN

Upload gambar atau video ke CDN dan dapatkan link publiknya. Wajib API key dengan akses cdn, IP harus di-whitelist, dan rate limit mengikuti akun. Biaya upload dipotong dari saldo; besarnya bisa dilihat di halaman CDN.

POST /api/v1/cdn/media

Upload file

Mengunggah satu file sebagai multipart/form-data. Gambar PNG, JPG, WEBP, GIF, atau AVIF maksimal 2 MB; video MP4, MOV, atau WEBM maksimal 100 MB.

x-apikey
  • price adalah biaya yang dipotong untuk upload ini. Kalau saldo kurang, file tidak diunggah.

Parameter

file file wajib

File yang diunggah.

Request
curl -X POST "https://arbakti.id/api/v1/cdn/media" \
  -H "x-apikey: ARB-xxx" \
  -F "[email protected]"
Response
{
  "status": true,
  "data": {
    "public_id": "arbakti/members/66f1c2a3b4c5d6e7f8091a2b/xk3l9qpz1",
    "type": "image",
    "name": "banner.png",
    "url": "https://res.cloudinary.com/demo/image/upload/v1729150000/arbakti/members/66f1c2a3b4c5d6e7f8091a2b/xk3l9qpz1.png",
    "format": "png",
    "bytes": 482113,
    "width": 1200,
    "height": 630,
    "price": 500,
    "created_at": "2026-10-17T08:00:00.000Z"
  }
}
GET /api/v1/cdn/media

Daftar file

File milik Anda, terbaru dulu.

x-apikey

Parameter

q string

Cari berdasarkan nama file.

type string

image atau video.

page number

Default 1.

limit number

Default 25, maksimal 100.

Request
curl -X GET "https://arbakti.id/api/v1/cdn/media?page=1&limit=25" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": [
    {
      "public_id": "arbakti/members/66f1c2a3b4c5d6e7f8091a2b/xk3l9qpz1",
      "type": "image",
      "name": "banner.png",
      "url": "https://res.cloudinary.com/demo/image/upload/v1729150000/arbakti/members/66f1c2a3b4c5d6e7f8091a2b/xk3l9qpz1.png",
      "format": "png",
      "bytes": 482113,
      "width": 1200,
      "height": 630,
      "price": 500,
      "created_at": "2026-10-17T08:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "pages": 1
  }
}
DELETE /api/v1/cdn/media

Hapus file

Menghapus file permanen. Link-nya langsung tidak bisa dibuka lagi. Biaya upload tidak dikembalikan.

x-apikey

Parameter

public_id string wajib

public_id dari upload atau daftar file.

Request
curl -X DELETE "https://arbakti.id/api/v1/cdn/media" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"public_id":"arbakti/members/66f1c2a3b4c5d6e7f8091a2b/xk3l9qpz1"}'
Response
{
  "status": true,
  "msg": "File dihapus"
}

Akses: am

Aktivasi AM Premium

Aktivasi premium 1 tahun untuk akun aplikasi pembeli dalam dua langkah: kirim magic link ke email pembeli, lalu verifikasi link yang dia tempel balik. Wajib API key dengan akses am, IP harus di-whitelist, dan rate limit mengikuti akun. Biaya per aktivasi dipotong dari saldo; besarnya bisa dilihat di halaman Aktivasi AM Premium.

POST /api/v1/am/verify

Verifikasi & aktivasi

Memverifikasi magic link lalu mengaktifkan premium 1 tahun.

x-apikey
  • Saldo hanya dipotong kalau status = ACTIVE. Kalau login berhasil tapi aktivasi gagal (INACTIVE), saldo tidak dipotong. Simpan refreshToken untuk mencoba lagi lewat /am/refresh.
  • Verifikasi ulang untuk orderId yang sama tidak dipotong dua kali.

Parameter

email string wajib

Email yang sama dengan /am/send-link.

magic_link string wajib

Link lengkap dari email pembeli.

Request
curl -X POST "https://arbakti.id/api/v1/am/verify" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","magic_link":"https://…"}'
Response
{
  "status": true,
  "msg": "Verifikasi berhasil, premium aktif 1 tahun.",
  "data": {
    "uid": "Xk3l9QpZ1aBcD",
    "email": "[email protected]",
    "isNewUser": false,
    "status": "ACTIVE",
    "planName": "PLAN_NAME",
    "subscriptionType": "SUBSCRIPTION",
    "orderId": "GPA.1234-5678-9012-34567",
    "activatedAt": "2026-10-19T08:00:00.000Z",
    "validUntil": "19 Oktober 2027",
    "validUntilTimestamp": 1824278400000,
    "idToken": "eyJhbGciOi…",
    "refreshToken": "AMf-vBx…",
    "premiumError": null
  }
}
POST /api/v1/am/refresh

Aktivasi ulang

Mencoba aktivasi lagi memakai refreshToken dari /am/verify, tanpa magic link baru.

x-apikey
  • Saldo hanya dipotong kalau premiumActive = true. Setiap refresh yang berhasil dihitung sebagai satu aktivasi.

Parameter

refresh_token string wajib

refreshToken dari /am/verify atau refresh sebelumnya.

Request
curl -X POST "https://arbakti.id/api/v1/am/refresh" \
  -H "x-apikey: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"refresh_token":"AMf-vBx…"}'
Response
{
  "status": true,
  "msg": "diaktifkan ulang.",
  "data": {
    "idToken": "eyJhbGciOi…",
    "refreshToken": "AMf-vBx…",
    "premiumActive": true,
    "premiumError": null
  }
}

Akses: macro

Payment Gateway Custom

Terima QRIS, e-wallet, dan transfer bank langsung ke rekening Anda. Pembayaran terdeteksi dari notifikasi aplikasi di HP Anda. Semua request mengirim apikey di body. Format response: { success, message, data }.

POST /payment/list

Daftar metode

Metode pembayaran aktif milik Anda, dikelompokkan per kategori. maxAmount: 0 berarti tanpa batas atas.

apikey di body

Parameter

apikey string wajib

API key dengan akses Payment Gateway Custom.

Request
curl -X POST "https://arbakti.id/payment/list" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx"}'
Response
{
  "success": true,
  "message": "Berhasil menampilkan list ID Payment.",
  "data": {
    "QRIS": [
      {
        "id": "qrisgopay",
        "name": "QRIS GoPay",
        "minAmount": 1000,
        "maxAmount": 0,
        "fee": 0.7,
        "feeType": "Persen",
        "qrisName": "TOKO ANDA",
        "qrisUrl": "https://...",
        "qrisString": "000201010211..."
      }
    ],
    "Ewallet": [
      {
        "id": "dana",
        "name": "DANA",
        "minAmount": 10000,
        "maxAmount": 0,
        "fee": 0,
        "feeType": "Fixed",
        "accountNumber": "081234567890",
        "accountName": "Nama Anda"
      }
    ],
    "Bank": [
      {
        "id": "bca",
        "name": "BCA",
        "minAmount": 10000,
        "maxAmount": 0,
        "fee": 0,
        "feeType": "Fixed",
        "accountNumber": "1234567890",
        "accountName": "Nama Anda"
      }
    ]
  }
}
POST /payment/qris

Buat tagihan QRIS

QRIS dinamis dengan nominal unik.

apikey di body
  • Nominal akhir = amount + biaya + angka unik 1–499. Tagihan berlaku 15 menit.
  • Tampilkan paymentUrl ke pembeli, atau tampilkan sendiri data pembayarannya. Tunggu webhook payment.success.
  • Kalau admin memasang biaya layanan per transaksi, biaya itu dipotong dari saldo akun Arbakti saat transaksi sukses. Transaksi baru ditolak (402) selama saldo kurang dari biaya tersebut.

Parameter

apikey string wajib

API key dengan akses Payment Gateway Custom.

action string wajib

Isi create.

amount number wajib

Nominal dasar sebelum biaya.

paymentMethod string wajib

id metode dari /payment/list.

description string

Keterangan transaksi.

callbackUrl string

URL HTTPS penerima webhook tagihan ini. Kosong berarti memakai callback URL akun.

Request
curl -X POST "https://arbakti.id/payment/qris" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx","action":"create","amount":50000,"paymentMethod":"qrisgopay","description":"Order #1001","callbackUrl":"https://tokoanda.com/webhook/arbakti"}'
Response
{
  "success": true,
  "message": "QRIS berhasil dibuat",
  "data": {
    "transactionId": "TRX-1790517600123-9f3a1c2b",
    "paymentUrl": "https://.../payment/U2FsdGVkX1...",
    "amount": 50351,
    "paymentMethod": "qrisgopay",
    "qr_base64": "iVBORw0KGgo...",
    "qr_url": "https://.../qris.png",
    "expiredAt": "2026-09-27T14:15:00.000Z"
  }
}
POST /payment/ewallet

Buat tagihan e-wallet

Instruksi transfer ke akun e-wallet Anda dengan nominal unik.

apikey di body
  • Nominal akhir = amount + biaya + angka unik 1–499. Tagihan berlaku 15 menit.
  • Tampilkan paymentUrl ke pembeli, atau tampilkan sendiri data pembayarannya. Tunggu webhook payment.success.
  • Kalau admin memasang biaya layanan per transaksi, biaya itu dipotong dari saldo akun Arbakti saat transaksi sukses. Transaksi baru ditolak (402) selama saldo kurang dari biaya tersebut.

Parameter

apikey string wajib

API key dengan akses Payment Gateway Custom.

action string wajib

Isi create.

amount number wajib

Nominal dasar sebelum biaya.

paymentMethod string wajib

id metode dari /payment/list.

description string

Keterangan transaksi.

callbackUrl string

URL HTTPS penerima webhook tagihan ini. Kosong berarti memakai callback URL akun.

Request
curl -X POST "https://arbakti.id/payment/ewallet" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx","action":"create","amount":50000,"paymentMethod":"dana","description":"Order #1001","callbackUrl":"https://tokoanda.com/webhook/arbakti"}'
Response
{
  "success": true,
  "message": "Instruksi pembayaran berhasil dibuat",
  "data": {
    "transactionId": "TRX-1790517600123-9f3a1c2b",
    "paymentUrl": "https://.../payment/U2FsdGVkX1...",
    "amount": 50351,
    "paymentMethod": "dana",
    "accountNumber": "081234567890",
    "ownerName": "Nama Anda",
    "expiredAt": "2026-09-27T14:15:00.000Z"
  }
}
POST /payment/bank

Buat tagihan transfer bank

Instruksi transfer ke rekening Anda dengan nominal unik.

apikey di body
  • Nominal akhir = amount + biaya + angka unik 1–499. Tagihan berlaku 15 menit.
  • Tampilkan paymentUrl ke pembeli, atau tampilkan sendiri data pembayarannya. Tunggu webhook payment.success.
  • Kalau admin memasang biaya layanan per transaksi, biaya itu dipotong dari saldo akun Arbakti saat transaksi sukses. Transaksi baru ditolak (402) selama saldo kurang dari biaya tersebut.

Parameter

apikey string wajib

API key dengan akses Payment Gateway Custom.

action string wajib

Isi create.

amount number wajib

Nominal dasar sebelum biaya.

paymentMethod string wajib

id metode dari /payment/list.

description string

Keterangan transaksi.

callbackUrl string

URL HTTPS penerima webhook tagihan ini. Kosong berarti memakai callback URL akun.

Request
curl -X POST "https://arbakti.id/payment/bank" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx","action":"create","amount":50000,"paymentMethod":"bca","description":"Order #1001","callbackUrl":"https://tokoanda.com/webhook/arbakti"}'
Response
{
  "success": true,
  "message": "Instruksi pembayaran berhasil dibuat",
  "data": {
    "transactionId": "TRX-1790517600123-9f3a1c2b",
    "paymentUrl": "https://.../payment/U2FsdGVkX1...",
    "amount": 50351,
    "paymentMethod": "bca",
    "accountNumber": "1234567890",
    "ownerName": "Nama Anda",
    "expiredAt": "2026-09-27T14:15:00.000Z"
  }
}
GET /payment/qris/status/:transactionId

Cek status tagihan

Tanpa apikey. Berlaku untuk semua kategori, bukan hanya QRIS.

Publik
  • Status: pending menunggu bayar, sukses dibayar, gagal kedaluwarsa atau ditolak, dibatalkan dibatalkan merchant. Hanya sukses yang final.

Parameter

transactionId path wajib

transactionId dari buat tagihan.

Request
curl -X GET "https://arbakti.id/payment/qris/status/TRX-1790517600123-9f3a1c2b"
Response
{
  "success": true,
  "message": "detail Traksaksi ditemukan",
  "data": {
    "transactionId": "TRX-1790517600123-9f3a1c2b",
    "status": "sukses",
    "amount": 50351,
    "method": "qrisgopay"
  }
}

Webhook pembayaran

Saat tagihan berubah final, kami kirim POST JSON ke callbackUrl tagihan itu, atau ke callback URL akun kalau kosong. Header, signature HMAC, dan jadwal retry sama dengan webhook lain.

EventKapan dikirim
payment.successPembayaran terdeteksi, atau ditandai sukses dari dashboard.
payment.failedTagihan kedaluwarsa (15 menit), atau ditandai gagal/dibatalkan. Kalau transfer terlambat masuk, tagihan masih bisa jadi sukses dan payment.success menyusul.

sign = md5(transactionId + status + apikey), dengan apikey yang dipakai saat membuat tagihan. Tetap cocokkan amount dengan pesanan Anda sebelum mengirim barang.

Body
{
  "event": "payment.success",
  "transactionId": "TRX-1790517600123-9f3a1c2b",
  "status": "sukses",
  "amount": 50351,
  "baseAmount": 50000,
  "feeAmount": 350,
  "paymentMethod": "qrisgopay",
  "description": "Order #1001",
  "paidAt": "2026-09-27T14:03:12.000Z",
  "createdAt": "2026-09-27T14:00:00.000Z",
  "sign": "1f3870be274f6c49b3e31a0c6728957f"
}

Akses: gopay

PG GoPay Merchant

QRIS dinamis dari GoPay Merchant Anda sendiri, uang pembeli langsung masuk ke GoPay Anda. Hubungkan akun dan isi QRIS statis dulu di halaman PG GoPay Merchant. Semua request mengirim apikey di body. Format response: { success, data } atau { success: false, message }.

Risiko ditanggung sendiri. Layanan ini membaca riwayat transaksi langsung dari akun GoBiz Anda dan bukan integrasi resmi dari GoPay. Akun bisa dibatasi, diblokir, atau berhenti terbaca kalau GoPay mengubah sistemnya. Kerugian yang timbul, termasuk pembayaran yang tidak terdeteksi, menjadi tanggung jawab Anda.

POST /payment/gopay/create

Buat QRIS

QRIS dinamis dengan nominal yang sudah terisi. Tampilkan qr_string sebagai gambar QR ke pembeli.

apikey di body
  • Nominal akhir sama dengan amount. Kalau di GoPay Merchant Anda sudah ada QRIS aktif dengan nominal yang sama, nominalnya dinaikkan Rp1 sampai tidak bentrok (10000 → 10001). Pembeli wajib membayar tepat sebesar amount di response. QRIS berlaku 15 menit.
  • Kalau admin memasang biaya per QRIS, biaya itu dipotong dari saldo akun Arbakti setiap QRIS dibuat, dibayar atau tidak. QRIS baru ditolak (402) selama saldo kurang dari biaya tersebut.
  • Pembayaran dicek ke GoPay setiap beberapa detik. Tunggu webhook gopay.success atau gopay.expired di callback URL akun, atau cek lewat endpoint status.

Parameter

apikey string wajib

API key dengan akses PG GoPay Merchant.

amount number wajib

Nominal dasar, bilangan bulat 1–10.000.000.

description string

Keterangan transaksi, maksimal 200 karakter.

callbackUrl string

URL HTTPS penerima webhook QRIS ini. Kosong berarti memakai callback URL akun.

Request
curl -X POST "https://arbakti.id/payment/gopay/create" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx","amount":50000,"description":"Order #1001","callbackUrl":"https://tokoanda.com/webhook/arbakti"}'
Response
{
  "success": true,
  "data": {
    "transactionId": "GPY-1790517600123-9f3a1c2b",
    "status": "pending",
    "amount": 50000,
    "baseAmount": 50000,
    "fee": 300,
    "description": "Order #1001",
    "qr_string": "00020101021226...6304ABCD",
    "expiredAt": "2026-09-27T14:15:00.000Z",
    "paidAt": null,
    "createdAt": "2026-09-27T14:00:00.000Z"
  }
}
POST /payment/gopay/status

Cek status QRIS

Status QRIS milik Anda.

apikey di body
  • Status: pending menunggu bayar, paid dibayar, expired lewat 15 menit. Hanya paid yang final: pembayaran yang terlambat tercatat di GoPay masih bisa mengubah expired menjadi paid.

Parameter

apikey string wajib

API key dengan akses PG GoPay Merchant.

transactionId string wajib

transactionId dari buat QRIS.

Request
curl -X POST "https://arbakti.id/payment/gopay/status" \
  -H "Content-Type: application/json" \
  -d '{"apikey":"ARB-xxx","transactionId":"GPY-1790517600123-9f3a1c2b"}'
Response
{
  "success": true,
  "data": {
    "transactionId": "GPY-1790517600123-9f3a1c2b",
    "status": "paid",
    "amount": 50000,
    "baseAmount": 50000,
    "fee": 300,
    "description": "Order #1001",
    "qr_string": "00020101021226...6304ABCD",
    "expiredAt": "2026-09-27T14:15:00.000Z",
    "paidAt": "2026-09-27T14:03:12.000Z",
    "createdAt": "2026-09-27T14:00:00.000Z"
  }
}

Webhook pembayaran

Dikirim ke callback URL akun Anda (Akun → Webhook), atau ke callbackUrl QRIS itu kalau diisi. Header, signature HMAC, dan jadwal retry sama dengan webhook lain.

EventKapan dikirim
gopay.successPembayaran QRIS terdeteksi di GoPay Merchant Anda. Kalau GoPay terlambat mencatat pembayaran, event ini bisa datang setelah gopay.expired.
gopay.expiredQRIS tidak dibayar dalam 15 menit.

sign = md5(transactionId + status + apikey), dengan apikey yang dipakai saat membuat QRIS. Tetap cocokkan amount dengan pesanan Anda sebelum mengirim barang.

Body
{
  "event": "gopay.success",
  "transactionId": "GPY-1790517600123-9f3a1c2b",
  "status": "paid",
  "amount": 50000,
  "baseAmount": 50000,
  "fee": 300,
  "description": "Order #1001",
  "expiredAt": "2026-09-27T14:15:00.000Z",
  "paidAt": "2026-09-27T14:03:12.000Z",
  "createdAt": "2026-09-27T14:00:00.000Z",
  "sign": "1f3870be274f6c49b3e31a0c6728957f"
}

Akses: bridge

Payment Gateway Otomatis

QRIS, virtual account, e-wallet, dan gerai retail. Dana masuk ke saldo Payment Gateway Otomatis Anda dan bisa ditarik ke rekening. Daftar dulu di halaman Payment Gateway Otomatis dan tunggu persetujuan admin. Kirim API key di header x-api-key. Error berformat { error: { code, message }, request_id }.

GET /v1/payment-channels

Daftar channel

Channel yang tersedia. Buat tagihan hanya di channel dengan active: true.

x-api-key
Request
curl -X GET "https://arbakti.id/v1/payment-channels" \
  -H "x-api-key: ARB-xxx"
Response
{
  "data": [
    {
      "channel": "QRIS",
      "channel_code": null,
      "active": true
    },
    {
      "channel": "VIRTUAL_ACCOUNT",
      "channel_code": "BCA",
      "active": true
    },
    {
      "channel": "EWALLET",
      "channel_code": "DANA",
      "active": false
    }
  ],
  "request_id": "..."
}
POST /v1/payments

Buat tagihan

Tagihan untuk customer Anda. Tampilkan isi action ke customer: nomor VA, qr_string QRIS, kode bayar gerai, atau redirect_url e-wallet.

x-api-key
  • reference_id yang sama mengembalikan tagihan yang sudah ada (HTTP 200), bukan tagihan baru (HTTP 201).
  • VIRTUAL_ACCOUNT: BCA, BNI, BRI, MANDIRI, PERMATA, BSI, CIMB, BJB, BSS, MUAMALAT, BNC, INA. EWALLET: OVO, DANA, SHOPEEPAY, LINKAJA, ASTRAPAY. RETAIL_OUTLET: ALFAMART, INDOMARET.
  • OVO tidak punya URL: customer menyetujui dari aplikasinya, dan customer.phone wajib.

Parameter

reference_id string wajib

ID tagihan Anda, unik per akun.

amount integer wajib

Nominal dalam rupiah.

channel string wajib

QRIS, VIRTUAL_ACCOUNT, EWALLET, RETAIL_OUTLET.

channel_code string

Kode bank/e-wallet/gerai. Kosongkan untuk QRIS.

customer.name string wajib

Nama customer.

customer.email string

Email customer.

customer.phone string

Nomor HP, wajib untuk OVO.

description string

Keterangan tagihan.

expires_in_hours integer

Masa berlaku 1–720 jam.

Request
curl -X POST "https://arbakti.id/v1/payments" \
  -H "x-api-key: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"reference_id":"INV-1001","amount":150000,"channel":"VIRTUAL_ACCOUNT","channel_code":"BCA","customer":{"name":"Budi Santoso","phone":"081234567890"}}'
Response
{
  "id": "01a0e3a1-7c2e-7000-9a1b-5f0c2d3e4f50",
  "reference_id": "INV-1001",
  "status": "PENDING",
  "amount_gross": 150000,
  "fee": 3750,
  "amount_net": 146250,
  "channel": "VIRTUAL_ACCOUNT",
  "channel_code": "BCA",
  "action": {
    "type": "VIRTUAL_ACCOUNT",
    "bank_code": "BCA",
    "account_number": "1234567890123"
  },
  "expires_at": "2026-09-28T10:00:00.000Z",
  "paid_at": null,
  "settled_at": null,
  "created_at": "2026-09-27T10:00:00.000Z",
  "request_id": "01a0e3a1-7c2f-7000-8b2c-6a1d3e4f5061"
}
GET /v1/payments/:id

Cek tagihan

:id boleh id dari kami atau reference_id Anda.

x-api-key
  • Status: PENDING, SUCCEEDED, EXPIRED, FAILED. settled_at terisi saat dana sudah cair ke saldo yang bisa ditarik.

Parameter

id path wajib

id atau reference_id.

Request
curl -X GET "https://arbakti.id/v1/payments/INV-1001" \
  -H "x-api-key: ARB-xxx"
Response
{
  "id": "01a0e3a1-7c2e-7000-9a1b-5f0c2d3e4f50",
  "reference_id": "INV-1001",
  "status": "PENDING",
  "amount_gross": 150000,
  "fee": 3750,
  "amount_net": 146250,
  "channel": "VIRTUAL_ACCOUNT",
  "channel_code": "BCA",
  "action": {
    "type": "VIRTUAL_ACCOUNT",
    "bank_code": "BCA",
    "account_number": "1234567890123"
  },
  "expires_at": "2026-09-28T10:00:00.000Z",
  "paid_at": null,
  "settled_at": null,
  "created_at": "2026-09-27T10:00:00.000Z",
  "request_id": "01a0e3a1-7c2f-7000-8b2c-6a1d3e4f5061"
}
GET /v1/payments

Daftar tagihan

Terbaru dulu. Untuk halaman berikutnya, kirim next_after_id sebagai after_id; null berarti halaman terakhir.

x-api-key

Parameter

status string

Filter status.

channel string

Filter channel.

after_id string

Lanjut setelah id ini.

limit integer

1–100, default 20.

Request
curl -X GET "https://arbakti.id/v1/payments?status=SUCCEEDED&limit=50" \
  -H "x-api-key: ARB-xxx"
Response
{
  "data": [
    {
      "id": "01a0e3a1-7c2e-7000-9a1b-5f0c2d3e4f50",
      "reference_id": "INV-1001",
      "status": "SUCCEEDED",
      "amount_gross": 150000,
      "fee": 3750,
      "amount_net": 146250,
      "channel": "VIRTUAL_ACCOUNT",
      "channel_code": "BCA",
      "action": {
        "type": "VIRTUAL_ACCOUNT",
        "bank_code": "BCA",
        "account_number": "1234567890123"
      },
      "expires_at": "2026-09-28T10:00:00.000Z",
      "paid_at": null,
      "settled_at": null,
      "created_at": "2026-09-27T10:00:00.000Z"
    }
  ],
  "next_after_id": "01a0e3a1-7c2e-7000-9a1b-5f0c2d3e4f50",
  "request_id": "..."
}
GET /v1/balance

Saldo

Saldo Payment Gateway Otomatis, terpisah dari saldo akun dan saldo Payment Gateway Custom.

x-api-key
  • pending tagihan belum dibayar, on_hold sudah dibayar dan menunggu cair, available bisa ditarik.
Request
curl -X GET "https://arbakti.id/v1/balance" \
  -H "x-api-key: ARB-xxx"
Response
{
  "pending": 150000,
  "on_hold": 292500,
  "available": 1250000,
  "request_id": "..."
}
POST /v1/withdrawals

Tarik saldo

Menarik saldo available ke rekening yang sudah disetujui. Rekening diatur dari dashboard Payment Gateway Otomatis.

x-api-key
  • reference_id yang sama mengembalikan withdraw yang sudah ada.
  • Status: REQUESTED (menunggu persetujuan), APPROVED, QUEUED, SENT, SUCCEEDED, FAILED, REVERSED, REJECTED.

Parameter

amount integer wajib

Nominal, termasuk biaya withdraw.

reference_id string

ID withdraw dari sistem Anda.

Request
curl -X POST "https://arbakti.id/v1/withdrawals" \
  -H "x-api-key: ARB-xxx" \
  -H "Content-Type: application/json" \
  -d '{"amount":500000,"reference_id":"WD-2001"}'
Response
{
  "id": "01a0e3a2-1d4f-7000-a3c4-7b2e4f506172",
  "reference_id": "WD-2001",
  "status": "REQUESTED",
  "amount": 500000,
  "fee": 5000,
  "net": 495000,
  "bank_code": "BCA",
  "bank_account": "****6789",
  "bank_holder": "BUDI SANTOSO",
  "failure": null,
  "created_at": "2026-09-27T11:00:00.000Z",
  "request_id": "01a0e3a2-1d50-7000-9c4d-8c3f50617283"
}
GET /v1/withdrawals/:id

Cek withdraw

Satu withdraw. Daftar lengkap: GET /v1/withdrawals?limit=&after_id=.

x-api-key

Parameter

id path wajib

id withdraw.

Request
curl -X GET "https://arbakti.id/v1/withdrawals/01a0e3a2-1d4f-7000-a3c4-7b2e4f506172" \
  -H "x-api-key: ARB-xxx"
Response
{
  "id": "01a0e3a2-1d4f-7000-a3c4-7b2e4f506172",
  "reference_id": "WD-2001",
  "status": "REQUESTED",
  "amount": 500000,
  "fee": 5000,
  "net": 495000,
  "bank_code": "BCA",
  "bank_account": "****6789",
  "bank_holder": "BUDI SANTOSO",
  "failure": null,
  "created_at": "2026-09-27T11:00:00.000Z",
  "request_id": "01a0e3a2-1d50-7000-9c4d-8c3f50617283"
}

Webhook

Dikirim ke callback URL akun Anda. Header, signature HMAC, dan jadwal retry sama dengan webhook lain. Body berbentuk { event, data }.

EventKapan dikirim
payment.succeededTagihan dibayar customer.
payment.expiredTagihan tidak dibayar sampai kedaluwarsa.
payment.settledDana tagihan cair dan masuk saldo available.
withdrawal.succeededWithdraw sampai di rekening.
withdrawal.failedWithdraw ditolak atau gagal; saldo sudah dikembalikan.
Body
{
  "event": "payment.succeeded",
  "data": {
    "id": "01a0e3a1-7c2e-7000-9a1b-5f0c2d3e4f50",
    "reference_id": "INV-1001",
    "amount_gross": 150000,
    "fee": 3750,
    "amount_net": 146250,
    "channel": "VIRTUAL_ACCOUNT"
  }
}

Akses: rest

REST API

Kumpulan endpoint utilitas: AI, downloader, stalker, canvas, tools, dan lainnya. Pakai API key dengan akses rest. Kuota dihitung per hari (reset 00:00 WIB) dan besarnya mengikuti level akun. Endpoint bertanda Premium hanya untuk level tertentu.

GET /api/v3/stats

Kuota & statistik

Sisa kuota hari ini dan pemakaian API key Anda per hari dan per endpoint. Tidak memotong kuota.

x-apikey

Parameter

days integer

Rentang statistik, 1–90. Default 7.

Request
curl -X GET "https://arbakti.id/api/v3/stats?days=7" \
  -H "x-apikey: ARB-xxx"
Response
{
  "status": true,
  "data": {
    "role": "gold",
    "today": {
      "used": 42,
      "limit": 500,
      "remaining": 458
    },
    "total": 310,
    "failed": 4,
    "daily": [
      {
        "day": "2026-09-29",
        "count": 42,
        "failed": 1
      }
    ],
    "endpoints": [
      {
        "endpoint": "/api/v3/stalker/ml",
        "count": 120,
        "failed": 2
      }
    ]
  }
}

Notifikasi

Webhook / Callback

Kami mengirim POST JSON ke callback URL akun Anda (wajib HTTPS) setiap kali pesanan mencapai status penting. Atur URL dan signing secret di Akun → Webhook, atau lewat PATCH /api/v1/profile/callback-url. Hanya pesanan lewat API dan akun yang dikirimi webhook.

IP pengirim

Semua webhook dikirim dari IP publik server kami di bawah. Kalau endpoint Anda memakai firewall, whitelist IP ini supaya webhook tidak tertolak.

Tetap verifikasi signature. IP bisa berubah kalau server dipindah, dan halaman ini selalu menampilkan IP terbaru.

IP server
Memuat…

Daftar event

Nama event ada di header X-Arbakti-Event. Untuk OTP, sosmed, dan deposit, nama event juga ada di field event pada body.

EventLayananKapan dikirim
order.successTop upTransaksi sukses (ada sn).
order.failedTop upTransaksi gagal; saldo sudah dikembalikan.
otp.receivedOTPKode masuk. Bisa terkirim lagi dengan kode baru setelah resend.
otp.completedOTPOrder ditandai selesai (done).
otp.canceledOTPOrder batal atau kedaluwarsa. refunded: true kalau saldo dikembalikan.
sosmed.successSosmedPesanan terkirim penuh.
sosmed.partialSosmedHanya sebagian terkirim; lihat remains.
sosmed.failedSosmedPesanan gagal di provider.
deposit.successDepositDeposit dibayar dan saldo sudah bertambah.
deposit.expiredDepositDeposit tidak dibayar sampai kedaluwarsa.
payment.successPG CustomTagihan PG Custom dibayar.
payment.failedPG CustomTagihan PG Custom kedaluwarsa, gagal, atau dibatalkan.
gopay.successPG GoPayQRIS PG GoPay dibayar. Bisa menyusul setelah gopay.expired kalau pembayaran terlambat tercatat di GoPay.
gopay.expiredPG GoPayQRIS PG GoPay tidak dibayar dalam 15 menit.
payment.succeededPG OtomatisTagihan PG Otomatis dibayar.
payment.expiredPG OtomatisTagihan PG Otomatis kedaluwarsa.
payment.settledPG OtomatisDana cair ke saldo yang bisa ditarik.
withdrawal.succeededPG OtomatisWithdraw sampai di rekening.
withdrawal.failedPG OtomatisWithdraw gagal; saldo dikembalikan.

Contoh payload

Body OTP dan sosmed sama dengan data pada endpoint cek order, ditambah event dan sign. Pada deposit, ref_id adalah refId yang Anda terima saat membuat deposit. Body top up memakai format lama tanpa field event.

X-Arbakti-Timestamp dan X-Arbakti-Signature hanya dikirim kalau akun Anda punya signing secret.

Header
POST /webhook/arbakti HTTP/1.1
Content-Type: application/json
X-Arbakti-Event: otp.received
X-Arbakti-Timestamp: 1790517600
X-Arbakti-Signature: sha256=3f1c9a...e27b
Body
{
  "ref_id": "ORDER-101",
  "sku": "FF70",
  "target": "12345678",
  "status": "Sukses",
  "sn": "1234567890",
  "msg": "Transaksi Sukses",
  "price": 9350,
  "updated_at": "2026-09-27T14:00:00.000Z",
  "sign": "a9e62f5c0d8b3e71f4a2c6d9b8e0f1a3"
}

Verifikasi signature

Dengan signing secret, setiap request membawa X-Arbakti-Timestamp dan X-Arbakti-Signature:

X-Arbakti-Signature = "sha256=" + HMAC_SHA256(secret, timestamp + "." + raw_body)

Hitung dari raw body, bukan dari hasil JSON.parse yang di-stringify ulang. Bandingkan dengan constant-time compare, dan tolak timestamp yang lebih tua dari 5 menit.

Tanpa secret, cocokkan field sign di body: md5(ref_id + status + apikey).

Verifikasi
import crypto from "crypto";
import express from "express";

const app = express();

// Raw body wajib: signature dihitung dari byte persis yang kami kirim.
app.post("/webhook/arbakti", express.raw({ type: "application/json" }), (req, res) => {
  const ts = req.get("X-Arbakti-Timestamp");
  const sig = req.get("X-Arbakti-Signature") || "";
  const expected = "sha256=" + crypto
    .createHmac("sha256", process.env.ARBAKTI_WEBHOOK_SECRET)
    .update(`${ts}.${req.body}`)
    .digest("hex");

  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  const valid = sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
  if (!fresh || !valid) return res.sendStatus(401);

  const event = req.get("X-Arbakti-Event");
  const data = JSON.parse(req.body);
  // Simpan ref_id + event untuk menolak kiriman ganda, lalu proses.
  res.sendStatus(200);
});

Retry & balasan

  • Balas dengan status 2xx dalam 10 detik. Isi balasan tidak dibaca.
  • Selain 2xx, timeout, atau koneksi gagal dianggap gagal dan dikirim ulang setelah 30 detik, 2 menit, 10 menit, 1 jam, dan 6 jam. Setelah itu berhenti.
  • Satu event bisa sampai lebih dari sekali. Pakai ref_id + event (dan otp_code untuk otp.received) untuk menolak duplikat.
  • Urutan kiriman tidak dijamin saat ada retry. Jadikan status di body sebagai acuan, atau cek ulang lewat endpoint cek order.