Send Bitcoin via Lightning

Send Bitcoin from your Neutron wallet over the Lightning Network — instant settlement, minimal fees.

Overview

Your Neutron Wallet  ──►  Neutron  ──Lightning──►  Recipient

You can pay:

  • Bolt11 invoice — a one-time payment request (most common)
  • Lightning Address — an email-like address (e.g., [email protected])
  • LNURL-pay — a URL-based protocol for requesting invoices

All three methods use the same two-step flow: create a transaction, then confirm it.

Pay a Bolt11 Invoice

The most direct method. You already have the invoice string from the recipient.

Create Transaction

curl -X POST https://api.neutron.me/api/v2/transaction \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -d '{
    "sourceReq": {
      "ccy": "BTC",
      "method": "neutronpay"
    },
    "destReq": {
      "ccy": "BTC",
      "method": "lightning",
      "reqDetails": {
        "paymentRequest": "lnbc100u1p5pc6lq..."
      }
    }
  }'
📘

No amount needed — the amount is encoded in the invoice. Don't set amtRequested on either side.

Request Fields

FieldTypeRequiredDescription
sourceReq.ccystring✅"BTC"
sourceReq.methodstring✅"neutronpay" (from your wallet)
destReq.ccystring✅"BTC"
destReq.methodstring✅"lightning"
destReq.reqDetails.paymentRequeststring✅Bolt11 invoice string (lnbc... or lntb...)

Response

{
  "txnId": "d5a2c7b4-3456-4def-8901-abcdef123456",
  "accountId": "ne01-abc123def456",
  "txnState": "quoted",
  "sourceReq": {
    "ccy": "BTC",
    "method": "neutronpay",
    "amtRequested": 0.000001,
    "neutronpayFees": 0,
    "networkFees": 0.0000000005,
    "reqStatus": "0",
    "createAt": 1770342000000
  },
  "destReq": {
    "ccy": "BTC",
    "method": "lightning",
    "amtRequested": 0.000001,
    "reqStatus": "0",
    "reqDetails": {
      "paymentRequest": "lnbc100u1p5pc6lq..."
    }
  },
  "fxRate": 1,
  "createdAt": 1770342000000
}

Confirm Transaction

curl -X PUT https://api.neutron.me/api/v2/transaction/d5a2c7b4-3456-4def-8901-abcdef123456/confirm \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Lightning payments settle in seconds. After confirmation, the transaction moves through states rapidly and reaches completed.

Pay a Lightning Address

Lightning Addresses look like email addresses (e.g., [email protected]). Neutron resolves the address server-side — you just provide the address and amount.

Create Transaction

curl -X POST https://api.neutron.me/api/v2/transaction \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -d '{
    "sourceReq": {
      "ccy": "BTC",
      "method": "neutronpay",
      "amtRequested": 0.00000100
    },
    "destReq": {
      "ccy": "BTC",
      "method": "lnurl",
      "reqDetails": {
        "address": "[email protected]"
      }
    }
  }'

Request Fields

FieldTypeRequiredDescription
sourceReq.ccystring✅"BTC"
sourceReq.methodstring✅"neutronpay" (from your wallet)
sourceReq.amtRequestednumber✅Amount to send in BTC (e.g., 0.00000100 = 100 sats)
destReq.ccystring✅"BTC"
destReq.methodstring✅"lnurl"
destReq.reqDetails.addressstring✅Lightning Address (e.g., [email protected])
📘

Set amount on source side — unlike Bolt11 invoices, Lightning Address payments need an explicit amount since there's no invoice to extract it from.

Response

{
  "txnId": "4c2f365e-8382-4eaa-bbb7-4a6f726d5b5f",
  "accountId": "ne01-abc123def456",
  "txnState": "quoted",
  "sourceReq": {
    "ccy": "BTC",
    "method": "neutronpay",
    "amtRequested": 0.000001,
    "neutronpayFees": 0,
    "networkFees": 0
  },
  "destReq": {
    "ccy": "BTC",
    "method": "lnurl",
    "amtRequested": 0.000001,
    "reqDetails": {
      "lnurlAddress": "[email protected]"
    }
  },
  "fxRate": 1,
  "createdAt": 1770342000000
}

Confirm Transaction

curl -X PUT https://api.neutron.me/api/v2/transaction/4c2f365e-8382-4eaa-bbb7-4a6f726d5b5f/confirm \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Neutron handles the LNURL resolution, invoice request, and payment automatically.

Pay via LNURL

LNURL-pay uses the same method: "lnurl" as Lightning Addresses. If you have a raw LNURL string (starting with lnurl1...), resolve it client-side first to get a Lightning Address or callback URL, then use the Lightning Address flow above.

LNURL Resolution (Client-Side)

LNURL strings are bech32-encoded URLs. Most LNURL libraries can decode them:

// Using a library like js-lnurl or bolt11
const decoded = decodeLnurl("lnurl1dp68gurn8ghj7...");
// → "https://service.com/lnurlp/user"

// Fetch the LNURL-pay endpoint
const params = await fetch(decoded).then(r => r.json());
// → { callback, minSendable, maxSendable, metadata, tag: "payRequest" }

// Request a Bolt11 invoice
const { pr } = await fetch(`${params.callback}?amount=${amountMsats}`).then(r => r.json());

// Pay the invoice using the standard Bolt11 flow
📘

Lightning Address = LNURL-pay — Lightning Addresses ([email protected]) are just a human-friendly wrapper around the LNURL-pay protocol. Under the hood, [email protected] resolves to https://getalby.com/.well-known/lnurlp/alice.

Transaction States

StateMeaning
quotedTransaction created — review before confirming
srccreatedFunds reserved from wallet
destsentLightning payment in flight
completedPayment settled ✅
failedPayment failed (e.g., no route, invoice expired)
usercanceledCancelled before confirmation

Lightning payments typically go from quoted → completed in seconds.

See Transaction Status Types for the complete state reference.

Fees

Lightning sends have minimal fees:

FeeDescription
Neutron feeService fee (often zero for small amounts)
Network feeLightning routing fee — typically < 1 sat

Both shown in the quoted response before you confirm.

SDK Examples

TypeScript (neutron-sdk)

import { Neutron } from "neutron-sdk";

const neutron = new Neutron({
  apiKey: process.env.NEUTRON_API_KEY,
  apiSecret: process.env.NEUTRON_API_SECRET,
});

// Pay a Bolt11 invoice
const txn = await neutron.lightning.payInvoice("lnbc100u1p5pc6lq...");
await neutron.transactions.confirm(txn.txnId);

// Pay a Lightning Address
const txn2 = await neutron.lightning.payAddress("[email protected]", {
  amountSats: 1000,
});
await neutron.transactions.confirm(txn2.txnId);

Python (neutron-python)

from neutron import Neutron

client = Neutron(api_key="...", api_secret="...")

# Pay a Bolt11 invoice
txn = client.lightning.pay_invoice("lnbc100u1p5pc6lq...")
client.transactions.confirm(txn["txnId"])

# Pay a Lightning Address
txn = client.lightning.pay_address("[email protected]", amount_sats=1000)
client.transactions.confirm(txn["txnId"])

Notes

  • No KYC required for Bitcoin Lightning transactions. KYC is only needed for fiat payouts.
  • Lightning invoices have an expiry time (usually 1 hour). Create and confirm the transaction promptly.
  • If a payment fails (no route found), your funds are not deducted.
  • The amount is encoded in Bolt11 invoices — don't set amtRequested separately when paying an invoice.
  • For Lightning Address payments, set amtRequested on the sourceReq side.
  • Amounts are always in BTC, not satoshis (100 sats = 0.00000100).

Related