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 setamtRequestedon either side.
Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
sourceReq.ccy | string | ✅ | "BTC" |
sourceReq.method | string | ✅ | "neutronpay" (from your wallet) |
destReq.ccy | string | ✅ | "BTC" |
destReq.method | string | ✅ | "lightning" |
destReq.reqDetails.paymentRequest | string | ✅ | 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
| Field | Type | Required | Description |
|---|---|---|---|
sourceReq.ccy | string | ✅ | "BTC" |
sourceReq.method | string | ✅ | "neutronpay" (from your wallet) |
sourceReq.amtRequested | number | ✅ | Amount to send in BTC (e.g., 0.00000100 = 100 sats) |
destReq.ccy | string | ✅ | "BTC" |
destReq.method | string | ✅ | "lnurl" |
destReq.reqDetails.address | string | ✅ | 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 tohttps://getalby.com/.well-known/lnurlp/alice.
Transaction States
| State | Meaning |
|---|---|
quoted | Transaction created — review before confirming |
srccreated | Funds reserved from wallet |
destsent | Lightning payment in flight |
completed | Payment settled ✅ |
failed | Payment failed (e.g., no route, invoice expired) |
usercanceled | Cancelled 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:
| Fee | Description |
|---|---|
| Neutron fee | Service fee (often zero for small amounts) |
| Network fee | Lightning 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
amtRequestedseparately when paying an invoice. - For Lightning Address payments, set
amtRequestedon thesourceReqside. - Amounts are always in BTC, not satoshis (100 sats =
0.00000100).
Related
- Receive Bitcoin via Lightning — Generate invoices to receive Lightning payments
- Transaction Status Types — Complete state reference
