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.paymentRequeststringBolt11 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.amtRequestednumberAmount to send in BTC (e.g., 0.00000100 = 100 sats)
destReq.ccystring"BTC"
destReq.methodstring"lnurl"
destReq.reqDetails.addressstringLightning 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 quotedcompleted 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