D
API Reference

Transfer Balance API

Endpoint transfer balance dazo-whitelist-api — POST /api/transfer-balance (store), GET /api/transfer-balance (index/history), GET /api/transfer-balance/{id} (show), POST /api/transfer-balance/{id}/process. Pindah saldo spend cap antar-akun via TransferBalanceService (atomic).

Endpoints transfer saldo spend cap antar akun iklan. Dipindahkan secara atomik oleh TransferBalanceService (cek saldo riil → withdraw sumber → topup tujuan). Semua endpoint middleware: auth:api, myapi.

POST /api/transfer-balance — Eksekusi transfer baru

POSThttp://127.0.0.1:8081/api/transfer-balance
curl --request POST \
  --url http://127.0.0.1:8081/api/transfer-balance

Buat & eksekusi transfer saldo (TransferBalanceController::store).

Request body

FieldWajibTipeKeterangan
order_id✅UUID/UUIDReference ke order di web app
source_account_ids✅arrayList akun sumber (ads_account_id)
amounts✅arrayNominal per sumber (urutan sama)
destination_ads_account_id✅stringAkun tujuan

Contoh request

json
{
  "order_id": "550e8400-e29b-41d4-a716-446655440000",
  "source_account_ids": ["act_A", "act_B"],
  "amounts": [50000, 50000],
  "destination_ads_account_id": "act_TUJUAN"
}

Response sukses

json
{
  "status": true,
  "data": {
    "transfer_balance_id": "UUID",
    "status": "pending"
  }
}

Error

StatusKondisi
400Validasi body gagal
409Saldo sumber tidak cukup
404Akun tidak ditemukan

GET /api/transfer-balance — Riwayat transfer

GEThttp://127.0.0.1:8081/api/transfer-balance
curl --request GET \
  --url http://127.0.0.1:8081/api/transfer-balance

List riwayat transaksi transfer balance (TransferBalanceController::index).

Response

json
{
  "status": true,
  "data": [
    {
      "id": "UUID",
      "destination_ads_account_id": "act_TUJUAN",
      "total_transferred": 100000,
      "status": "completed",
      "created_at": "2026-08-21T10:00:00+07:00"
    }
  ]
}

GET /api/transfer-balance/{id} — Detail transfer

GEThttp://127.0.0.1:8081/api/transfer-balance/:id
curl --request GET \
  --url http://127.0.0.1:8081/api/transfer-balance/:id

Detail satu transaksi transfer + item sumber (TransferBalanceController::show).

ParamWajibTipe
id✅UUID/UUID

Response

json
{
  "status": true,
  "data": {
    "id": "UUID",
    "status": "processing",
    "destination_ads_account_id": "act_TUJUAN",
    "details": [
      { "source_ads_account_id": "act_A", "amount": 50000, "status": "completed" },
      { "source_ads_account_id": "act_B", "amount": 50000, "status": "pending" }
    ]
  }
}

POST /api/transfer-balance/{id}/process — Proses transfer

POSThttp://127.0.0.1:8081/api/transfer-balance/:id/process
curl --request POST \
  --url http://127.0.0.1:8081/api/transfer-balance/:id/process

Proses (eksekusi) transfer yang tersimpan. Berguna bila transfer dibuat sebagai draft lalu dieksekusi terpisah, atau retry untuk transfer failed.

FieldWajibTipe
id✅UUID/UUID

Aksi

  1. TransferBalanceService — validasi saldo riil sumber via Meta
  2. Withdraw dari tiap sumber
  3. Topup ke tujuan
  4. Update status → completed / failed

Response sukses

json
{
  "status": true,
  "data": {
    "status": "completed",
    "total_transferred": 100000
  }
}

Status lifecycle transfer

text
[pending] ──process──► [processing] ──sukses──► [completed]
                              │
                              └──gagal──► [failed]
StatusArti
pendingDibuat, belum dieksekusi
processingSedang dieksekusi
completedSelesai (total_transferred terisi)
failedGagal (error_message terisi, rollback/perlu review)

Validasi saldo riil

Sebelum withdraw, TransferBalanceService memanggil GET /api/account/balance untuk akun sumber — memastikan saldo Meta sebenarnya mencukupi, bukan hanya saldo cache lokal.

Queue job

TransferBalanceJob (di API engine) menjalankan eksekusi secara async bila di-queue-kan. Pastikan queue worker aktif (php artisan local:start / queue:work).

Error umum

PesanKondisi
Insufficient balanceSaldo riil sumber < nominal
Destination account not foundAkun tujuan tidak dikenal
Graph returned an error: (#17) User request limit reachedMeta rate limit

Ringkasan endpoint

MethodEndpointFungsi
POST/api/transfer-balanceEksekusi transfer baru
GET/api/transfer-balanceRiwayat transfer
GET/api/transfer-balance/&#123;id&#125;Detail transfer
POST/api/transfer-balance/&#123;id&#125;/processProses transfer

Langkah berikutnya