OpenNode vs ln.bot for Lightning APIs

OpenNode helps registered businesses accept bitcoin and settle in US dollars. ln.bot gives software and AI agents Lightning wallets that receive and spend.

Updated October 23, 2026View as Markdown
  • OpenNode
  • Lightning network
  • API
  • Payments
  • L402

OpenNode is a bitcoin payment processor for registered businesses. It gives a merchant hosted checkout pages, store plugins and invoices, prices charges in dollars or other currencies, and can convert what comes in to US dollars for a US bank account. ln.bot is a hosted wallet API for software that keeps a balance of its own and spends it: an AI agent paying for API calls, a service paying another service, a platform that gives each user or agent a wallet.

Checked on 23 October 2026: the OpenNode details below come from OpenNode's site, help centre and developer docs, linked where they appear.

Which one fits

  • Customers pay your business for goods or services, and you want dollars in the bank: OpenNode.
  • Your code pays for things, or each of many agents needs a balance of its own: ln.bot.
  • Both happen in one product: customers pay through OpenNode, and the agents behind the product spend from ln.bot wallets. Moving bitcoin between the two is an ordinary Lightning payment.

What OpenNode does

OpenNode raised a $20M Series A in 2022, led by Kingsway Capital with Twitter and Tim Draper taking part (The Block), and lists Substack and Fold among its customers. It is available to registered businesses only: a business verifies its registration and address, and its main owners verify their identity.

What a merchant gets:

On fees, OpenNode gives 1% as its typical processing fee for payments and payouts, with no setup or monthly fees. Lightning withdrawals are free, and on-demand on-chain withdrawals cost 1% (as of October 2026).

A charge and an invoice

Both APIs create a Lightning payment request in one call. With OpenNode's Node.js library, priced in dollars:

import opennode from "opennode";

opennode.setCredentials(process.env.OPENNODE_API_KEY, "live");

const charge = await opennode.createCharge({
  amount: 1.5,
  currency: "USD", // without a currency, the amount is in satoshis
  description: "Report #42",
  callback_url: "https://example.com/webhooks/opennode",
});
javascript

With ln.bot, amounts are always integers in bitcoin's smallest unit, so this invoice is for ₿1,000:

import { LnBot } from "@lnbot/sdk";

const ln = new LnBot({ apiKey: process.env.LNBOT_USER_KEY }); // uk_...

const invoice = await ln.wallet("wal_...").invoices.create({
  amount: 1000,
  memo: "Report #42",
});
console.log(invoice.bolt11);
typescript

OpenNode tells you about payments through the charge's callback_url. ln.bot sends webhooks and also streams events, so a worker can wait on an invoice without running a web server.

Spending from code

OpenNode sends bitcoin out as withdrawals, on-chain or over Lightning, and a Lightning withdrawal needs a BOLT11 invoice from the recipient. That fits moving a merchant's balance somewhere else.

ln.bot is built for code that spends as it goes. A payment can go to a Lightning address, an LNURL or an invoice, an idempotency key makes a retry safe, and a payment between two ln.bot wallets settles in under a second:

const w = ln.wallet("wal_...");

const payment = await w.payments.create({
  target: "r7vq3np@ln.bot", // a Lightning address, an LNURL or a BOLT11 invoice
  amount: 500,
  idempotencyKey: "job-1187", // a retry with the same key can't pay twice
});
console.log(payment.status); // "processing" at first, then "settled" or "failed"
typescript

For APIs that charge per request with L402, @lnbot/l402 pays the challenge and retries the request, within limits you set. It checks the amount in the invoice itself, not the price the server announces:

import { l402, LnBot } from "@lnbot/l402";

const ln = new LnBot({ apiKey: process.env.LNBOT_USER_KEY });

const api = l402.client(ln, {
  walletId: "wal_...",
  maxPrice: 100, // refuse any single request above ₿100
  budgetSats: 5_000, // and stop after ₿5,000 in a day
  budgetPeriod: "day",
});

const forecast = await api.get("https://api.example.com/premium/forecast");
typescript

The budget is kept in memory, so it resets when the process restarts. The pay-per-call guide covers the server side.

One account, or a wallet per agent

An OpenNode API key belongs to one business account. For platforms, OpenNode documents managed accounts: full OpenNode accounts that a platform creates for its users once OpenNode support enables the feature for its API key, with an endpoint that creates an identity-verification link for each user.

On ln.bot a wallet is an API call, with no identity check and no limit on how many. Each one gets a random Lightning address, and a wallet key reaches that wallet and no other:

const { walletId, address } = await ln.wallets.create();
const { key } = await ln.wallet(walletId).key.create(); // wk_..., this wallet only

console.log(address); // a random address, such as x4k7m2@ln.bot
typescript

Give an agent its wallet key, or connect its MCP client to https://api.ln.bot/v1/wallets/{walletId}/mcp (see the MCP docs). The MCP tools can spend whatever the wallet holds, so put in only what the agent may spend.

Side by side

OpenNode ln.bot
Built for Businesses accepting bitcoin Software that receives and spends
Who can sign up Registered businesses, after verification Anyone, by API call, with no identity check
Receiving Charges priced in satoshis or fiat, over Lightning or on-chain Invoices priced in ₿, over Lightning
Lightning addresses None in the current API reference One per wallet, ₿1 to ₿1,000,000 per payment
Sending Withdrawals to a BOLT11 invoice or on-chain Payments to addresses, LNURLs and invoices
Separate balances One account per API key; managed accounts through support Wallets created by API
Fiat Conversion and US bank settlement in USD None
Checkout and store plugins Yes None
MCP server and L402 None found MCP server per wallet; L402 client and middleware
Official libraries Node.js, PHP TypeScript, Python, Go, Rust, C#, and a CLI
Test environment Testnet None: wallets hold real bitcoin
Fees (October 2026) 1% typical processing; Lightning withdrawals free Receiving free; paying out 0.25% (minimum ₿1) plus a network fee of 0.25% and routing; free between ln.bot wallets

What ln.bot doesn't do

ln.bot has nothing for a merchant's checkout: there are no payment pages, store plugins or invoice templates. It never touches fiat, so prices can't be set in dollars and nothing settles to a bank. It works on Lightning only, without on-chain addresses, and it has no test network, so test with small amounts.

It is also custodial. ln.bot runs the Lightning nodes and the channel liquidity, and balances sit on ln.bot's nodes, which makes a wallet an operational balance for spending rather than a place for savings.

FAQ

Is OpenNode good for developers?

For merchant payments, yes. OpenNode has a REST API with official Node.js and PHP libraries, a testnet development environment, webhooks, hosted checkout and store plugins. It is built for businesses that take payments, so it has no wallets per user or agent, no MCP server and no L402 support.

What is the OpenNode transaction fee?

As of October 2026, OpenNode's help centre gives 1% as the typical processing fee for payments and payouts, with no setup or monthly fees. Lightning withdrawals are free, on-demand on-chain withdrawals cost 1%, conversion is free and bank transfer fees vary. ln.bot charges nothing to receive and, to pay out over Lightning, 0.25% (minimum ₿1) plus the network fee, another 0.25% and routing; transfers between ln.bot wallets are free.

Can OpenNode create wallets programmatically?

Not by default. An OpenNode API key belongs to one business account. For platforms, OpenNode documents managed accounts: full OpenNode accounts created for your users once OpenNode support enables the feature, with an endpoint for verifying each user's identity. ln.bot creates a wallet with one API call, with no identity check and no limit on how many.

Does OpenNode support L402?

We found no L402 support in OpenNode's developer docs, GitHub or npm packages as of October 2026. ln.bot creates, pays and verifies L402 challenges through its SDKs and MCP server, and has paywall middleware for Express and ASP.NET Core.

What does an AI agent need from a Lightning API?

A wallet of its own that can be created by API, a key that reaches only that wallet, spending limited to what the wallet holds or to a client budget, an MCP server, and a way to pay L402 APIs. ln.bot provides each of these. OpenNode is built for businesses accepting payments rather than for agents that spend.