Developer docs
What are you building?
Crypto payments and subscriptions, wallet to wallet. Pick your path, or take a first test payment below.
One-time
Your customer pays from their wallet; the contract takes QBitFlow's fee and sends the rest straight to your wallet, in the same transaction.
Sell your product
For shops and SaaS selling something once: an order, a licence, a lifetime plan.
Start the guide 7 steps
Subscriptions
Your customer signs a spending cap once, and pays the first bill at signing; then the contract bills each period on its due date, from their wallet to yours, never past the cap, QBitFlow's fee taken from each bill.
Bill subscriptions
For SaaS and memberships billed every period, from the customer's own wallet.
Start the guide 7 steps
Marketplace
The buyer pays; the contract takes QBitFlow's fee and splits the rest between the seller and your fee in one transaction, or sends it all to your wallet, held by you until you release it.
Run a marketplace
For platforms selling for their sellers, and taking a commission.
Start the guide 7 steps
Each guide takes you from an API key to a live integration, every step checkable in test mode.
How QBitFlow works
WHERE THE MONEY GOES
Straight from their wallet to yours. We're not in the path.
block 48,640,429 · confirmed ✓
Your first test payment
From nothing to a checkout you pay yourself, with test tokens. The sell guide walks the same path in full.
Step 1: Get a key and a wallet
In the dashboard, switch to Test: test keys, networks and faucet tokens, nothing carried over to live (test mode). Add a wallet in Settings › Wallets with the currencies it accepts (without one, the API answers
409 merchant_not_ready), then create a key in Settings › API keys and store it asQBITFLOW_API_KEY: every example reads it.Step 2: Create a checkout
A one-time checkout for an inline product: nothing to create first. The SDK tabs use a
client(install an SDK and create one). Open thelinkit returns: that's what your customer sees.Create a payment checkout checkout-create-payment.sh
# A one-time checkout for an inline product. QBitFlow replaces {{UUID}} with the session's id on# redirect. The same Idempotency-Key on a retry never opens a second checkout.curl https://api.qbitflow.app/v2/checkout-sessions/payment \ -H "X-API-Key: $QBITFLOW_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "productName": "T-shirt", "description": "Blue, size M", "priceUsd": "4.99", "reference": "order-1042", "successUrl": "https://shop.example.com/orders/success?uuid={{UUID}}", "cancelUrl": "https://shop.example.com/orders/cancel" }'# 201: a CreatedCheckoutSession ({ "link": "https://…/checkout?uuid=pay@…", "uuid": "pay@…", "expiresAt": "…" })# Redirect the customer to "link".// An inline product: nothing needs to exist in your catalog. QBitFlow replaces {{UUID}} with the// session's id on the redirect.const session = await client.checkoutSessions. createPayment( { productName: 'T-shirt', description: 'Blue, size M', priceUsd: '4.99', // USD, a decimal string, never a float reference: 'order-1042', // your order id: unique per space successUrl: `https://shop.example.com/orders/success?uuid=${Placeholders. UUID}`, cancelUrl: 'https://shop.example.com/orders/cancel',}); // Redirect the customer to the hosted checkout page.console.log(`Redirect the customer to ${session.link}`); session = client.checkout_sessions. create_payment( product_name="T-shirt", description="Blue, size M", price_usd="4.99", # USD, a decimal string: never a float reference="order-1042", # your order id: unique per space # QBitFlow replaces the placeholder with the session's id when it redirects the customer. success_url=f"https://shop.example.com/orders/success?uuid={qbitflow. PLACEHOLDER_UUID}", cancel_url="https://shop.example.com/orders/cancel",)# Redirect the customer to the hosted checkout page.print("Send the customer to", session.link) // An inline product: no product needed in the catalog. QBitFlow replaces {{UUID}}// (qbitflow.PlaceholderUUID) with the session's id on redirect.session, err := client.CheckoutSessions. CreatePayment( ctx, &qbitflow. CreatePaymentSessionParams{ ProductName: "T-shirt", Description: "Blue, size M", PriceUSD: "4.99", // a decimal string, never a float Reference: "order-1042", // your order id: unique per space SuccessURL: "https://shop.example.com/orders/success?uuid=" + qbitflow.PlaceholderUUID, CancelURL: "https://shop.example.com/orders/cancel",})if err != nil { log.Fatal(err)}// In an HTTP handler: http.Redirect(w, r, session.Link, http.StatusSeeOther)fmt.Println("Redirect the customer to", session.Link) $session = $client->checkoutSessions->createPayment(new \QBitFlow\Params\CreatePaymentSessionParams( productName: 'T-shirt', description: 'Blue, size M', priceUsd: '4.99', // a decimal string, never a float reference: 'order-1042', // your order id: unique per space successUrl: 'https://shop.example.com/orders/success?uuid=' . \QBitFlow\Placeholders::UUID, cancelUrl: 'https://shop.example.com/orders/cancel',)); header('Location: ' . $session->link); // send the customer to the hosted checkout Step 3: Pay it
Get test tokens from the faucets, open the link and pay (how to pay). A test checkout is at most $5, fees included.
Then fulfil the order when
payment.completedreaches your webhook, never on the redirect: fulfil from webhooks.