Native REST API

In ChatGPT öffnenIn Claude öffnen

Die native API ist die eigene REST-Schnittstelle von blockwallets: Rechnungen in US-Cent, eine idempotente ref pro Bestellung, statische Einzahlungskonten für alle Netzwerke und mit HMAC-SHA256 signierte Webhooks. Sie erzeugt dieselben Rechnungen auf demselben gehosteten Checkout wie die Cryptomus-kompatible API, mit denselben Gebühren und demselben Guthaben.

Sie erzeugen Ihre Keys selbst im Dashboard unter „Entwickler › Integration & Keys“: einen Live- und einen Test-Key samt Webhook-Signaturgeheimnissen. Jedes wird nur einmal angezeigt; die Liste zeigt nur das Präfix. Ist für Ihr Konto die Zwei-Faktor-Authentifizierung aktiv, verlangt das Erzeugen oder Erneuern eines Live-Keys einen Code. Noch kein Händlerkonto? Zugang anfragen. Sie nutzen bereits Cryptomus? Sehen Sie sich die Cryptomus-kompatible API an (so wählen Sie).

Keys und Anfragen

Base-URL https://blockwallets.io. Anfragen und Antworten sind JSON. Jede Anfrage enthält:

Fehler liefern einen HTTP-Status und {"error": {"code": "…", "message": "…"}}: 400 invalid_request (ein Feld fehlt oder ist fehlerhaft), 401 unauthorized (Key fehlt, ist unbekannt oder deaktiviert), 404 not_found, 409 conflict (die Anfrage widerspricht dem aktuellen Zustand der Rechnung), 422 currency_unsupported.

Endpoints

EndpointWas er tut
GET /v1/networksNetzwerke, die Sie im Modus dieses Keys gerade annehmen können: Mindestbetrag, Bestätigungen, übliche Ankunftszeit und Gebührenschätzung; bei Coins mit Kurs steht der aktuelle Kurs dabei
POST /v1/invoicesEine Rechnung erstellen (201) oder die bestehende zur selben ref zurückgeben (200)
GET /v1/invoices?ref=…Eine Rechnung über Ihre ref abfragen
GET /v1/invoices/:idEine Rechnung über die id abfragen
POST /v1/invoices/:id/networkDas Netzwerk einer Rechnung selbst wählen (White-Label-Checkout): liefert address und pay_amount zur Anzeige
POST /v1/invoices/:id/closeEine offene Rechnung schließen, bei der noch keine Überweisung gesehen wurde
POST /v1/deposit-accountsDas Einzahlungskonto eines Kunden öffnen (201) oder abrufen (200): eine dauerhafte Adresse in jedem Netzwerk
GET /v1/deposit-accounts?customer_ref=…Ein Einzahlungskonto über customer_ref abfragen
GET /v1/deposit-accounts/:idEin Einzahlungskonto über die id abfragen
GET /v1/depositsDie Einzahlungen eines Kontos auflisten (account_id oder customer_ref, limit 1–200, Standard 50)
GET /v1/deposits/:idEine Einzahlung abfragen
GET /v1/eventsWebhook-Zustellungen zu einer Rechnung oder Einzahlung (invoice_id oder deposit_id)
POST /v1/events/:id/redeliverEinen Webhook erneut senden (202)

Hängen Sie ?probe=1 an eine Abfrage von Rechnung oder Einzahlungskonto, um dabei die Chain zu prüfen (höchstens alle 10 Sekunden); andernfalls erhalten Sie den letzten Stand unseres Scanners, der jede Minute prüft.

Rechnung erstellen POST /v1/invoices

Rufen Sie POST /v1/invoices auf, wenn der Kunde zur Kasse geht, und leiten Sie ihn auf pay_url aus der Antwort weiter.

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}}'
FeldPflichtBeschreibung
refJaIhre Bestellnummer: 1–64 Zeichen aus Buchstaben, Ziffern und _ . : -. Pro Modus eindeutig; dieselbe ref mit denselben Feldern erneut zu senden liefert dieselbe Rechnung, mit anderen Feldern ergibt es 409
amountJaBetrag in US-Cent als Ganzzahl: 4200 = $42.00. Nach der Netzwerkwahl nicht unter dem Mindestbetrag des Netzwerks
titleJaWas der Kunde im Checkout sieht, bis zu 64 Zeichen
return_urlJaWohin „Zurück“ im Checkout führt; muss auf einer Ihrer Website-Domains liegen
success_urlNeinWohin der Kunde nach der Zahlung geht; Standard ist return_url
networkNeinEine Netzwerk-id aus der Netzwerktabelle vorauswählen; weglassen, damit der Kunde im Checkout wählt
customer_refNeinIhre Kunden-id, bis zu 64 Zeichen, wird unverändert zurückgegeben
lifetimeNeinLebensdauer in Sekunden, 600 – 43200, Standard 3600
amount_ruleNein"any" = alles gutschreiben, was ankommt (Aufladungen): paid, sobald bestätigt. Weggelassen gilt die „Betragsregel“ unter „Einstellungen › Zahlungsregeln & Gebühren“ im Dashboard
accuracy_percentNeinWie viel Unterzahlung noch als bezahlt gilt, 0 – 5 (Prozent), Standard 0
subtract_percentNeinAnteil der Plattformgebühr, den der Kunde zahlt, 0 – 100 (Prozent), wird zu pay_amount addiert; weggelassen gilt der Dashboard-Standard
payment_multipleNeinOb eine Unterzahlung an dieselbe Adresse nachgezahlt werden kann; Standard aus dem Dashboard (an, solange Sie es nicht geändert haben). false: Die erste zu geringe Überweisung endet als wrong_amount
metaNeinEin beliebiges JSON-Objekt bis 2 KB, wird in Abfragen und Webhooks unverändert zurückgegeben
currencyNeinNur USD (Standard); alles andere ergibt 422

Jede URL muss auf einer Ihrer Website-Domains liegen (Dashboard → „Entwickler › Integration & Keys“). Die Antwort ist das unten beschriebene Rechnungsobjekt; network, address und pay_amount werden gefüllt, sobald ein Netzwerk gewählt ist.

Das Rechnungsobjekt

Ids beginnen mit inv_. amount ist in US-Cent; pay_amount und paid_amount sind Coin-Mengen als Dezimal-Strings im gewählten Netzwerk.

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
}
statusBedeutungWas Sie tun
pendingWartet auf Zahlung—
confirmingEine Überweisung wurde gesehen und wird bestätigt, oder sie kam zu niedrig an und kann noch aufgestockt werden—
paidBezahltBestellung versenden / gutschreiben
paid_overBezahlt und überzahltDasselbe; der Überschuss liegt in Ihrem Guthaben
wrong_amountMit weniger als dem vollen Betrag beendet (bei Ablauf oder bei der ersten zu geringen Überweisung, wenn payment_multiple false ist)Aufladungsgeschäfte können gutschreiben, was angekommen ist (paid_amount; bei Coins mit Kurs zusätzlich paid_cents); Shops bitten den Kunden, den Rest zu zahlen
closedAbgelaufen, ohne dass etwas eingegangen ist, oder von Ihnen geschlossen— (später eingehendes Geld wird trotzdem gutgeschrieben und gemeldet)

Weitere Felder: pay_url (der gehostete Checkout), payments (jede Überweisung mit txid, amount, confirmations und confirmed), expires_at, paid_at, closed_at; BTC, LTC, DOGE, BCH und native Coins haben außerdem rate (US-Dollar pro Coin, 30 Minuten fest), rate_locked_until und paid_cents (bisher eingegangen, in US-Cent).

Netzwerke

Übergeben Sie die id als network. GET /v1/networks liefert die in Ihrem Modus gerade offenen Netzwerke; ein Netzwerk kann pausiert sein, lesen Sie die Liste also lieber aus, statt Werte fest einzutragen.

networkCoinChainMinimum
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

Einzahlungskonten (statische Adressen) POST /v1/deposit-accounts

POST /v1/deposit-accounts mit {"customer_ref": "user_42"} gibt diesem Kunden eine dauerhafte Adresse in jedem Netzwerk (alle EVM-Chains teilen sich eine Adresse). Alles, was er sendet, wird in US-Dollar gutgeschrieben, mit einem Webhook deposit.credited pro Überweisung.

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, … }
  ]
}

Überweisungen unter dem Mindestbetrag (meist $1, BTC $5) werden als below_min erfasst und nicht automatisch gutgeschrieben; kontaktieren Sie uns, damit sie gutgeschrieben werden.

Webhooks

Wir senden JSON per POST an die Webhook-URL im Dashboard („Entwickler › Integration & Keys“; Live und Test haben jeweils eigene URL und eigenes Secret). Der Body ist das Event:

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,…}}
EventWann
invoice.paidDie Rechnung wurde paid oder paid_over (einschließlich Geld, das nach Ablauf ankam)
invoice.wrong_amountDie Rechnung endete als wrong_amount
invoice.closedDie Rechnung ist abgelaufen, ohne dass etwas einging, oder Sie haben sie geschlossen
deposit.creditedEine Überweisung an ein Einzahlungskonto wurde gutgeschrieben

Prüfen Sie gegen den rohen Body, bevor Sie ihn parsen, lehnen Sie ein t ab, das mehr als 300 Sekunden von Ihrer Uhr abweicht, und vergleichen Sie in konstanter Zeit. invoice / deposit im Body ist dasselbe Objekt, das eine Abfrage liefert.

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));
}

Eine 2xx-Antwort gilt als zugestellt; andernfalls wiederholen wir nach 1 Minute, 5 Minuten, 30 Minuten, 2 Stunden, 12 Stunden, 24 Stunden und 24 Stunden (insgesamt 8 Versuche).

Events und erneute Zustellung

GET /v1/events?invoice_id=inv_… (oder deposit_id=dep_…) listet die Webhooks einer Rechnung oder Einzahlung mit state, attempts, last_status und last_error. POST /v1/events/ev_…/redeliver reiht ihn sofort neu ein, zum Beispiel nachdem Sie Ihren Endpoint repariert haben. Die Seite „Entwickler › Webhook-Protokoll“ im Dashboard zeigt jeden Versuch mit Anfrage und Antwort.

Testmodus

Mit einem bw_test_-Key erstellte Rechnungen laufen auf Testnets und berühren nie echtes Geld. Der gehostete Checkout zeigt eine Schaltfläche „Zahlung simulieren“ (voll / halb / überzahlt), sodass Sie Status und Webhooks sehen, ohne Testnet-Coins zu besorgen.