Bangun denganCryptocardium.
Terbitkan kartu, danai akun, jalankan transaksi, dan pantau siklus hidupnya — dari cURL, dari SDK mana pun, atau dari agen AI Anda. Seluruh platform tersedia dalam satu REST API yang stabil dan satu server MCP native.
Selamat datang
Cryptocardium adalah program kartu tanpa KYC yang didanai dengan kripto. Setiap tindakan yang dapat Anda lakukan di panel — membuka akun, top-up, menerbitkan kartu, mengisi kartu, bertransaksi, memantau transaksi — tersedia melalui REST API dan server MCP yang sama.
Dokumentasi ini mencakup segalanya: konvensi (cara API berkomunikasi), sumber daya (apa yang bisa Anda minta), event (cara tetap tersinkronisasi), dan integrasi (Claude, ChatGPT, Cursor, agen apa pun).
Daftar di /account, buka Pengaturan API, klik "Key baru". Teks lengkap ditampilkan sekali — salin ke secret manager Anda.
Mulai cepat
Dari nol ke kartu virtual aktif dalam tiga panggilan. Shell di bawah menggunakan cURL; ganti dengan klien HTTP apa pun.
1. Autentikasi
Tempatkan API key Anda di header Authorization. Setiap endpoint memerlukannya.
export CCM_KEY="ccm_live_a1b2c3d4..."
2. Isi ulang treasury
Buat alamat deposit USDT. Kirim dana; kami kreditkan setelah konfirmasi.
curl https://api.cryptocardium.com/v1/topups \
-H "Authorization: Bearer $CCM_KEY" \
-H "Idempotency-Key: top_$(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "amount_usd": 500, "asset": "USDT", "chain": "tron" }'
3. Terbitkan kartu & mulai transaksi
Pilih BIN (Visa Platinum untuk dompet, Visa Business untuk iklan), isi saldonya, dan kartu Anda siap digunakan.
curl https://api.cryptocardium.com/v1/cards \
-H "Authorization: Bearer $CCM_KEY" \
-d '{
"type": "virtual",
"bin": "489517",
"load_usd": 300,
"wallet_provision": ["apple_pay", "google_pay"]
}'
# → 201 Created · card is live, balance loaded, wallet-ready
Empat puluh tujuh detik median dari pendaftaran hingga autentikasi pertama. Bagian-bagian berikutnya mencakup hal lainnya — penanganan kesalahan, idempotency, webhooks, pengaturan agen — yang Anda perlukan di lingkungan produksi.
Autentikasi
Tiga jenis kredensial, dipilih berdasarkan bentuk integrasi:
| Jenis | Format | Digunakan untuk |
|---|---|---|
| Bearer sesi | sess_… | Skrip interaktif, pengujian, panel itu sendiri. |
| API key | ccm_live_… | Server produksi, CI, pekerjaan terjadwal, penggunaan jangka panjang. |
| OAuth 2.1 + DCR | eyJh… (JWT) | Agen yang mendaftarkan diri saat runtime, pemberian izin terlingkup. |
Header Bearer
Ketiganya melewati header yang sama:
Authorization: Bearer ccm_live_a1b2c3d4...
Buat API key
Key hanya dibuat di panel. Kami tidak pernah menerima permintaan pembuatan key melalui API tanpa sesi terotentikasi yang terhubung ke sesi panel itu sendiri.
- Masuk ke akun Anda.
- Buka Pengaturan API.
- Klik Key baru, beri nama yang mudah dikenali, simpan teks lengkapnya (ditampilkan sekali).
- Simpan di secret manager. Tambahkan ke lingkungan Anda sebagai
CCM_KEY.
Key ccm_live_ yang bocor memiliki izin tingkat akun. Putar ulang melalui /api-settings jika Anda mencurigai kebocoran — pencabutan berlaku seketika.
Pengujian & sandbox
Saat ini, top-up di bawah $200 diterima secara langsung tetapi diarahkan ke prosesor kartu sandbox, sehingga Anda dapat melakukan integrasi tanpa menggunakan penyelesaian nyata. Akun produksi mendapatkan pengalih mode sandbox per key.
- Top-up $200+ → jalur produksi, penyelesaian nyata.
- Top-up <$200 → jalur sandbox, otorisasi simulasi.
- Kartu yang diterbitkan dari top-up sandbox memiliki
"mode": "sandbox".
URL dasar & versi
URL dasar produksi:
https://api.cryptocardium.com/v1
Awalan v1 adalah bagian dari path. v1 adalah LTS selamanya — tidak ada perubahan yang memutus kompatibilitas yang akan pernah dikirimkan di bawahnya. Perubahan tambahan (kolom opsional baru, endpoint baru) dikirimkan secara transparan.
Perubahan yang memutus kompatibilitas akan berada di bawah awalan baru (v2) dengan tumpang tindih setidaknya enam bulan. Penghentian diumumkan melalui webhook (system.deprecation) dan riwayat perubahan.
Permintaan
Semua permintaan hanya HTTPS (TLS 1.3). Body permintaan berformat JSON; objek bersarang adalah kelas pertama. Body berformat form-encoded tidak didukung.
- Content-Type:
application/jsonuntuk endpoint tulis. - <strong>Charset</strong>: UTF-8 selalu.
- Metode HTTP:
GET(baca),POST(buat / aksi),PATCH(pembaruan sebagian),DELETE(hapus). - Batas header: total 8 KB, 4 KB per nilai.
- Batas body: 25 MB (100 MB untuk unggahan bukti sengketa).
- Batas waktu: 30 detik koneksi, 60 detik baca. Operasi yang berjalan lama bersifat asinkron.
Respons
Setiap respons berformat JSON. Respons sukses mengembalikan 200/201/204 beserta body sumber daya. Kesalahan mengembalikan objek kesalahan terstruktur — lihat Kesalahan.
Amplop standar
{
"id": "card_8f3a91b7c4d2",
"object": "card",
"created_at": "2026-05-19T07:30:00Z",
"updated_at": "2026-05-19T07:30:00Z",
...
}
Stempel waktu
Semua stempel waktu adalah ISO 8601 dalam UTC, diformat sebagai YYYY-MM-DDTHH:MM:SSZ. Tidak ada zona waktu lain dalam API.
Nilai moneter
Semua jumlah adalah desimal setara USD dalam kolom amount_usd. Presisi dua desimal. Didukung secara internal oleh USDT.
Paginasi
Endpoint daftar (/topups, /cards, /transactions, …) menggunakan paginasi berbasis kursor. Tidak ada offset, tidak ada LIMIT SQL.
GET /v1/transactions?limit=50&cursor=tx_8f3a91b7c4d2
limit— ukuran halaman, default 25, maks 100.cursor— kirim kembalinext_cursordari respons sebelumnya.- Paginasi mengikuti urutan alami setiap sumber daya (biasanya <code>created_at</code> desc).
{
"object": "list",
"data": [ /* 50 items */ ],
"has_more": true,
"next_cursor": "tx_2bea88..."
}
Pemfilteran & pengurutan
Setiap endpoint daftar mendukung pemfilteran pada kolom utamanya melalui parameter kueri:
GET /v1/transactions
?card_id=card_8f3a91b7c4d2
&status=captured
&created_after=2026-05-01T00:00:00Z
&sort=-amount_usd
Parameter sort menerima satu kolom; awali dengan - untuk urutan menurun. Lihat referensi endpoint setiap sumber daya untuk kunci filter yang didukung.
Idempotency
Setiap permintaan tulis (POST, PATCH, DELETE) menerima header Idempotency-Key. Berikan nilai unik per operasi logis. Percobaan ulang dengan key yang sama mengembalikan respons asli.
POST /v1/cards
Idempotency-Key: card_create_b9f1a4...
Authorization: Bearer ccm_live_...
- Key disimpan selama 24 jam. Setelah itu, key yang sama dapat digunakan kembali untuk operasi baru.
- Format yang disarankan:
<operation>_<uuid-v4>. - Key sama + body berbeda →
409 Conflictdenganconflict_idempotency_key. - Permintaan
GETselalu idempoten dan tidak memerlukan (atau menerima) header tersebut.
Batas laju
Per API key:
| Jendela | Batas | Catatan |
|---|---|---|
| Burst 1 detik | 60 req | Lonjakan singkat ditoleransi. |
| 1 menit | 1 000 req | Batas berkelanjutan. |
| 1 hari | 50 000 req | Agregat per key. |
Setiap respons membawa:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 943
X-RateLimit-Reset: 1718999999
Saat melampaui batas, Anda akan mendapat 429 Too Many Requests beserta header Retry-After dalam detik. Patuhi hal ini; kami menerapkan exponential backoff pada pengguna yang berlebihan.
Kesalahan
Setiap respons kesalahan menggunakan bentuk yang sama:
{
"object": "error",
"type": "invalid_request_error",
"code": "missing_required_field",
"message": "Field 'bin' is required.",
"param": "bin",
"request_id": "req_a9f4b1..."
}
Pemetaan status HTTP
| Status | Jenis | Arti |
|---|---|---|
| 400 | invalid_request_error | Payload tidak valid, kolom yang diperlukan tidak ada. |
| 401 | authentication_error | Bearer tidak ada atau tidak valid. |
| 403 | permission_error | Bearer valid, tindakan tidak diizinkan (misalnya, gerbang saldo). |
| 404 | not_found_error | Sumber daya tidak ada (atau bukan milik Anda). |
| 409 | conflict_error | Konflik status (misalnya, idempotency key yang digunakan ulang). |
| 419 | session_expired | Sesi panel habis waktu. Autentikasi ulang. |
| 422 | validation_error | JSON payload valid, aturan bisnis gagal. |
| 429 | rate_limit_error | Perlambat. Retry-After dalam detik. |
| 500 | api_error | Kesalahan kami. Kami sudah mendapat peringatan. |
| 503 | service_unavailable | Penerbit upstream down. Percobaan ulang otomatis disarankan. |
Selalu catat request_id. Tiket dukungan merujuk langsung ke sana.
Akun
Akun adalah sumber daya root Anda. Semua yang lain (top-up, kartu, transaksi) dimiliki oleh sebuah akun.
Buat
POST /v1/accounts
{
"email": "[email protected]",
"password": "long-random-string"
}
Mengembalikan bearer sesi seketika. Tanpa KYC, tanpa unggahan dokumen, tanpa langkah verifikasi email yang diperlukan untuk mulai menggunakan API.
Ambil akun saat ini
GET /v1/accounts/me
{
"id": "acc_8f3a91b7c4d2",
"email": "[email protected]",
"balance_usd": 487.20,
"twofa_enabled": true,
"created_at": "2026-05-18T20:14:00Z"
}
Saldo & treasury
Saldo akun adalah kumpulan USDT yang dapat dibelanjakan. Top-up mengkreditnya, pemuatan kartu dan penarikan mendebitnya.
GET /v1/balance
{
"object": "balance",
"available_usd": 487.20,
"pending_usd": 200.00,
"updated_at": "2026-05-19T07:30:00Z"
}
pending_usd mencakup top-up dalam proses (belum dikonfirmasi) dan pemuatan kartu dalam proses.
Top-up
Top-up adalah langkah asimetris di mana Anda mengkomit kripto on-chain dan kami mengkreditkan USDT setelah finalitas.
Buat
POST /v1/topups
{
"amount_usd": 500,
"asset": "USDT",
"chain": "tron"
}
Mengembalikan alamat deposit, URI data QR, dan waktu kedaluwarsa (default 60 menit). Kirim jumlah yang tepat ke alamat; kami kreditkan setelah konfirmasi.
{
"id": "top_4e21a99c7b",
"status": "pending",
"amount_usd": 500,
"deposit_address": "T9zFR...kQp",
"qr_data_uri": "data:image/png;base64,...",
"expires_at": "2026-05-19T08:30:00Z"
}
Siklus hidup status
| Status | Arti |
|---|---|
| pending | Menunggu deposit on-chain. |
| completed | Dana dikreditkan ke saldo. |
| expired | Jendela alamat ditutup. Deposit terlambat tetap dikreditkan otomatis. |
| cancelled | Anda memanggil POST /v1/topups/:id/cancel. |
| error | Penyelesaian gagal (jarang terjadi). Dikembalikan otomatis. |
Lebih baik gunakan webhook topup.confirmed daripada polling — hanya terpicu sekali dan menghemat 30+ polling.
Kartu
Kartu hadir dalam dua jenis — virtual (aktif dalam hitungan detik) dan fisik (dikirim dalam 5–9 hari, terkunci pada BIN Visa Gold).
Terbitkan
POST /v1/cards
{
"type": "virtual",
"bin": "489517",
"load_usd": 300,
"wallet_provision": ["apple_pay", "google_pay"]
}
Katalog BIN
| BIN | Nama | Terbaik untuk | Jenis |
|---|---|---|---|
| 416842 | Visa Business | Belanja iklan (3-D Secure) | Virtual |
| 557213 | Mastercard World | Multi-mata uang, premium | Virtual |
| 489517 | Visa Platinum | Apple & Google Pay | Virtual |
| 472305 | Visa Corporate | Langganan SaaS | Virtual |
| 448585 | Visa Gold | Fisik saja (3-D Secure) | Fisik |
Tampilkan PAN lengkap + CVV
Nomor kartu lengkap, CVV, dan masa berlaku hanya dikembalikan melalui panggilan khusus yang diaudit:
GET /v1/cards/:id/pan
{
"pan": "4895 1712 ●●●● 4218",
"cvv": "347",
"expires_at": "2029-08",
"audit_id": "audit_8c2e3f..."
}
Setiap pengungkapan dicatat dalam jejak audit. Agen sebaiknya mengungkapkan sekali per pembelian, tidak menyimpan, dan menghapus dari memori setelah digunakan.
Operasi
POST /v1/cards/:id/freeze— hentikan otorisasi.POST /v1/cards/:id/unfreeze— lanjutkan.POST /v1/cards/:id/load— tambahkan USDT ke kartu.POST /v1/cards/:id/unload— kembalikan saldo yang belum dibelanjakan ke treasury.POST /v1/cards/:id/cancel— penutupan permanen.PATCH /v1/cards/:id/limits— batas transaksi / bulanan per kartu.PATCH /v1/cards/:id/mcc— daftar izin/blokir MCC.PATCH /v1/cards/:id/geo— daftar izin negara.
Isi kartu & saldo
Saldo kartu didenominasikan dalam USDT setara USD. Pengisian mengurangi dari treasury, menerapkan biaya jalur 2%, dan mengkreditkan kartu.
POST /v1/cards/:id/load
{ "amount_usd": 200 }
{
"card_id": "card_8f3a91b7c4d2",
"loaded_usd": 200.00,
"rail_fee_usd": 4.00,
"new_card_balance_usd": 200.00,
"new_treasury_balance_usd": 283.20
}
Pengisian bersifat atomik — panggilan hanya mengembalikan hasil setelah dana berpindah.
Transaksi
Setiap otorisasi, capture, pengembalian dana, dan penolakan adalah objek transaksi. Bersifat append-only dan tidak dapat diubah.
GET /v1/cards/:id/transactions?status=captured&limit=50
{
"object": "list",
"data": [
{
"id": "tx_b1c2d3",
"object": "transaction",
"card_id": "card_8f3a91b7c4d2",
"status": "captured",
"amount_usd": 42.95,
"merchant": { "name": "OpenAI", "mcc": "7372" },
"auth_response_code": "00",
"created_at": "2026-05-19T03:14:00Z"
}
],
"has_more": false
}
Filter pada status, card_id, mcc, merchant_name, created_after, created_before, amount_min, amount_max.
Penarikan
Kirim USDT treasury kembali ke dompet eksternal mana pun yang Anda kendalikan.
POST /v1/withdrawals
{
"amount_usd": 100,
"chain": "tron",
"address": "T9zFR...kQp"
}
Min $10, maks saldo penuh Anda. Chain yang didukung: tron (termurah), ethereum, bsc. Pengiriman lintas jaringan tidak dapat dipulihkan — selalu verifikasi alamatnya.
Sengketa
Ajukan chargeback untuk transaksi mana pun:
POST /v1/disputes
{
"transaction_id": "tx_b1c2d3",
"reason": "duplicate",
"description": "Merchant charged twice on 2026-05-19, same order #4921."
}
Kode alasan: duplicate, not_received, fraud, not_as_described, cancelled_subscription, other.
Lampirkan bukti (struk, tangkapan layar, korespondensi) melalui POST /v1/disputes/:id/evidence. Kami mengajukan ke penerbit atas nama Anda — tanpa biaya tambahan.
Webhooks · berlangganan
Webhooks mendorong event ke endpoint HTTPS Anda saat terjadi. Hindari polling; gunakan webhooks.
POST /v1/webhooks
{
"url": "https://yourapp.example.com/webhooks/cryptocardium",
"events": [
"topup.confirmed",
"card.issued",
"transaction.captured",
"transaction.declined"
],
"description": "Production sync"
}
Respons berisi signing_secret — simpan; Anda akan membutuhkannya untuk memverifikasi payload. Berlangganan ke "*" untuk menerima setiap event.
Webhooks · verifikasi tanda tangan
Setiap webhook membawa tanda tangan HMAC-SHA256 di header Cryptocardium-Signature:
Cryptocardium-Signature: t=1718999999,v1=4a8b2f0e6c9d...
Cryptocardium-Event-Id: evt_a1b2c3d4
Cryptocardium-Delivery: dlv_8f3a91...
Hitung tanda tangan yang diharapkan atas "{t}.{rawBody}" dengan signing_secret Anda. Bandingkan menggunakan fungsi constant-time.
Node.js
import crypto from 'crypto';
export function verify(rawBody, sigHeader, secret) {
const [t, v1] = sigHeader.split(',')
.map(s => s.split('=')[1]);
const expected = crypto
.createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(v1), Buffer.from(expected)
);
}
Python
import hmac, hashlib
def verify(raw_body: bytes, sig_header: str, secret: str) -> bool:
parts = dict(p.split('=') for p in sig_header.split(','))
t, v1 = parts['t'], parts['v1']
expected = hmac.new(
secret.encode(),
f"{t}.{raw_body.decode()}".encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(v1, expected)
PHP
function verify($rawBody, $sigHeader, $secret): bool {
$parts = [];
foreach (explode(',', $sigHeader) as $p) {
[$k, $v] = explode('=', $p, 2);
$parts[$k] = $v;
}
$expected = hash_hmac('sha256',
"{$parts['t']}.{$rawBody}", $secret);
return hash_equals($expected, $parts['v1']);
}
Webhooks · percobaan ulang & pemutaran ulang
Pengiriman at-least-once. Kami mencoba ulang pada setiap respons non-2xx atau timeout (10 detik).
| Percobaan | Penundaan |
|---|---|
| 1 | segera |
| 2 | 30 s |
| 3 | 5 min |
| 4 | 30 min |
| 5 | 2 h |
| 6 | 12 h |
| 7 | 24 jam (terakhir) |
Putar ulang event mana pun dari dasbor atau melalui POST /v1/webhooks/:id/replay/:event_id. Gunakan header Cryptocardium-Event-Id untuk deduplikasi di sisi Anda.
Katalog event
account.created
account.signed_in
account.signed_out
account.password_changed
account.totp_enabled
account.totp_disabled
topup.created
topup.confirmed
topup.expired
topup.cancelled
topup.error
card.issued
card.loaded
card.unloaded
card.frozen
card.unfrozen
card.cancelled
card.replaced
transaction.authorized
transaction.captured
transaction.refunded
transaction.declined
transaction.reversed
dispute.opened
dispute.responded
dispute.won
dispute.lost
withdrawal.created
withdrawal.broadcasted
withdrawal.confirmed
withdrawal.failed
system.maintenance
system.deprecation
Server MCP
Kami menghosting server Model Context Protocol di https://mcp.cryptocardium.com/v1. Server ini mengekspos 40+ alat yang memetakan 1:1 ke endpoint REST, dengan nama yang ramah agen (create_topup, issue_card, reveal_pan, dll.).
Transport: Streamable HTTP. Auth: OAuth 2.1 dengan Dynamic Client Registration — agen mendaftarkan diri pada koneksi pertama, tidak perlu menempel API key ke konfigurasi agen.
MCP · pengaturan klien
Claude Desktop / Claude Code
// ~/.config/claude/claude_desktop_config.json
{
"mcpServers": {
"cryptocardium": {
"url": "https://mcp.cryptocardium.com/v1",
"transport": "http"
}
}
}
Cursor / Continue / mcp-cli
# Adds the server, kicks off OAuth DCR on first connect
mcp-cli add cryptocardium \
--url https://mcp.cryptocardium.com/v1 \
--auth oauth
Setelah mengotorisasi di browser Anda, agen memiliki akses ke setiap alat dalam katalog (atau hanya yang Anda berikan izinnya, jika Anda mempersempit cakupannya).
MCP · katalog alat
Alat mencerminkan endpoint REST. Contoh kecil (daftar lengkap ada di /api):
create_account
sign_in
get_account
enable_2fa
get_balance
create_topup
withdraw
issue_card
load_card
reveal_pan
freeze_card
set_card_limits
list_transactions
get_activity
file_dispute
MCP · OAuth 2.1 + DCR
Agen mendaftarkan diri secara dinamis melalui RFC 7591. Alur:
- Agen
POST /oauth/register— menerimaclient_id&client_secret. - Pengguna diminta untuk mengotorisasi di browser (satu kali).
- Agen menerima
access_token(terlingkup, terbatas waktu). - Permintaan berikutnya membawa bearer JWT.
Cakupan per-alat
Batasi agen agar hanya membaca, hanya untuk kartu tertentu, atau hanya pada subset alat tertentu dengan meneruskan scope= saat pendaftaran. Contoh:
scope=read # list & get only, no writes
scope=cards:write # manage cards but not withdraw
scope=card:card_8f3a91b7c4d2 # single card
SDK & contoh
SDK resmi akan segera tersedia. Hingga saat itu, API adalah permukaan REST yang datar — setiap klien HTTP modern dapat menanganinya.
Node.js (fetch)
const res = await fetch('https://api.cryptocardium.com/v1/cards', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CCM_KEY}`,
'Idempotency-Key': `card_${crypto.randomUUID()}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'virtual', bin: '489517', load_usd: 300
})
});
const card = await res.json();
Python (requests)
import requests, os, uuid
r = requests.post(
'https://api.cryptocardium.com/v1/cards',
headers={
'Authorization': f"Bearer {os.environ['CCM_KEY']}",
'Idempotency-Key': f"card_{uuid.uuid4()}",
},
json={'type': 'virtual', 'bin': '489517', 'load_usd': 300}
)
card = r.json()
PHP (curl)
$ch = curl_init('https://api.cryptocardium.com/v1/cards');
curl_setopt_array($ch, [
CURLOPT_POST => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $_ENV['CCM_KEY'],
'Idempotency-Key: card_' . bin2hex(random_bytes(16)),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'virtual',
'bin' => '489517',
'load_usd' => 300,
]),
]);
$card = json_decode(curl_exec($ch), true);
Catatan perubahan
Perubahan aditif dirilis secara transparan. Perubahan yang merusak kompatibilitas akan berada di bawah awalan versi baru.
-
2026-05-19 · v1.4
Ditambahkan
POST /v1/cards/:id/load&/unloadkini bersifat atomik. Event webhookcard.loadedditambahkan. -
2026-05-18 · v1.3
Ditambahkan
Server MCP aktif di
mcp.cryptocardium.com. OAuth 2.1 DCR. 40+ alat dipetakan dari REST. -
2026-05-17 · v1.2
Ditambahkan
Program kartu Physical Gold (BIN 448585), 3-D Secure pada Visa Business dan Visa Gold.
-
2026-05-15 · v1.1
Diubah
Minimum top-up diturunkan menjadi $20 untuk routing sandbox, $200 untuk jalur produksi.
-
2026-05-12 · v1.0
Dirilis
v1 LTS. 50+ endpoint. Autentikasi Bearer + kunci idempotency + webhook HMAC.
Dukungan
Menemui kendala? Ada dua jalur:
- Jelajahi FAQ pusat bantuan — lebih dari 30 tanya-jawab yang telah dijawab dan dapat dicari.
- Buka tiket dukungan — hanya untuk pemegang kartu aktif, balasan dalam 24 jam.
Sertakan request_id dari respons yang gagal — hal itu mempercepat penyelesaian hingga 10×.