Yerel REST API

ChatGPT'de açClaude'da aç

Yerel API, blockwallets'ın kendi REST arayüzüdür: ABD senti cinsinden fiyatlanan faturalar, sipariş başına idempotent bir ref, tüm ağları kapsayan statik deposit hesapları ve HMAC-SHA256 ile imzalanan webhook'lar. Cryptomus uyumlu API ile aynı barındırılan ödeme sayfasında aynı faturaları, aynı ücret ve bakiyeyle oluşturur.

Anahtarlarınızı panelde “Geliştiriciler › Entegrasyon ve anahtarlar” altında kendiniz oluşturursunuz: bir Live ve bir Test anahtarı ile bunların webhook signing secret'ları. Her biri bir kez gösterilir; listede yalnızca öneki görünür. Hesabınızda iki adımlı doğrulama açıksa Live anahtarı oluşturmak veya yenilemek kod ister. Henüz satıcı hesabınız yok mu? Erişim isteyin. Zaten Cryptomus kullanıyor musunuz? Cryptomus uyumlu API'ye bakın (nasıl seçilir).

Anahtarlar ve istekler

Temel URL https://blockwallets.io. İstekler ve yanıtlar JSON'dur. Her istek şunları taşır:

Hatalar bir HTTP durumu ve {"error": {"code": "…", "message": "…"}} döndürür: 400 invalid_request (eksik ya da hatalı biçimli bir alan), 401 unauthorized (eksik, bilinmeyen ya da devre dışı anahtar), 404 not_found, 409 conflict (istek faturanın mevcut durumuyla çakışıyor), 422 currency_unsupported.

Endpoint'ler

EndpointNe yapar
GET /v1/networksBu anahtarın modunda şu anda kabul edebileceğiniz ağlar: minimum, onaylar, tipik varış süresi ve ücret tahmini; fiyatlanan coin'lerde güncel kur da bulunur
POST /v1/invoicesBir fatura oluşturur (201) ya da aynı ref için mevcut olanı döndürür (200)
GET /v1/invoices?ref=…Faturayı kendi ref değerinizle sorgular
GET /v1/invoices/:idFaturayı id ile sorgular
POST /v1/invoices/:id/networkBir fatura için ağı kendiniz seçin (white-label ödeme sayfası): gösterilecek address ve pay_amount değerlerini döndürür
POST /v1/invoices/:id/closeHenüz hiç transfer görmemiş bekleyen bir faturayı kapatır
POST /v1/deposit-accountsBir müşterinin deposit hesabını açar (201) ya da getirir (200): her ağda kalıcı bir adres
GET /v1/deposit-accounts?customer_ref=…Deposit hesabını customer_ref ile sorgular
GET /v1/deposit-accounts/:idDeposit hesabını id ile sorgular
GET /v1/depositsBir hesabın depozitolarını listeler (account_id veya customer_ref, limit 1–200, varsayılan 50)
GET /v1/deposits/:idTek bir depozitoyu sorgular
GET /v1/eventsBir fatura ya da depozito için webhook gönderimleri (invoice_id veya deposit_id)
POST /v1/events/:id/redeliverBir webhook'u yeniden gönderir (202)

Zinciri o anda kontrol etmek için fatura ya da deposit hesabı sorgusuna ?probe=1 ekleyin (en fazla 10 saniyede bir); aksi halde her dakika kontrol eden tarayıcımızın en son durumunu alırsınız.

Fatura oluşturma POST /v1/invoices

Müşteri ödemeye geçtiğinde POST /v1/invoices çağırın ve yanıttaki pay_url adresine yönlendirin.

curl
curl -X POST https://blockwallets.io/v1/invoices \
  -H "Authorization: Bearer $BW_KEY" -H "Content-Type: application/json" \
  -d '{"ref":"order_1042","amount":4200,"title":"Order #1042",
       "return_url":"https://shop.example/cart","success_url":"https://shop.example/thanks?order=1042",
       "meta":{"user_id":42}}'
AlanZorunluAçıklama
refEvetSipariş numaranız: harf, rakam ve _ . : - içeren 1–64 karakter. Mod başına benzersizdir; aynı alanlarla aynı ref yeniden gönderilirse aynı fatura döner, farklı alanlarla 409 döner
amountEvetABD senti cinsinden tam sayı tutar: 4200 = $42.00. Bir ağ seçildikten sonra ağ minimumunun altında olamaz
titleEvetMüşterinin ödeme sayfasında gördüğü metin, en fazla 64 karakter
return_urlEvetÖdeme sayfasındaki “Geri”nin gideceği yer; web sitesi alan adlarınızdan birinde olmalıdır
success_urlHayırMüşterinin ödemeden sonra gideceği yer; varsayılan return_url
networkHayırAğ tablosundan bir ağ id'sini önceden seçer; müşterinin ödeme sayfasında seçmesi için boş bırakın
customer_refHayırMüşteri id'niz, en fazla 64 karakter, olduğu gibi geri döner
lifetimeHayırSaniye cinsinden ömür, 600 – 43200, varsayılan 3600
amount_ruleHayır"any" = gelen her tutarı yükle (bakiye yüklemeleri): onaylanır onaylanmaz paid. Paneldeki “Ayarlar › Ödeme kuralları ve ücretler” bölümündeki “Tutar kuralı”nı kullanmak için boş bırakın
accuracy_percentHayırEksik ödemenin ne kadarı hâlâ ödenmiş sayılır, 0 – 5 (yüzde), varsayılan 0
subtract_percentHayırPlatform ücretinin müşterinin ödediği payı, 0 – 100 (yüzde), pay_amount'a eklenir; panelin varsayılanı için boş bırakın
payment_multipleHayırEksik bir ödemenin aynı adrese tamamlanıp tamamlanamayacağı, varsayılan panelden gelir (siz değiştirmedikçe açık); false: ilk eksik transfer wrong_amount olarak biter
metaHayırEn fazla 2 KB'lık herhangi bir JSON nesnesi, sorgularda ve webhook'larda olduğu gibi geri döner
currencyHayırYalnızca USD (varsayılan); başka bir değer 422 döndürür

Her URL web sitesi alan adlarınızdan birinde olmalıdır (panel → “Geliştiriciler › Entegrasyon ve anahtarlar”). Yanıt aşağıdaki fatura nesnesidir; network, address ve pay_amount bir ağ seçildiğinde doldurulur.

Fatura nesnesi

Id'ler inv_ ile başlar. amount ABD senti cinsindendir; pay_amount ve paid_amount seçilen ağda ondalık dize olarak coin tutarlarıdır.

json
{
  "id": "inv_01J8…",
  "ref": "order_1042",
  "mode": "live",
  "status": "pending",
  "amount": 4200,
  "currency": "USD",
  "title": "Order #1042",
  "meta": { "user_id": 42 },
  "network": null,
  "address": null,
  "pay_amount": null,
  "paid_amount": null,
  "payments": [],
  "pay_url": "https://blockwallets.io/pay/inv_01J8…",
  "return_url": "https://shop.example/cart",
  "success_url": "https://shop.example/thanks?order=1042",
  "created_at": "2026-11-03T08:00:00.000Z",
  "expires_at": "2026-11-03T09:00:00.000Z",
  "paid_at": null,
  "closed_at": null
}
statusAnlamıNe yaparsınız
pendingÖdeme bekleniyor—
confirmingBir transfer görüldü ve onaylanıyor, ya da eksik geldi ve hâlâ tamamlanabilir—
paidÖdendiSiparişi gönderin / yükleyin
paid_overÖdendi, fazla ödenmişAynı; fazlalık bakiyenizdedir
wrong_amountTam tutardan az gelerek bitti (süre dolduğunda ya da payment_multiple false iken ilk eksik transferde)Bakiye yükleme işleri gelen tutarı yükleyebilir (paid_amount; kurlu coin'lerde ayrıca paid_cents); mağazalar müşteriden kalanı ödemesini ister
closedHiçbir şey gelmeden süresi doldu ya da siz kapattınız— (sonradan gelen para yine de yatırılır ve bildirilir)

Diğer alanlar: pay_url (barındırılan ödeme sayfası), payments (her transfer; txid, amount, confirmations ve confirmed ile), expires_at, paid_at, closed_at; BTC, LTC, DOGE, BCH ve ağların kendi coin'lerinde ayrıca rate (coin başına ABD doları, 30 dakika sabit), rate_locked_until ve paid_cents (şimdiye kadar gelen tutar, ABD senti) bulunur.

Ağlar

Id'yi network olarak gönderin. GET /v1/networks modunuzda şu anda açık olanları döndürür; bir ağ duraklatılabilir, bu yüzden koda sabitlemek yerine bunu okumayı tercih edin.

networkCoinZincirMinimum
USDT_TRC20USDTTRON$1
USDT_BEP20USDTBNB Chain$1
USDC_BEP20USDCBNB Chain$1
USDT_ERC20USDTEthereum$5
USDC_ERC20USDCEthereum$5
USDC_BASEUSDCBase$1
USDT_POLYGONUSDTPolygon$1
USDC_POLYGONUSDCPolygon$1
USDT_ARBITRUMUSDTArbitrum$1
USDC_ARBITRUMUSDCArbitrum$1
USDT_OPTIMISMUSDTOptimism$1
USDC_OPTIMISMUSDCOptimism$1
USDT_AVALANCHEUSDTAvalanche$1
USDC_AVALANCHEUSDCAvalanche$1
USDT_XLAYERUSDTX Layer$1
USDC_XLAYERUSDCX Layer$1
USD1_BEP20USD1BNB Chain$1
FDUSD_BEP20FDUSDBNB Chain$1
DAI_ERC20DAIEthereum$5
DAI_ARBITRUMDAIArbitrum$1
DAI_BASEDAIBase$1
BTCBTCBitcoin$5
LTCLTCLitecoin$1
DOGEDOGEDogecoin$1
BCHBCHBitcoin Cash$1
TRXTRXTRON$1
BNBBNBBNB Chain$1
ETHETHEthereum$5
ETH_BASEETHBase$1
ETH_ARBITRUMETHArbitrum$1
ETH_OPTIMISMETHOptimism$1
POLPOLPolygon$1
AVAXAVAXAvalanche$1
OKBOKBX Layer$1
USDT_SOLUSDTSolana$1
USDC_SOLUSDCSolana$1
SOLSOLSolana$1
USDT_TONUSDTTON$1
TONTONTON$1

Deposit hesapları (statik adresler) POST /v1/deposit-accounts

{"customer_ref": "user_42"} ile POST /v1/deposit-accounts, o müşteriye her ağda kalıcı bir adres verir (tüm EVM zincirleri tek adresi paylaşır). Gönderdikleri her şey ABD doları olarak yatırılır ve her transfer için bir deposit.credited webhook'u gönderilir.

curl
curl -X POST https://blockwallets.io/v1/deposit-accounts \
  -H "Authorization: Bearer $BW_KEY" -H "Content-Type: application/json" \
  -d '{"customer_ref":"user_42"}'
json
{
  "id": "dac_01J8…",
  "mode": "live",
  "customer_ref": "user_42",
  "deposit_url": "https://blockwallets.io/deposit/dac_01J8…",
  "min_amount": 100,
  "currency": "USD",
  "networks": [
    { "id": "USDT_TRC20", "chain": "tron", "token": "USDT", "address": "TXy4…8kQ2", "min_amount": 100, "confirmations": 1, … },
    { "id": "USDC_BASE", "chain": "base", "token": "USDC", "address": "0x5aE1…", "min_amount": 100, "confirmations": 20, … }
  ]
}

Minimumun altındaki transferler (genellikle $1, BTC $5) below_min olarak kaydedilir ve otomatik yatırılmaz; yatırılması için bize ulaşın.

Webhook'lar

Panelde (“Geliştiriciler › Entegrasyon ve anahtarlar”; Live ve Test'in her birinin kendi URL'si ve secret'ı vardır) tanımlı webhook URL'sine JSON POST'larız. Gövde olayın kendisidir:

http
POST /your/webhook
X-BW-Event: ev_01J8…
X-BW-Delivery: 1
X-BW-Signature: t=1793693052,v1=5f0c9b…

{"id":"ev_01J8…","type":"invoice.paid","created_at":"2026-11-03T08:04:12.000Z","invoice":{"id":"inv_01J8…","ref":"order_1042","status":"paid","amount":4200,…}}
OlayNe zaman
invoice.paidFatura paid veya paid_over oldu (süre dolduktan sonra gelen para dahil)
invoice.wrong_amountFatura wrong_amount olarak bitti
invoice.closedFatura hiçbir şey gelmeden süresi dolarak bitti ya da siz kapattınız
deposit.creditedBir deposit hesabına gelen transfer yatırıldı

Ayrıştırmadan önce ham gövde üzerinden doğrulayın, saatinizden 300 saniyeden fazla sapan bir t değerini reddedin ve karşılaştırmayı sabit sürede yapın. Gövdedeki invoice / deposit, bir sorgunun döndürdüğü nesnenin aynısıdır.

Node.js
import crypto from "node:crypto";

// rawBody: the request body exactly as received (a string), header: X-BW-Signature
function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.trim().split("=")));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return typeof parts.v1 === "string" && parts.v1.length === expected.length
    && crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}

2xx yanıt teslim edildi sayılır; aksi halde 1 dakika, 5 dakika, 30 dakika, 2 saat, 12 saat, 24 saat ve 24 saat sonra yeniden deneriz (toplam 8 deneme).

Events ve yeniden gönderim

GET /v1/events?invoice_id=inv_… (veya deposit_id=dep_…) bir fatura ya da depozitonun webhook'larını state, attempts, last_status ve last_error ile listeler. POST /v1/events/ev_…/redeliver onu hemen yeniden kuyruğa alır; örneğin endpoint'inizi düzelttikten sonra. Panelin “Geliştiriciler › Webhook günlüğü” sayfası her denemeyi istek ve yanıtıyla gösterir.

Test modu

bw_test_ anahtarıyla oluşturulan faturalar testnet'lerde çalışır ve gerçek paraya hiç dokunmaz. Ödeme sayfasında bir “Ödemeyi simüle et” düğmesi (tam / yarım / fazla ödeme) bulunur; böylece testnet coin'i olmadan durumları ve webhook'ları izleyebilirsiniz.