For developers & AI agents
Every tip jar on BitcoinTipJar is just a URL. There is no API key, no account and no registration step: build the link and it works. Tips go straight from the payer's Lightning wallet to the recipient's — we are never in the middle of the money, and we take no fee.
The three things you can do: generate a tip page from parameters, embed the live card in your own page, and be told when a tip actually settles.
URL Schema
// Generate a tip page via URL params — no API key, no account bitcointipjar.com/tip?ln={address}&name={name}&amounts={csv}
bitcointipjar.com/tip?ln=satoshi@coinos.io&name=Satoshi%27s+Coffee&amounts=1000,2500,5000,10000&accent=ff9b00&theme=darkStyle the card
amount={sats} pre-select that amount, land straight on the QR accent={hex} your brand color — 6 hex chars, no # theme=dark dark card for dark sites (the QR stays scannable) custom=0 drop the “Other” tile — your amounts only tagline={text} the line under the name (default “Tip with Bitcoin”) // Swap /tip for /poster with the same params → print-ready A4 poster bitcointipjar.com/poster?ln={address}&name={name}&amounts={csv}
Hand them out
// Give every user on your platform a jar: one link each, built from their // Lightning address and name. No account, no API key, and no money passes // through you or us. Each tip goes straight to their own wallet. src=partner tag the links your platform hands out batch={your-name} your platform: a-z, 0-9, - and _, up to 32 characters
bitcointipjar.com/tip?ln=satoshi@coinos.io&name=Satoshi&src=partner&batch=yourplatform// Tagged, your users’ jars are counted apart, so we can tell you how // they’re doing. A jar a user claims keeps the tag.
Get the payment data back
ref={string} opaque ref echoed back to you (song, order, table…) notify={url} HTTPS webhook — fires only after the payment settles // We confirm settlement with the wallet (LUD-21 verify), then POST: { ref, amount_sats, payer, pr, verify_url, settled_at } // Re-check verify_url yourself before trusting the event. // payer is the name the tipper typed (LUD-12 comment) — self-reported, // so escape it. Verify-proof covers the payment, not the name.
Embed it in your own page
<iframe src="https://bitcointipjar.com/embed?jar={name}" style="border:0" width="360" height="480"></iframe>
jar={name} a claimed jar — its branding, records and extras come with it, and the owner can change wallets without you re-pasting ln={address} or an address directly, for a jar nobody has claimed chrome=none bare card — no border, background or header block bg={hex} paint the frame to your panel color (beats transparency) // Same params as /tip. When the tip settles, the frame postMessages // {type:'tipjar:settled', ref, amount_sats, payer, pr, verify_url}. // Treat it as a UI hint only — anything you gate on payment should // trust the notify= webhook (server-verified) and re-check verify_url. // The frame also reports its content height on every state change, so // the iframe can grow with the card instead of scrolling:
addEventListener('message', e => {
if (e.source !== frame.contentWindow || !e.data) return // only OUR frame
if (e.data.type === 'tipjar:height')
frame.style.height = Math.min(Math.max(e.data.px|0, 180), 1200) + 'px'
})// QR-encode the full URL for physical placement. // AI agents: construct URL → return link. // Optional: claim a vanity URL later bitcointipjar.com/mikespizza
Notes worth reading once
- Settlement is verified server-side. Before we fire your webhook
we re-fetch the invoice's LUD-21 verify URL, pinned to the receiving wallet's own
host, and read the amount out of the bolt11 rather than out of any request body.
Re-check
verify_urlyourself before you ship anything of value. payeris untrusted. It is the LUD-12 comment the tipper typed. Escape it. The verify proof covers the payment, not the name.- Not every wallet can confirm. Confirmation needs LUD-21 verify.
coinos, Alby, Blink, Speed and Stacker News have it; Wallet of Satoshi, Strike,
ZBD and npub.cash do not. A jar on those still receives tips perfectly well — you
just never hear about them, so no webhook fires. The live list, as our own probe
finds it, is /wallets/, and as JSON
/api/wallets. - Prefer
jar=overln=. A claimed jar carries its owner's branding and records, and the owner can change wallets without anything you pasted breaking.
Machine-readable summary
A plain-text description of this site and these endpoints lives at /llms.txt, for agents that would rather not parse HTML.