Skip to content

Dokumentasi API Publik ​

Versi: 1.1.0 Terakhir Diperbarui: 2025-12-24

Lingkungan ​

LingkunganBase URLDeskripsi
Produksihttps://gateway.facaiqq.com/v1Transaksi nyata, pembayaran langsung
Sandboxhttps://gateway.facaiqq.com/v1Transaksi uji coba (hanya untuk tipe merchant sandbox)

Gambaran Umum ​

API Publik memungkinkan merchant untuk mengintegrasikan kemampuan pemrosesan pembayaran ke dalam aplikasi mereka. Semua permintaan API memerlukan autentikasi HMAC-SHA256.

Produksi vs Sandbox ​

Tipe merchant menentukan rute transaksi:

  • Merchant Produksi: Transaksi uang nyata diproses melalui penyedia pembayaran.
  • Merchant Sandbox: Transaksi simulasi untuk pengujian. Respons disimulasikan secara lokal tanpa pemrosesan eksternal.

Autentikasi ​

Semua permintaan API harus menyertakan header berikut:

HeaderWajibDeskripsi
X-API-KeyYaAPI key merchant Anda (64 karakter)
X-SignatureYaTanda tangan HMAC-SHA256 dari permintaan
X-TimestampYaUnix timestamp (detik sejak epoch)
Content-TypeYaapplication/json

Pembuatan Tanda Tangan ​

Tanda tangan dihitung menggunakan HMAC-SHA256 dengan Secret Key Anda:

Signature = HMAC-SHA256(SignatureData, SecretKey)
SignatureData = METHOD|PATH|TIMESTAMP|BODY

Contoh (permintaan POST):

SignatureData = "POST|/v1/payments/deposit|1702400000|{\"amount\":100.00,\"currency\":\"THB\",\"reference_id\":\"ORDER-001\"}"

Contoh (permintaan GET):

SignatureData = "GET|/v1/payments/pay_abc123|1702400000"

Contoh Kode ​

python
import hmac
import hashlib
import time
import json
import requests

api_key = "your_api_key"
secret_key = "your_secret_key"
base_url = "https://gateway.facaiqq.com"

def create_signature(method, path, timestamp, body=""):
    # PENTING: path harus berupa path HTTP lengkap (contoh: /v1/payments/deposit)
    data = f"{method}|{path}|{timestamp}"
    if body:
        data += f"|{body}"
    return hmac.new(
        secret_key.encode(),
        data.encode(),
        hashlib.sha256
    ).hexdigest()

def make_request(method, path, body=None):
    timestamp = str(int(time.time()))
    body_str = json.dumps(body) if body else ""
    signature = create_signature(method, path, timestamp, body_str)

    headers = {
        "X-API-Key": api_key,
        "X-Signature": signature,
        "X-Timestamp": timestamp,
        "Content-Type": "application/json"
    }

    url = base_url + path
    if method == "POST":
        return requests.post(url, headers=headers, json=body)
    else:
        return requests.get(url, headers=headers)

# Buat deposit - catatan: gunakan path lengkap termasuk /v1
response = make_request("POST", "/v1/payments/deposit", {
    "amount": 1000.00,
    "currency": "THB",
    "reference_id": "ORD888888888",
    "bank_code": "004",
    "bank_account_no": "1234567890",
    "bank_account_name": "test test",
    "webhook_url": "https://example.com/path/to/your/webhook"
})
print(response.json())
javascript
const crypto = require("crypto");
const axios = require("axios");

const apiKey = "your_api_key";
const secretKey = "your_secret_key";
const baseUrl = "https://gateway.facaiqq.com";

function createSignature(method, path, timestamp, body = "") {
  // PENTING: path harus berupa path HTTP lengkap (contoh: /v1/payments/deposit)
  let data = `${method}|${path}|${timestamp}`;
  if (body) {
    data += `|${body}`;
  }
  return crypto.createHmac("sha256", secretKey).update(data).digest("hex");
}

async function makeRequest(method, path, body = null) {
  const timestamp = Math.floor(Date.now() / 1000).toString();
  const bodyStr = body ? JSON.stringify(body) : "";
  const signature = createSignature(method, path, timestamp, bodyStr);

  const headers = {
    "X-API-Key": apiKey,
    "X-Signature": signature,
    "X-Timestamp": timestamp,
    "Content-Type": "application/json",
  };

  const url = baseUrl + path;
  if (method === "POST") {
    return axios.post(url, body, { headers });
  } else {
    return axios.get(url, { headers });
  }
}

// Buat deposit - catatan: gunakan path lengkap termasuk /v1
makeRequest("POST", "/v1/payments/deposit", {
  amount: 1000.0,
  currency: "THB",
  reference_id: "ORD888888888",
  bank_code: "004",
  bank_account_no: "1234567890",
  bank_account_name: "test test",
  webhook_url: "https://example.com/path/to/your/webhook",
}).then((res) => console.log(res.data));
php
<?php
$apiKey = 'your_api_key';
$secretKey = 'your_secret_key';
$baseUrl = 'https://gateway.facaiqq.com';

function createSignature($method, $path, $timestamp, $body = '') {
    global $secretKey;
    // PENTING: path harus berupa path HTTP lengkap (contoh: /v1/payments/deposit)
    $data = "$method|$path|$timestamp";
    if ($body) {
        $data .= "|$body";
    }
    return hash_hmac('sha256', $data, $secretKey);
}

function makeRequest($method, $path, $body = null) {
    global $apiKey, $baseUrl;

    $timestamp = time();
    $bodyStr = $body ? json_encode($body) : '';
    $signature = createSignature($method, $path, $timestamp, $bodyStr);

    $headers = [
        'X-API-Key: ' . $apiKey,
        'X-Signature: ' . $signature,
        'X-Timestamp: ' . $timestamp,
        'Content-Type: application/json'
    ];

    $ch = curl_init($baseUrl . $path);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyStr);
    }

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// Buat deposit - catatan: gunakan path lengkap termasuk /v1
$response = makeRequest('POST', '/v1/payments/deposit', [
    'amount' => 1000.00,
    'currency' => 'THB',
    'reference_id' => 'ORD888888888',
    'bank_code' => '004',
    'bank_account_no' => '1234567890',
    'bank_account_name' => 'test test',
    'webhook_url' => 'https://example.com/path/to/your/webhook'
]);
print_r($response);
go
package main

import (
    "bytes"
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "strconv"
    "time"
)

const (
    apiKey    = "your_api_key"
    secretKey = "your_secret_key"
    baseURL   = "https://gateway.facaiqq.com"
)

func createSignature(method, path, timestamp, body string) string {
    // PENTING: path harus berupa path HTTP lengkap (contoh: /v1/payments/deposit)
    data := fmt.Sprintf("%s|%s|%s", method, path, timestamp)
    if body != "" {
        data += "|" + body
    }
    h := hmac.New(sha256.New, []byte(secretKey))
    h.Write([]byte(data))
    return hex.EncodeToString(h.Sum(nil))
}

func makeRequest(method, path string, body interface{}) (map[string]interface{}, error) {
    timestamp := strconv.FormatInt(time.Now().Unix(), 10)

    var bodyStr string
    var reqBody io.Reader
    if body != nil {
        bodyBytes, _ := json.Marshal(body)
        bodyStr = string(bodyBytes)
        reqBody = bytes.NewBuffer(bodyBytes)
    }

    signature := createSignature(method, path, timestamp, bodyStr)

    req, _ := http.NewRequest(method, baseURL+path, reqBody)
    req.Header.Set("X-API-Key", apiKey)
    req.Header.Set("X-Signature", signature)
    req.Header.Set("X-Timestamp", timestamp)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    return result, nil
}

func main() {
    // Buat deposit - catatan: gunakan path lengkap termasuk /v1
    result, _ := makeRequest("POST", "/v1/payments/deposit", map[string]interface{}{
        "amount":            1000.00,
        "currency":          "THB",
        "reference_id":      "ORD888888888",
        "bank_code":         "004",
        "bank_account_no":   "1234567890",
        "bank_account_name": "test test",
        "webhook_url":       "https://example.com/path/to/your/webhook",
    })
    fmt.Printf("%+v\n", result)
}

Endpoint ​

Buat Deposit ​

Buat permintaan pembayaran deposit baru. Mengembalikan kode QR PromptPay untuk pelanggan membayar.

POST /v1/payments/deposit

Body Permintaan ​

FieldTipeWajibDeskripsi
amountnumberYaJumlah pembayaran (> 0)
currencystringYaKode mata uang (3 karakter, contoh: "THB")
reference_idstringYaReferensi pesanan unik Anda (1-64 karakter)
customer_emailstringTidakEmail pelanggan untuk notifikasi
customer_phonestringTidakNomor telepon pelanggan (maks 20 karakter)
descriptionstringTidakDeskripsi pembayaran (maks 255 karakter)
webhook_urlstringTidakURL Webhook untuk notifikasi pembayaran
bank_codestringTidakKode bank pembayar (3 digit) untuk referensi
bank_account_nostringTidakNomor rekening bank pembayar (maks 20 karakter)
bank_account_namestringTidakNama pemegang rekening bank pembayar (maks 100 karakter)

Contoh Permintaan ​

json
{
  "amount": 1000.00,
  "currency": "THB",
  "reference_id": "ORD888888888",
  "bank_code": "004",
  "bank_account_no": "1234567890",
  "bank_account_name": "test test",
  "webhook_url": "https://example.com/path/to/your/webhook"
}

Respons ​

Format respons bergantung pada apakah amount mencapai ambang batas yang ditentukan admin (contoh di bawah menggunakan 5000 hanya sebagai ilustrasi — nilai sebenarnya dikonfigurasi oleh admin).

Ketika amount di bawah ambang batas (misalnya < 5000) — Bayar via QR PromptPay

company_account = false dan kode QR PromptPay tetap dikembalikan seperti biasa.

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888888",
  "type": "deposit",
  "status": "pending",
  "amount": 1000.00,
  "currency": "THB",
  "company_account": false,
  "qr_code": "00020101021129370016A000000677010111011300668123456785802TH5303764...",
  "qr_code_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
  "created_at": "2025-12-24T10:30:00Z",
  "expires_at": "2025-12-24T10:45:00Z"
}

Ketika amount mencapai ambang batas (misalnya >= 5000) — Transfer ke rekening perusahaan

company_account = true dengan detail rekening perusahaan (company_account_bank_code, company_account_bank_name, company_account_name, company_account_no). Field qr_code / qr_code_image tidak dikembalikan dalam respons ini.

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888888",
  "type": "deposit",
  "status": "pending",
  "amount": 5000.00,
  "currency": "THB",
  "company_account": true,
  "company_account_bank_code": "004",
  "company_account_bank_name": "Kasikornbank",
  "company_account_name": "PT Contoh",
  "company_account_no": "1234567890",
  "created_at": "2025-12-24T10:30:00Z",
  "expires_at": "2025-12-24T10:45:00Z"
}

Field Respons ​

FieldTipeDeskripsi
idstringID transaksi unik (format UUID)
reference_idstringReferensi pesanan Anda
typestringTipe transaksi (deposit)
statusstringStatus pembayaran
amountnumberJumlah pembayaran
currencystringKode mata uang
company_accountbooleanFlag rekening perusahaan — true ketika amount mencapai ambang batas admin (transfer ke rekening perusahaan), false ketika di bawah ambang (bayar via QR). 5000 hanya contoh.
company_account_bank_codestringKode bank rekening perusahaan (3 digit) (hanya muncul ketika company_account = true)
company_account_bank_namestringNama bank rekening perusahaan (hanya muncul ketika company_account = true)
company_account_namestringNama pemilik rekening perusahaan (hanya muncul ketika company_account = true)
company_account_nostringNomor rekening perusahaan (hanya muncul ketika company_account = true)
qr_codestringString kode QR PromptPay (hanya dikembalikan ketika company_account = false)
qr_code_imagestringGambar kode QR terenkode Base64, PNG (hanya dikembalikan ketika company_account = false)
created_atstringTimestamp pembuatan (ISO 8601)
expires_atstringTimestamp kedaluwarsa (ISO 8601, default 15 menit)

Buat Penarikan ​

Buat permintaan penarikan/pembayaran baru ke rekening bank.

POST /v1/payments/withdraw

Body Permintaan ​

FieldTipeWajibDeskripsi
amountnumberYaJumlah penarikan (> 0)
currencystringYaKode mata uang (3 karakter)
reference_idstringYaReferensi unik Anda (1-64 karakter)
bank_codestringYaKode bank (3 digit, lihat tabel di bawah)
account_numberstringYaNomor rekening bank (10-20 digit)
account_holder_namestringYaNama pemegang rekening (1-100 karakter)
descriptionstringTidakDeskripsi transfer (maks 255 karakter)
webhook_urlstringTidakURL Webhook untuk notifikasi transfer

Kode Bank ​

KodeNama ThaiNama Inggris
002ธนาคารกรุงเทพBangkok Bank PCL (BBL)
004ธนาคารกสิกรไทยKasikornbank PCL (Kbank)
006ธนาคารกรุงไทยKrungthai Bank PCL (KTB)
011ธนาคารทหารไทยธนชาตTMBThanachart Bank PCL (TTB)
014ธนาคารไทยพาณิชย์Siam Commercial Bank PCL (SCB)
017ธนาคารซิตี้แบงก์Citibank N.A.
020ธนาคารสแตนดาร์ดชาร์เตอร์ด (ไทย)Standard Chartered Bank (Thai) PCL
022ธนาคารซีไอเอ็มบี ไทยCIMB Thai Bank PCL
024ธนาคารยูโอบีUnited Overseas Bank (Thai) PCL
025ธนาคารกรุงศรีอยุธยาBank of Ayudhya PCL (Krungsri)
026ธนาคารเมกะสากลพาณิชย์Mega International Commercial Bank
030ธนาคารออมสินGovernment Savings Bank (GSB)
031ธนาคารฮ่องกงและเซี่ยงไฮ้HSBC Thailand
033ธนาคารอาคารสงเคราะห์Government Housing Bank (GHB)
034ธนาคารเพื่อการเกษตรฯBAAC
065ธนาคารธนชาตThanachart Bank PCL
066ธนาคารอิสลามแห่งประเทศไทยIslamic Bank of Thailand
067ธนาคารทิสโก้TISCO Bank PCL
069ธนาคารเกียรตินาคินภัทรKiatnakin Phatra Bank PCL (KKP)
070ธนาคารไอซีบีซี (ไทย)ICBC (Thai) PCL
071ธนาคารไทยเครดิตThai Credit Retail Bank
073ธนาคารแลนด์ แอนด์ เฮ้าส์Land and Houses Bank PCL (LH Bank)
088ธนาคารคลิกซ์Clicx Bank
PROMPTPAYพร้อมเพย์PromptPay
TRUEทรูมันนี่TrueMoney

Penarikan PromptPay ​

Ketika menggunakan bank_code: "PROMPTPAY", field account_number harus berisi:

Panjang Nomor RekeningTipe ProxyDeskripsi
10 digitMOBILENomor telepon seluler
13 digitTXIDNomor KTP atau Nomor Pajak

Contoh Permintaan (PromptPay dengan Nomor Telepon):

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888890",
  "bank_code": "PROMPTPAY",
  "account_number": "0812345678",
  "account_holder_name": "John Doe"
}

Contoh Permintaan (PromptPay dengan Nomor KTP):

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888891",
  "bank_code": "PROMPTPAY",
  "account_number": "1234567890123",
  "account_holder_name": "John Doe"
}

Contoh Permintaan ​

json
{
  "amount": 5000.00,
  "currency": "THB",
  "reference_id": "ORD888888889",
  "bank_code": "014",
  "account_number": "1234567890",
  "account_holder_name": "John Doe",
  "webhook_url": "https://example.com/path/to/your/webhook"
}

Respons ​

json
{
  "id": "660e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORD888888889",
  "type": "withdraw",
  "status": "processing",
  "amount": 5000.00,
  "currency": "THB",
  "created_at": "2025-12-24T11:00:00Z"
}

Dapatkan Pembayaran ​

Ambil detail pembayaran berdasarkan ID pembayaran.

GET /v1/payments/{id}

Parameter Path ​

ParameterTipeDeskripsi
idstringID Pembayaran (format UUID)

Contoh Respons ​

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORDER-2024-001",
  "type": "deposit",
  "status": "completed",
  "amount": 1500.00,
  "currency": "THB",
  "qr_code": "00020101021129370016A000000677010111...",
  "created_at": "2024-12-12T10:30:00Z",
  "expires_at": "2024-12-12T10:45:00Z"
}

Batalkan Pembayaran ​

Batalkan pembayaran yang tertunda. Hanya pembayaran dengan status pending yang dapat dibatalkan.

POST /v1/payments/{id}/cancel

Parameter Path ​

ParameterTipeDeskripsi
idstringID Pembayaran yang dibatalkan

Contoh Respons ​

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "reference_id": "ORDER-2024-001",
  "type": "deposit",
  "status": "cancelled",
  "amount": 1500.00,
  "currency": "THB",
  "created_at": "2024-12-12T10:30:00Z"
}

Status Pembayaran ​

StatusDeskripsi
pendingPembayaran dibuat, menunggu tindakan pelanggan
processingPembayaran sedang diproses
completedPembayaran berhasil diselesaikan
failedPembayaran gagal (termasuk transaksi kedaluwarsa)
cancelledPembayaran dibatalkan
refundedPembayaran dikembalikan

Catatan

Ketika pembayaran kedaluwarsa (pelanggan tidak membayar dalam batas waktu), status berubah menjadi failed dengan alasan kegagalan "Transaction expired". Webhook akan dikirim untuk memberitahu sistem Anda.


Webhook ​

Ketika Anda menyediakan webhook_url, kami akan mengirim permintaan POST dengan pembaruan pembayaran.

Payload Webhook ​

Payload webhook dikirim langsung (tidak dibungkus dalam struktur event):

json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "type": "deposit",
  "amount": 1500.00,
  "fee": 37.50,
  "netAmount": 1462.50,
  "bankAccountNo": "1234567890",
  "bankAccountName": "SOMCHAI JAIDEE",
  "bankCode": "014",
  "bankName": "ธนาคารไทยพาณิชย์",
  "currency": "THB",
  "referenceNo": "ORDER-2024-001",
  "status": "success",
  "timestamp": "2024-12-12T10:35:00Z",
  "paidAt": "2024-12-12T10:34:55.123456789Z"
}

Field Payload Webhook ​

FieldTipeDeskripsi
idstringID Transaksi
typestringTipe transaksi: deposit atau withdraw
amountnumberJumlah pembayaran asli
feenumberBiaya pemrosesan yang dikenakan
netAmountnumberJumlah setelah pemotongan biaya
bankAccountNostringNomor rekening bank (untuk deposit dengan info pembayar)
bankAccountNamestringNama pemegang rekening bank
bankCodestringKode bank
bankNamestringNama bank dalam bahasa Thai
currencystringKode mata uang
referenceNostringID referensi Anda
statusstringsuccess, failed, atau expired
timestampstringTimestamp pengiriman webhook (ISO 8601)
paidAtstringWaktu penyelesaian pembayaran (kosong jika belum bayar)

Nilai Status Webhook ​

StatusDeskripsi
successPembayaran berhasil diselesaikan
failedPembayaran gagal atau kedaluwarsa
expiredPembayaran kedaluwarsa (legacy, sekarang menggunakan failed)

Kebijakan Percobaan Ulang Webhook ​

  • Webhook dicoba ulang hingga 5 kali jika pengiriman gagal
  • Interval percobaan ulang: 1 menit antar percobaan
  • Pengiriman berhasil adalah respons HTTP 2xx
  • Setelah 5 percobaan gagal, webhook ditandai sebagai gagal

Verifikasi Webhook ​

Permintaan webhook menyertakan header untuk verifikasi:

HeaderDeskripsi
X-Webhook-SignatureTanda tangan HMAC-SHA256 dari body permintaan
X-Webhook-TimestampUnix timestamp dari webhook
Content-Typeapplication/json

Verifikasi webhook menggunakan metode HMAC yang sama dengan permintaan API:

python
import hmac
import hashlib

def verify_webhook(body, signature, timestamp, secret_key):
    expected = hmac.new(
        secret_key.encode(),
        f"{timestamp}|{body}".encode(),
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

Respons Error ​

Semua error mengikuti format ini:

json
{
  "code": "ERROR_CODE",
  "message": "Pesan error yang dapat dibaca manusia"
}

Kode Status HTTP ​

StatusDeskripsi
200Berhasil
201Berhasil dibuat
400Permintaan buruk - parameter tidak valid
401Tidak terotorisasi - API key atau tanda tangan tidak valid
403Dilarang - merchant tidak aktif atau izin tidak mencukupi
404Tidak ditemukan
409Konflik - reference_id duplikat
500Error server internal
504Gateway timeout

Kode Error ​

KodeDeskripsi
INVALID_REQUESTValidasi body permintaan gagal
MISSING_API_KEYHeader X-API-Key tidak ada
MISSING_SIGNATUREHeader X-Signature tidak ada
MISSING_TIMESTAMPHeader X-Timestamp tidak ada
INVALID_API_KEYAPI key tidak valid
INVALID_SIGNATUREVerifikasi tanda tangan gagal
INVALID_TIMESTAMPFormat timestamp tidak valid
TIMESTAMP_EXPIREDTimestamp permintaan di luar jendela valid
MERCHANT_INACTIVEAkun merchant tidak aktif
PAYMENT_NOT_FOUNDPembayaran tidak ditemukan
PAYMENT_ERRORError pemrosesan pembayaran umum
DUPLICATE_REFERENCEReference ID sudah ada
INSUFFICIENT_BALANCESaldo tidak mencukupi untuk penarikan
INVALID_BANK_CODEKode bank tidak valid
INVALID_ACCOUNTRekening bank tidak valid (sandbox)
PAYMENT_CANNOT_BE_CANCELLEDPembayaran tidak dapat dibatalkan
TIMEOUTPermintaan timeout

Pengujian Sandbox ​

Cara Kerja Sandbox ​

Mode sandbox ditentukan oleh tipe merchant Anda, bukan URL terpisah. Baik merchant sandbox maupun produksi menggunakan endpoint API yang sama:

Base URL: https://gateway.facaiqq.com/v1

  • Merchant Sandbox: Transaksi disimpan dalam database sandbox. Tidak ada uang nyata yang diproses.
  • Merchant Produksi: Transaksi disimpan dalam database produksi dan diproses melalui penyedia pembayaran.

Hubungi dukungan untuk meminta kredensial sandbox untuk pengujian.

Jumlah Uji Coba ​

Dalam mode sandbox, jumlah tertentu memicu perilaku berbeda:

JumlahMata UangPerilakuDeskripsi
100.00THBauto_approvePembayaran selesai segera
200.00THBauto_pendingPembayaran tetap pending (simulasi tertunda)
500.00THBauto_approvePembayaran selesai segera
888.88THBtimeoutPembayaran timeout
999.99THBauto_failPembayaran gagal segera
1000.00THBauto_approvePembayaran selesai segera
LainnyaTHBpendingAlur pembayaran normal

Skenario Uji Coba ​

Anda dapat mengganti perilaku menggunakan header X-Sandbox-Scenario:

SkenarioDeskripsi
auto_approvePaksa pembayaran selesai segera
auto_failPaksa pembayaran gagal
auto_pendingPaksa pembayaran tetap pending
timeoutSimulasikan timeout
invalid_accountSimulasikan rekening bank tidak valid (hanya withdraw)

Contoh:

bash
curl -X POST https://gateway.facaiqq.com/v1/payments/deposit \
  -H "X-Sandbox-Scenario: auto_approve" \
  -H "X-API-Key: your_sandbox_api_key" \
  -H "X-Signature: ..." \
  -H "X-Timestamp: ..." \
  -H "Content-Type: application/json" \
  -d '{"amount": 500.00, "currency": "THB", "reference_id": "TEST-001"}'

Header Respons ​

Respons menyertakan header yang menunjukkan lingkungan:

HeaderNilaiDeskripsi
X-Environmentsandbox atau productionMenunjukkan tipe merchant

Kedaluwarsa Transaksi ​

  • Transaksi deposit memiliki kedaluwarsa default 15 menit
  • Jika pelanggan tidak membayar dalam waktu tersebut:
    • Status berubah menjadi failed (bukan expired)
    • failure_reason diatur ke "Transaction expired"
    • Webhook dikirim dengan status: "failed"
  • Pemeriksaan kedaluwarsa berjalan setiap 1 menit

Batas Rate ​

EndpointBatas Rate
Semua endpoint100 permintaan/menit
Buat Deposit30 permintaan/menit
Buat Penarikan20 permintaan/menit

Header batas rate disertakan dalam respons:

HeaderDeskripsi
X-RateLimit-LimitPermintaan maksimum per jendela
X-RateLimit-RemainingPermintaan tersisa dalam jendela
X-RateLimit-ResetUnix timestamp ketika batas direset

Dukungan ​

Untuk dukungan teknis:

FacaiQQ Payment Gateway