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.

1 you create a checkout link2 the customer pays with their wallet3 the contract splits the payment── money (on-chain)- - data only (no funds)

block 48,640,429 · confirmed ✓

A real payment on Base. Every value here is on-chain: check the transaction ↗ (opens in a new tab) · the contract ↗ (opens in a new tab)

Your first test payment

From nothing to a checkout you pay yourself, with test tokens. The sell guide walks the same path in full.

  1. 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 as QBITFLOW_API_KEY: every example reads it.

  2. 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 the link it 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
  3. 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.completed reaches your webhook, never on the redirect: fulfil from webhooks.