Prerequisites

To complete this guide, you will need the following:

1. Create a Node.js project

Start with a brand new empty directory called express-example and run the following command to initiate a Node.js project:

npm init -y

2. Install Express.js

Inside your project directory, run the following command to install Express.js:

3. Install @zbd/node Node.js SDK

Inside your Express.js

4. Send and receive Bitcoin

Create a new file called index.js and add the following code:

import express from "express";
import { zbd } from "@zbd/node";

const ZBD_API_KEY = 'b7YW3s2JzZKGcXjIf5Dqof8wjKT2RuWr8';
const ZBD = new zbd(ZBD_API_KEY);

// Create Express app
const app = express();

// Creating a Bitcoin Lightning payment request
app.get("/request", async (req, res) => {
  try {
    // @ts-ignore
    const data = await ZBD.createCharge({
      amount: "100000", // 100 satoshis (100,000 msats)
      description: "Express + ZBD!",
    });
    res.status(200).json({ data });
  } catch (error) {
    res.status(500).json({ error });
  }
});

// Send a payment to a Bitcoin Lightning Address
app.get("/send", async (req, res) => {
  try {
    const data = await ZBD.sendLightningAddressPayment({
      lnAddress: "andre@zbd.gg", // Who is the recipient?
      amount: "100000", // 100 satoshis (100,000 msats)
      comment: "Express + ZBD!",
    });
    res.status(200).json({ data });
  } catch (error) {
    res.status(500).json({ error });
  }
});

app.listen(3000, () => {
  console.log("Express server w/ ZBD listening on http://localhost:3000");
});

Run the following command to start your Express.js server:

Opening your browser to the following URL: http://localhost:3000/request should return a JSON response with a payment request.

You can also test this using curl command:

curl http://localhost:3000/request

You’re looking for the data.invoice.request property in the JSON response. It starts with lnbc1 and is the payment request anyone in the Bitcoin Lightning Network can use to pay you.

lnbc1u1pjdlax9pp5t7jhkd7h2wntd4f2v7xp22dknmjxp0q8nm7hfcny4p7a5mr7x3rsdp9f4hkueteypshggrfde6x2unwv46zqumsv4jkgcqzzsxqzjcsp5dsayu6m6632p28rnkeeqsr7d54amrkv6wh46yrv42gdgca8xl8gs9qyyssqgj2zrkax733rzulfkzc5mqsr8fpwrva82stpa7e0frw32722trv37jlq8mvlqfp8y75lr6mz63zd7qnxar8hhsehuy22pvfq6wjxwqqqa60lx3
Charges and payment requests are usually shown to users as QR codes that can be scanned by mobile apps (e.g. ZBD). Read Callbacks to understand how to receive updates about your payment asynchronously.

Opening your browser to the following URL: http://localhost:3000/send should return a JSON response with the payment sent message.

You can also test this using curl command:

curl http://localhost:3000/send

You’re looking for the status of completed to know that the payment settled successfully.

Payments in the Lightning Network are asynchronous so you may see a response stating the payment is processing. This is expected — use the callbackUrl property to receive updates about your payments.

3. Try it yourself

You can now send and receive instant Bitcoin payments using Express.js + ZBD!