Funds go direct to your wallet Zero custody risk Sign in with your signature Reorg protection built in Webhook on every payment Verify your addresses yourself Works with any website No third parties, ever Funds go direct to your wallet Zero custody risk Sign in with your signature Reorg protection built in Webhook on every payment Verify your addresses yourself Works with any website No third parties, ever
$ start_trial --days 7 --cost 0 run it →

Accept Bitcoin.
Own every sat.

BoreLine Pay is fully non-custodial. We never hold, touch, or move your money. Invoices derive straight from your own cold wallet ZPUB, so every payment goes from your customer to your wallet, on chain, with no middleman.

No card. No payment. Just your ZPUB. Pick a plan later from your dashboard.
0 Third parties
0 Code, share a link
1 API call to automate
Two ways to get paid: share a ready made payment link with no code, or call one API endpoint from your own checkout.
POST /api/invoice
// Your checkout sends one request
 
curl -X POST https://api.borelinepay.uk/api/invoice
  -H "X-API-Key: sk_live_••••••••••"
  -d '{"email":"alice@example.com",
      "tier":"pro","months":1}'
 
// BoreLine Pay responds instantly
 
{
  "invoice_url": "https://api.borelinepay.uk/pay/INV-...",
  "btc_address": "bc1qxy2kgdygjrsqtzq...",
  "btc_amount": 0.00045210,
  "status": "pending"
}
 
// Payment confirmed → webhook fires
✓ POST https://yoursite.com/webhooks/payment
✓ Customer access granted

Four steps.
Fully automatic.

From registering your public key to a confirmed payment in your own wallet. No email, no passwords, no third-party custody, ever.

Whitepaper
Want the full picture before you start?
The complete model, security architecture, and trust assumptions, in plain language.
Read the whitepaper →
01

Request access

Choose a username and share your watch only ZPUB, the public key that can receive but never spend. Prove the ZPUB is yours with a one time message signature. No funds move, your seed never leaves your hardware device.

02

Confirm and set up

Check your derived addresses against your hardware wallet and sign once to unlock invoicing. Then define your products and share a no code link, or call the API from your own checkout.

03

We watch the chain

BoreLine Pay polls mempool.space every 60 seconds. When payment appears with sufficient confirmations, it triggers automatically.

04

You get paid

The payment lands in your wallet and shows in your dashboard. If you set a webhook, we also POST a signed alert so your site can grant access or mark the order paid automatically.

Built for businesses
that take Bitcoin seriously.

Zero custody

Invoices derive fresh addresses directly from your ZPUB. Funds land in your hardware wallet the moment they're sent. We never hold, route, or touch your Bitcoin.

No code or one API call

Sell with zero code by sharing a payment link, one per product, or create invoices programmatically with a single POST request that returns the address, exact amount, and a hosted payment page. No SDK, plain HTTP.

Instant payment alerts

The moment a payment confirms on chain, BoreLine notifies your website automatically so it can unlock the order or grant access. Each alert is cryptographically signed, so your site knows it truly came from us. You never poll or check manually, and a payment is never missed.

Your products, your prices

Define your products in the dashboard, each with a name and a price in your chosen currency, from three on Starter up to thirty on Business and unlimited on Enterprise. Your checkout picks the product and the duration per sale, so the same product works for a single purchase or several months at once.

Merchant dashboard

Real-time invoice tracking, payment history, revenue stats, and ready-to-paste integration code. All in a clean dashboard you log into from any browser.

Works with anything

Plain HTTP API means it integrates with any stack. React, WordPress, Shopify, custom Python, whatever you run. If it can make a POST request, it works.

Built to be audited

There are no passwords to leak, you log in by signing a message with your hardware device. API keys are stored only as SHA-256 hashes, never in plaintext. We keep a SHA-256 fingerprint of your ZPUB and check it before deriving any address, so if the stored key were ever altered, the server refuses to derive, locks the account, and alerts us at once. Every ZPUB change is logged and alerts you. Address derivation is atomic, so reused addresses and race conditions are impossible by design.

Reorg protection

Confirmed payments are re-verified for 6 blocks after confirmation. If a blockchain reorganisation removes the confirming block, access is automatically revoked, you are alerted, and the invoice returns to pending. No other simple payment tool handles this.

No custodial accounts

Unlike Coinbase Commerce, there is no account holding your funds for anyone to freeze. Every payment goes straight from your customer to your own wallet on chain. You register only a watch only ZPUB that can receive but never spend, your seed never leaves your hardware wallet, and only you can ever move your money.

Late payment recovery

If a customer's transaction arrives after the invoice expired, we keep watching the address and catch it. You get an alert with the details so you can honour the order or refund. No more silent payments that slip through during network congestion.

Verify before you sell

Before any invoice can be created, you compare the derived addresses against your hardware wallet and sign once to confirm them. This catches a wrong key at setup, so you never accept a payment to an address you do not control.

Custom amounts and shipping

Charge a one off custom amount straight from the dashboard, no code needed. Selling physical goods? Turn on shipping collection per product to capture the buyer's name, address, and contact at checkout, delivered to you and auto deleted after the retention window. This works the same whether you share a no code link or create the invoice through the API, as long as you send the buyer to the hosted payment page.

Read the whitepaper
Understand exactly how it works, before you trust it.
The full technical and security model in plain language: BIP84 derivation, the non-custodial architecture, the trust model, honest limitations, and the roadmap. Everything you need to evaluate BoreLine on your own terms.
Read whitepaper or download the PDF ↓

Two ways to get paid.
Pick what fits.

The easy way needs no code at all: share a payment link, one per product. The developer way uses the API for a custom checkout and automatic fulfilment. Most sellers start with links and never need more.

  • Every product gets its own payment link, share it anywhere
  • No code and no API key needed to start taking payments
  • Charge a custom one off amount straight from the dashboard
  • Or use the API for a custom checkout and automatic fulfilment
  • Replay-protected signed webhooks on every payment
  • Blockchain reorg detection built in
Start with a link Read the integration guide
7 DAYS FREE Want to try it first? Start free, no payment, and explore both paths with full Starter features.
For developers · the API
JAVASCRIPT
// Add to your checkout button handler

async function payWithBitcoin(email, tier, telegram = '') {
  const res = await fetch('https://api.borelinepay.uk/api/invoice', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': YOUR_API_KEY
    },
    body: JSON.stringify({ email, tier, months: 1, telegram })
  });

  const { invoice_url, amount_sats } = await res.json();
  window.location.href = invoice_url;
}
GENESIS BLOCK · 03 JAN 2009 BLOCK 0
// Satoshi's message in Bitcoin's first block

"The Times 03/Jan/2009 Chancellor on
brink of second bailout for banks"
Which path is right for me?
Use a link if
  • You sell fixed price products or plans
  • You need a one off custom amount, no code, from the dashboard
  • You want to start today with no developer
  • You will share on a button, bio, email, or chat
Use the API if
  • You want payments inside your own checkout
  • You want orders fulfilled automatically on payment
  • Your prices are worked out per order, like a cart total
  • You have a developer or a backend already

You can use both, and you can switch anytime. Nothing locks you in.

Flat pricing.
No transaction fees.

No percentage cuts, no surprise charges. One flat monthly rate, pick your plan, and keep every satoshi you earn.

LIVE NETWORK
... $ ... £ ... CHF ... BLOCK sat/vB
fetching...
Starter
29
... sats
per month
For freelancers and solo operators accepting Bitcoin for the first time.
  • Up to 3 product tiers
  • No code payment links, one per product
  • Hosted invoice pages
  • Webhook delivery
  • Invoice dashboard
  • Set your product prices in any currency
Get started
Most popular
Pro
49
... sats
per month
For online businesses with active customer bases and subscription products.
  • Up to 15 product tiers
  • No code payment links, one per product
  • Hosted invoice pages
  • Webhook delivery
  • Invoice dashboard
  • Set your product prices in any currency
Get Pro access
Business
99
... sats
per month
For teams and high volume operations that need multiple API keys and advanced controls.
  • Everything in Pro
  • Up to 30 product tiers
  • Multiple API keys for your team and sites
  • Higher invoice rate limits
Get Business access
PAID IN BITCOIN NO CREDIT CARDS CANCEL ANYTIME ZERO TRANSACTION FEES

Frequently asked.

Do you ever hold my Bitcoin?

Never. BoreLine Pay derives receiving addresses directly from your ZPUB, a view-only public key. Payments go straight from the sender to your hardware wallet. We have no ability to move your funds under any circumstances.

What's a ZPUB and how do I get it?

A ZPUB (or XPUB) is a view-only public key from your hardware wallet. It lets us generate unique receive addresses without any ability to spend. In Trezor Suite: Accounts → Show public key. In Ledger Live: Accounts → Edit → Advanced. In Sparrow: Master Public Keys section.

Should I use my main wallet for this?

No. Set up a fresh hardware wallet just for your business, kept completely separate from any wallet holding your savings, treasury, or investments. Your business wallet's addresses are shared publicly on every invoice and it sees high transaction volume. Keeping it separate protects the privacy and security of the funds you want to keep safe. A new hardware wallet costs little and is the single best practice you can follow here.

What happens if a payment is underpaid?

Invoices require the exact BTC amount or more to confirm. If a customer sends less, the invoice stays pending until it expires. Each address is unique per invoice so there's no confusion between payments.

What if a customer pays after the invoice expires?

We have you covered. Invoices stay open for 6 hours by default, but if a payment still arrives late, for example during heavy network congestion, BoreLine keeps watching the address for several days afterward. If the funds land, you get an alert with the invoice details so you can honour the order or refund the customer. The money is in your wallet either way, and nothing slips through silently.

How long does payment confirmation take?

One on-chain confirmation takes roughly 10 minutes. Once confirmed, BoreLine Pay continues monitoring the payment for 6 more blocks to detect blockchain reorganisations. If a reorg removes the confirming block, access is automatically revoked and you are alerted. No other simple payment tool handles this.

What if my webhook fails?

If your website is temporarily down, the payment is still recorded and the webhook retries automatically on the next monitor cycle. Every confirmed payment in your dashboard shows delivery status. No payment is ever silently lost.

Can I verify the addresses are really mine?

Yes. Your dashboard has a Verify page that shows the derivation path, a SHA-256 fingerprint of your registered ZPUB, and the first derived addresses. Compare them against your Trezor, Ledger, or Sparrow wallet. If they match, you do not have to trust us. You can see it yourself.

Can I change my registered ZPUB later?

Yes, and it is deliberately protected. Changing your registered ZPUB takes two signatures, one from your current hardware device to authorise it and one from the new device to prove you own it, followed by a 48 hour security hold you can cancel any time. Your old key keeps receiving the whole time, and payments only switch once the hold completes. Even someone who got into your account cannot reroute your money without your physical current hardware device.

Do you take a percentage of my sales?

Never. BoreLine Pay charges a flat monthly subscription fee. We take nothing from your transactions. Whether you process one invoice or ten thousand in a month, your fee is the same. Every satoshi your customer pays goes directly to your wallet.

Can I use this with WordPress, Shopify or Ghost?

Yes. The simplest way needs no code at all: share a payment link, one per product, on a button, in an email, or in your bio. For automatic order fulfilment or a custom checkout, use the API, your Integrate page includes copy-paste snippets for JavaScript, Python, and PHP that work with any platform that can make an HTTP request or run custom code.

How do I pay my monthly fee?

You pay in Bitcoin, of course. Your subscription renews monthly at a flat rate with zero transaction fees on top. There are no percentage cuts, no hidden charges, and no surprises. You always know exactly what you owe, and every satoshi your customers pay goes straight to your wallet.

Found a bug or security issue?

Please tell us. Responsible disclosure is genuinely welcome. If you spot a bug, a vulnerability, or anything that looks off, email borelineapp@proton.me. If you suspect a security issue, please report it privately first and give us a chance to fix it before disclosing it publicly. We will never ask for your seed phrase or private keys.

Want the full technical picture? Read the BoreLine whitepaper, the complete architecture, security model, and roadmap.

Start accepting Bitcoin
in under an hour.

Sign a message to register your ZPUB, then define your products.
Share a payment link, no code needed, or paste one snippet for a custom checkout.
Your first invoice can be live before the hour is out.

Merchant Security Guide

Stay sovereign.
Stay safe.

Accepting Bitcoin means you are your own bank. That is the whole point, and it comes with responsibility. This guide covers everything you need to keep your funds, your privacy, and your business secure. Read it once, set things up properly, and you can operate with confidence.

01
Keep your business wallet separate

The single most important rule. Your business wallet and your savings should never be the same wallet.

Use a fresh hardware wallet for receiving payments
Buy a new hardware wallet dedicated only to your business. Never use the same wallet that holds your savings, treasury, or long-term investments. A new device costs little and is the foundation of everything else in this guide.
Sweep funds to cold storage regularly
Do not let large balances accumulate in your receiving wallet. When your business wallet builds up a meaningful amount, move the bulk of it to a separate cold storage wallet that has never been exposed publicly. Keep only what you need for operations in the business wallet. A wallet whose addresses are published on invoices should never hold your life savings.
Treat the business wallet as semi-public
Every invoice exposes a receiving address derived from your ZPUB. Anyone you transact with can observe those addresses. Assume your business wallet activity is visible and plan accordingly. The less it holds, the less anyone can learn about your finances.
02
Protect your seed phrase

Your seed phrase is the master key to your funds. Anyone who has it can take everything. Anyone who loses it loses everything.

Never type your seed phrase into anything connected to the internet
Not into a website, not into a chat, not into a notes app, not into a photo. Your seed phrase should only ever exist on paper or steel, generated and stored offline. BoreLine Pay will never ask for it. No legitimate service ever will.
Back it up on metal, not paper
Paper burns, fades, and gets water damaged. Stamp or engrave your seed phrase onto a steel backup plate and store it somewhere secure. Consider a second copy in a separate physical location in case of fire or theft.
Tell no one
Do not share your seed phrase with business partners, family, support staff, or anyone claiming to help. If someone needs access to business funds, set up a proper multi-signature arrangement instead of sharing a seed.
03
Guard your privacy

Bitcoin is transparent by design. Every transaction is public forever. A few habits keep your financial life private.

Understand that addresses link together
When you spend from multiple addresses in one transaction, you reveal that they belong to the same wallet. This is called common-input ownership. Be mindful when consolidating funds, since it links your receiving addresses together on the public ledger.
Move to private storage in deliberate steps
When sweeping business income to cold storage, send it to a fresh wallet that has no public association with your business. Avoid mixing business funds with personal funds in a way that links your identity to your savings.
Do not publicly tie your name to your business wallet
Avoid posting your business ZPUB or addresses anywhere that links them to your real identity. The more separation between your public business activity and your personal holdings, the safer you are.
04
Secure your operations

Your API key, your website backend, and your devices are part of your attack surface. Lock them down.

Protect your API key like a password
Your API key lets a website create invoices on your account. Store it as a server-side environment variable, never in client-side JavaScript, never committed to a public code repository, never pasted into a support chat. If it leaks, replace it immediately from your dashboard.
What happens if your API key leaks
Good news, your funds are never at risk from a leaked API key. The API key can only create invoices and read your basic profile. It cannot touch your wallet, change your ZPUB, redirect payments, or access any funds. Every payment address is derived from your registered ZPUB, which an API key cannot change. So even in the worst case, all customer payments still flow to your own wallet, never to an attacker. The only nuisance a leaked key allows is someone creating spam invoices on your account. The moment you suspect a leak, open your dashboard and generate a new key. The old one stops working instantly.
How to add your API key without exposing it
Your API key belongs on your website's backend, never in the browser. The rule is simple. Any code a visitor can view by opening their browser developer tools must never contain your API key. Here is how that looks on common setups. On a custom site, store the key as a server-side environment variable and call BoreLine Pay from your backend, never from front-end JavaScript. On Shopify, do not paste the key into theme files or script tags, since those are public. Instead use a small server-side app, a serverless function, or an approved app that holds the key on its own backend, and have your storefront call that. On WordPress or WooCommerce, store the key in wp-config.php or your plugin settings, which live on the backend, not in a page template. The principle never changes. The customer's browser asks your backend to create an invoice, and your backend, holding the key privately, talks to BoreLine Pay. The key never travels to the customer. You never run any Bitcoin server yourself. BoreLine is the payment server. Your backend only makes a single API call to us.
Always verify webhook signatures
Every payment webhook is signed and timestamped. Verify the signature and reject anything older than five minutes before granting access to a customer. This stops attackers from forging fake payment confirmations. Your Integrate page has the exact code.
Keep your devices clean
The device you use to access your dashboard and sign messages should be free of malware. Keep your operating system updated, avoid pirated software, and consider a dedicated device or browser profile for business operations.
Multiple API keys, if your plan includes them
On the Business plan you can create more than one API key, for example one per website or team member. Each key can be revoked on its own from the dashboard without affecting the others, so if one leaks you cut off just that key. Every key, no matter how many you hold, only ever creates payments to your one registered wallet. Keys can never point anywhere else, and creating or revoking them does not touch your wallet. Give each key a clear name so you know what it is for, and revoke any you no longer use.
Payment links are safe to share publicly
Your no code payment links are meant to be public. A link only does one thing, it opens a payment page for a product you defined, and that payment goes straight to your registered wallet. A link contains no API key, no wallet details, and no amount that anyone can tamper with. Even if someone copies or edits your link, they cannot redirect a payment, change your products, or reach your account. The worst anyone can do is pay you. The link is the safe, public front door, your API key is the private back door, never mix the two.
05
Recognise scams

Most losses in Bitcoin come from social engineering, not broken cryptography. Know the patterns.

Anyone asking for your seed phrase is a scammer
There are zero exceptions. Not support, not an admin, not a security alert, not a wallet upgrade. The instant anyone asks for your seed phrase or private key, you know it is an attack. Walk away.
Verify who you are talking to
Scammers impersonate support staff on messaging apps and social media. BoreLine Pay only ever provides support by email, and we will never message you first asking you to take urgent action with your wallet. If someone contacts you claiming to be BoreLine Pay support and creates pressure or urgency, stop and verify through official channels.
Check every link and address twice
Fake websites and clipboard-hijacking malware can swap addresses. Always confirm you are on the correct domain before signing in. When verifying your receiving addresses, compare them directly against your hardware wallet screen, which is the one display an attacker cannot fake.
06
Your account login

BoreLine Pay uses your Bitcoin wallet as your login. This is stronger than any password, but understand how it works.

Signing in is a signature, not a password
There is no password to steal. To sign in, you sign a one-time message with your hardware device, a bit like a fingerprint that proves the device is really yours. This never reveals your private key or seed phrase, and you never type or share them. Even if someone knows your username, they cannot reach your account without your physical hardware device. Once signed in, your dashboard session stays active across page refreshes for up to one hour of inactivity, then asks you to sign in again. Keep your hardware device safe and your account is safe.
ZPUB changes are protected by a 48 hour hold
Changing your registered ZPUB takes two separate signatures, one from your current hardware device to authorize the change and one from the new device to prove you own it. After both are verified, the change is still held for 48 hours before taking effect, and you can cancel instantly during that window. Even someone inside your account cannot reroute your payments without your physical current device. This gives you both a hard cryptographic gate and time to react.
Your username is just a label, not a secret
Your username is only how you find your account at sign in. It is not a secret and it cannot be used to access anything on its own. There is no password tied to it. Even if someone knows your username, they cannot sign in, change your ZPUB, or touch your funds without a signature from your physical hardware device. The thing to protect is your hardware device and its seed phrase, not your username.
07
What happens if something leaks

Security is about layers. Here is exactly what an attacker can and cannot do in each scenario, so you understand how protected you really are.

If your ZPUB leaks on its own
A ZPUB is view-only. Someone who has it can see your receiving addresses, your transaction history, and your balance for that wallet. They cannot spend your funds, cannot sign in, and cannot change anything. A leaked ZPUB is a privacy concern, not a theft risk. This is exactly why we recommend a separate business wallet and regular sweeping. The less it holds, the less anyone learns.
If someone learns your username
Your username alone gives an attacker nothing of value here. They still cannot sign into your dashboard, because signing in requires a signature from your physical hardware device. They cannot start a ZPUB change either, because that can only be initiated from inside an authenticated dashboard session, and it then needs a signature from your current hardware device. Your funds and your account stay out of reach.
If your ZPUB leaks and your username is known
Even in this worst case, your funds stay safe. An attacker holding both still cannot sign into your dashboard, because that requires a signature from your hardware device. And even if they somehow reached an open session, they still cannot change your registered ZPUB, because a change now demands a fresh signature from your current hardware device to authorize it, then a signature from the new device, then a 48 hour hold. Without your physical device, the key can never be rerouted. The one thing you must always keep safe is your hardware device and its seed phrase.
How a ZPUB change actually works
Changing your registered ZPUB is a deliberate, multi-step process designed so no single point of failure can move your funds. It takes two separate signatures, not just one. First, you authorize the change by signing a unique challenge with your current hardware device, proving the request comes from the real owner who still holds the existing ZPUB. This step is what stops a stolen login session, a hijacked cookie, or anyone inside your account from rerouting your funds, because without your current physical device the change cannot even begin. Second, using your new hardware device, you sign a fresh unique message to prove you control the new ZPUB too. Once both signatures are verified, a 48 hour security embargo begins. Throughout the entire embargo your current ZPUB stays fully active, so you keep receiving payments without any interruption, and you can cancel at any point during the hold. When the 48 hours complete, the new ZPUB takes the place of the old one, and from that moment your payments arrive at addresses from your new ZPUB. Logging in is a separate signature from authorizing a change, so even an attacker sitting in an open session still cannot reroute your payments without your current device in hand.
7 DAYS FREE Don't trust us. Verify us.

The best way to be sure about how BoreLine works is to test it yourself, with nothing at stake. Use the 7-day free trial to do exactly that:

  1. Register a fresh ZPUB from a brand new wallet that holds zero funds.
  2. Open the Verify page and check the derived addresses against your wallet, then approve them.
  3. Create an invoice for a tiny amount, 5 dollars for example.
  4. Pay that invoice yourself and watch exactly where the money lands. It goes straight to your wallet.
  5. Repeat as many times as you like. Wait for each payment to confirm in your own wallet before the next.

You never have to trust us, and you can check everything for as long as you want. The flow never changes, it is hard coded. Once you have seen it work with your own eyes and your own coins, you can register your real business wallet with confidence.

Your security checklist
Fresh hardware wallet dedicated only to the business
Seed phrase backed up on metal, stored offline, shared with no one
Large balances swept to separate cold storage regularly
API key stored server-side, never exposed publicly
Webhook signatures verified before granting access
Receiving addresses verified against the hardware wallet screen
Confident that no one will ever get your seed phrase
Found a bug or security issue?

Responsible disclosure is genuinely welcome. If you find a bug, a vulnerability, or anything that looks off, please email borelineapp@proton.me. For a suspected security issue, report it privately first and give us a chance to fix it before it goes public. BoreLine Pay will never ask for your seed phrase or private keys, and neither will anyone legitimate.

Set up properly once, and you can run your Bitcoin business with total peace of mind.

See plans and pricing
Merchant Guide

Accept Bitcoin,
your way.

There are two ways to take payments with BoreLine. The easy way needs no code at all, you share a payment link. The developer way uses our API for full control and automation. Most people start with links and never need more. Pick whichever fits you, you can always switch later.

7 DAYS FREE New to BoreLine? Start a free trial with a fresh empty wallet, create a small test invoice, pay it yourself, and watch the money land in your own wallet before you commit a cent.
THE EASY WAY · NO CODE
Share a payment link

If you can copy and paste a link, you can accept Bitcoin. No coding, no API key, nothing to install. This is the right path for most sellers.

Set up your account once
Register your ZPUB and define your products in the dashboard, each with a name and price. You do this one time. See the Security Guide for how registering your ZPUB keeps your funds fully in your control.
Copy your payment links
Open the Integrate page in your dashboard. Each product has its own ready made payment link. Copy the one you want. There is nothing to configure.
Share it anywhere
Put the link on a button, in an email, in your social bio, or send it in a message. When someone opens it, they see a Bitcoin payment page with the amount and a QR code. They pay from any wallet, and the money lands directly in yours. You can watch every payment confirm in your dashboard.
That is the whole flow
No backend, no API key to protect, no code to write. The link is safe to share publicly, it can only ever create a payment to your own wallet for the product you chose. If you only need to get paid and see it confirmed, you are done here. Read on only if you want automatic order fulfilment or a custom checkout.
Selling physical goods? Collect shipping details
For any product, you can tick Ship in your dashboard to ask the buyer for their name, address, and contact at checkout. Those details appear against the paid order in your dashboard and in your webhook, so you know who to ship to. You are the data controller for that information, BoreLine only stores it to pass to you and automatically deletes it after 90 days. Leave the tick off for digital products and nothing personal is collected.
THE DEVELOPER WAY · API
Integrate with code

Use the API when you want payments built into your own checkout, or you want your site to automatically unlock an order, grant access, or send a download the moment a payment confirms. This path needs a developer and a backend. Everything below is the developer way.

THE BIG PICTURE
Three moving parts

Before the steps, here is the whole flow in one breath, so the rest makes sense.

Your button
A button you design and place on your own site. When a customer clicks it, your site sends one request to BoreLine. You control its look, text, and position completely.
The invoice request
Your site asks BoreLine to create an invoice, sending which product was bought. You can optionally include the customer's email or your own order id as a reference. BoreLine replies with a payment page link. Your site sends the customer to that link.
The confirmation
The customer pays on the hosted page. The moment it confirms on chain, BoreLine alerts your site so you can unlock the order or grant access. The Bitcoin goes directly to your wallet, never through us.
Shipping collection works on the API path too, automatically
You do not have to build shipping or contact collection yourself. The API returns an invoice_url, the same hosted payment page the no code links use. If you send the customer to that invoice_url and the product has Ship ticked in your dashboard, the buyer is asked for their name, address, and contact before paying, exactly like the no code path. Those details arrive in your dashboard and in your webhook, so you know who to ship to, with no extra code on your side. The only time you collect details yourself is if you choose not to use our hosted page and instead build your own payment screen from the raw btc_address and amount we also return. In that fully custom case, our shipping form never appears, so you would gather any details in your own checkout. For almost everyone, redirecting to invoice_url is the simplest path and keeps shipping collection for free.
STEP 1
Build your own button

There is no BoreLine button to embed. Use any button that fits your design. It just needs to run a little code when clicked.

There is no BoreLine button to embed, you use your own. If you just want one that looks good and works, copy the ready made button below. It runs payWithBitcoin() when clicked, which you will set up in the next step.
Live preview
Copy this
<button class="btc-pay-btn" onclick="payWithBitcoin()">
  ₿ Pay with Bitcoin
</button>

<style>
.btc-pay-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: #F0B429;
  color: #0a0a0a;
  font-family: inherit;
  font-size: 15px;
  font-weight: 600;
  border: none;
  border-radius: 8px;
  padding: 14px 28px;
  cursor: pointer;
  transition: transform .15s, box-shadow .15s;
  box-shadow: 0 4px 14px rgba(240,180,41,.25);
}
.btc-pay-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px rgba(240,180,41,.4);
}
</style>
Paste it into your page, change the colours to match your brand if you like, and you are done with the button. The next step is what payWithBitcoin does when it is clicked.
Prefer no code at all? You do not need a button or any of these steps. Just use your product's payment link from the Integrate page, paste it as a normal link on any button your site builder gives you. The steps below are only for a custom coded checkout.
STEP 2
Ask BoreLine to create an invoice

When the button is clicked, your website sends one request to BoreLine with your API key. This call must happen on your website's backend, never in the browser.

Backend only. Never put your API key in front end code.
Your API key is a secret. It must live and be used only on your server, the private side of your site. Never paste it into browser JavaScript, a React or Vue app, a mobile app, an HTML page, or anything a visitor can open and inspect. Anything shipped to the browser can be read by anyone, and a leaked key lets a stranger create invoices on your account. The flow is always: your button calls your own backend, your backend holds the key and calls BoreLine, then returns only the payment link to the browser. If you cannot run a backend, do not use the API, use the no code payment link instead, it is safe to expose because it carries no secret.
Your ZPUB stays with us, handled with care, and off your pages
Your ZPUB is watch only, it can generate receiving addresses but can never spend your funds, so even in the worst case no money is at risk. You register it once and we derive every invoice address from it on our server. We also keep a SHA-256 fingerprint of it and check that the stored ZPUB still matches that fingerprint before deriving any address, so if the ZPUB were ever tampered with in our database, the server refuses to derive, locks the account, and alerts us immediately, no payment could be routed to an altered key. You can verify the same fingerprint yourself at any time on the Verify page. Because it is only a public key, registering it is not handing over custody, your private keys and seed never leave your hardware wallet and we never see them. You also never need to put your ZPUB into your website, app, or checkout code, that work lives entirely on our side. Keeping it out of your front end protects your privacy too, since publishing it would link all your addresses together.
Send a request to https://api.borelinepay.uk/api/invoice with your API key in the header and the order details in the body.
POST https://api.borelinepay.uk/api/invoice
Header:  X-API-Key: your_secret_api_key
Body (JSON):
{
  "email": "customer@example.com",
  "tier":  "starter",
  "months": 1
}
tier is the product key you set in your dashboard, for example starter or pro, this is the only required field. email is optional, just a label so you can tie the payment to a customer or order on your side, BoreLine never emails anyone. months is optional and defaults to 1, useful if you sell access in multiples. You can also send an optional note or a metadata object to carry your own order id.
STEP 3
Send the customer to the payment page

BoreLine replies with everything you need. The one field that matters most is the payment page link.

The reply looks like this.
{
  "invoice_url": "https://api.borelinepay.uk/pay/INV-...",
  "amount_sats": 51275,
  "fiat_amount": 29.00,
  "currency":    "EUR",
  "expires_at":  "2026-06-17T12:00:00Z"
}
Redirect the customer to invoice_url. That hosted page shows the amount, a QR code, and a Bitcoin address. The customer pays from any wallet. You build nothing for this page, it is fully handled for you.
STEP 4
Get told when payment confirms

You should not make customers wait while you watch the blockchain. Instead, give BoreLine a webhook URL in your dashboard settings, and we alert your site automatically the moment payment confirms.

How the alert works
When a payment confirms on chain, BoreLine sends a message to your webhook URL containing the product, the invoice id, and any reference you attached such as an email or order id. Your site reacts however you need, marking the order paid, sending a download link, or granting account access. If a payment is ever reversed by a rare blockchain reorganisation, you get a second alert so you can undo access. Each alert is cryptographically signed so your site can confirm it truly came from BoreLine and not an impostor.
No webhook? You are still covered
Every payment also appears in your dashboard, and the payment page itself updates the customer live. The webhook simply automates fulfilment. If your site is briefly down when an alert is sent, BoreLine retries automatically, so nothing is lost.
PLATFORMS
Where your API key goes

You do not need to run a server. The only rule is that your API key stays in the private side of whatever platform you already use, the part a customer cannot see by opening their browser tools. Every platform below already has that private side. Here is exactly where to put the key and what calls what, in each case.

First, what "private side" means
Your website has two parts. The public part is everything a visitor can see or inspect, your pages, your theme, your JavaScript. The private part is where your platform runs its own logic out of sight, WordPress calls it PHP, hosted platforms call it a function or an app. Your API key must live in the private part and the call to BoreLine must happen there. You are not setting up new infrastructure, you are using the private side your platform already gives you.
Custom built website
If you or a developer built your site, you already have a backend, the code that runs on your host rather than in the browser.

1. Save your API key as an environment variable on your host, for example BORELINE_KEY, so it never appears in your page code.
2. Add one small route on your backend, for example /create-invoice, that reads the API key, calls the BoreLine invoice endpoint, and returns the payment link.
3. Your pay button calls your own /create-invoice route, then sends the customer to the payment link it gets back.

The customer's browser never sees the key. It only ever talks to your own route.
Shopify
Shopify theme files are public, so the key cannot go there. Shopify gives you a private side in two common ways, pick whichever fits.

Option A, a serverless function. Use a free function host such as Cloudflare Workers, Vercel, or Netlify Functions. Store the key there, have the function call BoreLine and return the payment link, and point your storefront button at that function.
Option B, a small private app. If you already run any external service for your store, hold the key there and let it create the invoice.

Either way, your storefront button sends the order details to your function or app, never directly to BoreLine, and then redirects the customer to the returned payment link.
WordPress or WooCommerce
WordPress already runs private code in PHP, so you do not need anything extra.

1. Put your API key in wp-config.php as a constant, or in the settings of a small custom plugin. Both run privately on your host, not in the visitor's browser.
2. Add a short PHP function, hooked to your checkout or a button, that reads the key and calls the BoreLine invoice endpoint using WordPress's built in request function.
3. Take the payment link it returns and redirect the customer to it.

Nothing here lives in a page template or theme file, so the key stays private.
No backend at all? Static site or link in bio
If your whole presence is a static page or a link in bio with no private side anywhere, you cannot safely hold an API key. Use a free function host such as Cloudflare Workers or Netlify Functions as a tiny middle layer, the same as Shopify Option A. It takes minutes to set up and is free at your volume. If that is not an option, talk to us and we will help you find the simplest path for your setup.
Go live checklist
Registered your ZPUB and confirmed a derived address matches your hardware wallet
Defined your products in the dashboard and noted their tier keys
Copied your API key and stored it on your backend, never in the browser
Your button calls your backend, which calls the invoice endpoint
You redirect the customer to the returned payment link
Set a webhook URL so fulfilment happens automatically
Tested with one small real payment from end to end

Once your products are set and your button calls the endpoint, your first invoice is live in minutes.

See plans and pricing
Whitepaper

Non-Custodial Bitcoin
Payment Infrastructure

Version 1.0 · June 2026 · BoreLine Pay, Germany, Europe

↓ Download PDF Start 7-day free trial See plans →

0Abstract

BoreLine Pay is non-custodial Bitcoin payment infrastructure. A merchant accepts Bitcoin payments that settle directly to an account only the merchant holds the keys to, while BoreLine never holds, touches, or is able to move the funds at any point.

Conventional payment processors stand between a merchant and their revenue. They hold balances, take a percentage of every transaction, and retain the power to freeze, reverse, or withhold settlement. BoreLine removes that intermediary by design. A merchant registers the extended public key, known as a ZPUB, of the native SegWit account on their own hardware signing device. From that key alone, BoreLine derives a unique Bitcoin address for each invoice, observes the public blockchain for payment, and notifies the merchant when funds confirm. The value never passes through BoreLine. It cannot, as a structural property of the system rather than a matter of policy.

This document sets out the model, the technical architecture, the security and trust assumptions, and the explicit limitations of the system, so that a technically literate reader can evaluate the claims and verify them independently.

1The problem with custodial settlement

When a merchant accepts Bitcoin through a conventional processor, the Bitcoin does not arrive at the merchant. It arrives at the processor, who records a balance and settles later, often subject to fees, delays, and conditions. This reintroduces the very problems Bitcoin was created to remove:

For a merchant who adopted Bitcoin precisely for its self-sovereign properties, routing revenue through a custodian defeats the purpose.

2The BoreLine model

BoreLine is built on a single principle: the operator must never be able to reach merchant funds. This is not a promise to behave well. It is a structural consequence of how the system is constructed.

A merchant registers only a ZPUB, the extended public key of the native SegWit account on their hardware signing device. A ZPUB is a public key. It can derive receiving addresses and observe balances, but it carries no spending authority of any kind. The private keys that authorise spending never leave the merchant's signing device and are never transmitted to or seen by BoreLine.

When a customer pays, the transaction is broadcast to the Bitcoin network and arrives at an address derived from the merchant's own key. BoreLine learns that this happened by reading the public blockchain. At no point does value flow through, or rest in, anything BoreLine controls. The merchant receives every satoshi the customer sends, directly, on chain.

The core guarantee. BoreLine derives addresses and observes the chain for payment. It holds no private keys, takes no custody, and has no mechanism to move, freeze, or reverse a single satoshi. Merchant funds are always, and only, under the merchant's own keys.

How a payment flows

The diagram below shows the path of a single payment. The funds move directly from the customer to the merchant's own account on the Bitcoin network. BoreLine sits to the side, deriving addresses from the public key and observing the chain, never on the path the money takes.

BoreLine Pay Derives addresses from ZPUB Observes the chain, holds nothing Merchant Hardware signing device Holds the private keys Funds arrive here, on chain Customer Pays the invoice in Bitcoin to the derived address 1 · Registers ZPUB (public key only) 2 · Unique address per invoice 3 · Bitcoin, direct on chain 4 · Observes only notifies, never touches The money line (green) never passes through BoreLine. BoreLine only reads the public chain.

3Technical architecture

3.1 Address derivation (BIP84)

BoreLine follows the BIP84 standard for native SegWit pay-to-witness-public-key-hash addresses, the modern bc1q format. From the registered ZPUB at derivation path m/84'/0'/0', BoreLine derives external-chain receiving addresses at successive indexes, m/0/0, m/0/1, m/0/2, and onward. Each invoice is assigned its own freshly derived address, so payments never collide and each is tracked independently.

3.2 A unique address for every invoice

Address reuse harms privacy and complicates accounting. BoreLine derives a new address for each invoice and enforces non-reuse at the database level. There is no practical ceiling. Derivation behaves identically at index five or index five million, so a heavily used account is never a constraint.

3.3 On-chain monitoring

BoreLine observes each invoice address for incoming transactions by querying public blockchain data. A payment is recognised only when a transaction of sufficient value arrives after the invoice was created. A historical balance on a previously used address can never be mistaken for a new payment. This is an important correctness property that prevents a stale transaction from falsely marking an invoice as paid.

3.4 Confirmation and reorganisation handling

An invoice is marked confirmed once the payment receives its first on-chain confirmation. BoreLine continues to observe for several further blocks to detect a chain reorganisation. If a reorganisation removes the confirming block, the merchant is alerted and any access granted on the strength of that payment can be revoked. This is a safeguard that simpler tools omit.

4Security architecture

4.1 What is stored, and what is never seen

Stored, and harmless
  • The registered ZPUB, a public key
  • A SHA-256 fingerprint of the ZPUB for tamper detection
  • Invoice records and derived addresses
  • API keys, stored only as SHA-256 hashes
Never stored, never seen
  • The recovery phrase
  • Private keys
  • Any spending authority
  • Customer card or bank details, of which there are none

Everything under Stored, and harmless is public or one-way hashed. None of it can move a single satoshi.

The ZPUB is retained so that addresses can be derived server side. It is a public key. Possessing it reveals a merchant's addresses and balances, but confers no ability to spend. An exposed ZPUB is therefore a privacy consideration, not a theft risk, which is why BoreLine recommends a dedicated business account and regular sweeping of received funds into cold storage.

The fingerprint is enforced, not merely available. Before deriving any payment address, the server recomputes the SHA-256 of the stored ZPUB and compares it to the stored fingerprint. If the two ever diverge, the telltale sign of the ZPUB having been altered outside the signed change flow, for example by direct tampering with the database, the server refuses to derive, locks the account, and raises an alert. No payment can be routed to a substituted key, because a key that fails this check is never used. The merchant can verify the same fingerprint independently at any time.

4.2 Authentication without passwords

There are no passwords to be leaked. A merchant authenticates by signing a challenge message with their key, cryptographically proving control of the registered account. API keys are stored only as SHA-256 hashes and are shown in full only once, at the moment of creation.

Because the key itself is never retained, it can never be shown again or recovered. This is deliberate. A database that only holds hashes cannot leak usable keys. If a merchant loses a key, the answer is not recovery but replacement: they generate a fresh key, and the lost one stops working at once. Every key action, rotating all keys, revoking a single key, or replacing one key in place, requires a fresh signature from the registered hardware device. A merchant on a plan with several active keys can replace a single lost key without disturbing the others, so one compromised integration never forces the rest to be rebuilt.

4.3 Protected key changes

Changing the registered ZPUB is a sensitive operation and is deliberately resistant to abuse. It requires two signatures, one from the current hardware device authorising the change and one from the incoming device proving control of the new ZPUB, followed by a security hold during which the previous ZPUB continues to receive. An attacker who compromised a merchant's session alone could not silently redirect funds, because the merchant's physical signing device is still required.

4.4 Operational hardening

The server employs atomic writes, an append-only audit log, rate limiting, login lockouts, threading locks for safe concurrency, and standard HTTP security headers. Administrative access is gated and can be restricted to an explicit IP allowlist.

4.5 Scoped read-only access

A merchant often wants to glance at payments from a phone without carrying out any sensitive action. For this, BoreLine issues a separate class of access token, created only from an already authenticated session, that grants read-only visibility and nothing more. A paired device can see invoices, balances, payment history, and the ZPUB fingerprint, but it can never change settings, rotate or reveal an API key, alter the registered ZPUB, or move funds. Those actions remain gated behind a hardware signature.

The distinction is enforced on the server, not merely hidden in the interface. A read-only token is presented in its own request header and can reach only a fixed set of read endpoints; it is structurally incapable of authenticating any operation that changes state. Each pairing carries an expiry and can be revoked at any time from the desktop dashboard, and rotating the registered ZPUB revokes every paired device automatically. A leaked read-only token therefore exposes only the ability to look, never to touch.

5The trust model: do not trust, verify

BoreLine does not ask to be trusted. The system is designed so that every claim in this document can be confirmed by the merchant, independently, before any real money is involved.

Each account includes a verification view showing the derivation path, the SHA-256 fingerprint of the registered ZPUB, and the derived addresses. The merchant compares these against the same key in their own software, whether Trezor Suite, Ledger Live, Sparrow, or any BIP84-compatible tool. If the addresses match, the merchant has proven, without trusting BoreLine, that payments will arrive at their account and nowhere else.

Verify with a free trial, with nothing at stake. Register a fresh ZPUB from a newly created account that holds no funds. Check the derived addresses against your own software and approve them. Create a small invoice, for example five dollars. Pay it yourself and observe exactly where the funds arrive, in your own account. Repeat as many times as you wish, waiting for each payment to confirm. The flow does not change, because it is fixed in code. Only once you have seen it work with your own coins do you register the key for your real business account.

6Payment lifecycle

  1. Invoice created. A unique address is derived from the merchant's ZPUB and assigned to the invoice, together with an amount and an expiry window.
  2. Customer pays. The customer sends Bitcoin to that address, and the transaction is broadcast to the network.
  3. Detection. BoreLine observes the incoming transaction on chain, requiring the full amount or more and a timestamp later than the invoice creation time.
  4. Confirmation. On the first confirmation the invoice is marked paid and the merchant's site is notified through its webhook. Observation continues to guard against a reorganisation.
  5. Late payments. If a payment arrives after expiry, for instance during network congestion, BoreLine keeps observing the address for a grace period and alerts the merchant if funds arrive, so that nothing is silently lost.

Integration is flexible. A merchant can share a no-code hosted payment link, one for each product, or call a single API endpoint for a custom checkout with automatic fulfilment by way of a signed webhook.

7Pricing philosophy

BoreLine charges a flat monthly subscription, paid in Bitcoin. It takes no percentage of any transaction. Whether a merchant settles one invoice or ten thousand in a month, the fee is identical, because the cost of deriving an address and observing the chain does not scale with the value being moved.

This aligns incentives honestly. A percentage-based processor earns more as the merchant grows, extracting rent from that growth. A flat fee charges for the service actually rendered. Every satoshi a customer pays reaches the merchant, and the subscription is the merchant's only cost, known in advance.

A new merchant can begin with a seven-day free trial that carries the full Starter feature set with no payment, then select any plan from the dashboard when ready.

8Limitations and honest disclosures

A credible whitepaper states what a system is not, as plainly as what it is.

9Roadmap

BoreLine's direction follows its founding constraint: strengthen self-sovereignty without ever introducing custody. Planned and exploratory directions include the following.

AreaDirection
Nostr integrationOptional, opt-in payment notifications and a decentralised coordination channel, reducing reliance on any single messaging platform.
Encryption at restEncrypting the stored ZPUB so that even the public key is protected at rest, beyond the existing tamper-detection fingerprint.
Hardware status displayA small local-network device that shows incoming payment status at a glance, for merchants who prefer a physical indicator.
Self-host friendlinessContinued reduction of external dependencies so the most sovereignty-minded merchants can run their own instance.
Broader device guidanceExpanded and verified setup paths for additional BIP84-compatible signing devices and software.

Roadmap items describe intent rather than commitment and may change. None of them introduces custody of merchant funds. That constraint is permanent.

10Conclusion

Bitcoin gave individuals the ability to hold money that no other party can touch. BoreLine extends that same property to the act of getting paid. By deriving addresses from a merchant's own public key and never holding funds, it offers the convenience of a payment processor without the custody, the percentage cuts, or the permission.

The design is deliberately verifiable. A merchant need not take any of this on faith. Every claim can be checked against the merchant's own key, with the merchant's own coins, before the system is trusted with a single satoshi. That is the standard self-custody Bitcoiners apply to everything else, and it is the standard BoreLine was built to meet.

Accept Bitcoin. Own every sat. Not a slogan, but a structural fact of how BoreLine operates.
Ready to see it for yourself?
Start a 7-day free trial with no payment, register a fresh ZPUB, and verify a real payment landing in your own wallet before you commit a single sat.
Start 7-day free trial See plans and pricing →

BoreLine Pay · Germany, Europe · boreline.app · Contact: borelineapp@proton.me. This document is informational and does not constitute legal, financial, or tax advice. Bitcoin payments are irreversible. Review the Terms of Service and Privacy Policy before use. Version 1.0, June 2026.

Support

Get in touch.

Reach out any time. You will get a direct reply from someone who knows the system, not a scripted response from a ticket queue.

Email support
Our only support channel. Replies land within one business day, usually much faster.
Found a bug or security issue?
Responsible disclosure is genuinely welcome. If you find a bug, a vulnerability, or anything that looks off, email borelineapp@proton.me. For a suspected security issue, please report it privately first and give us a chance to fix it before it goes public. BoreLine Pay will never ask for your seed phrase or private keys.

BoreLine Pay will never ask for your seed phrase or private keys, and will never contact you first asking you to move funds or take urgent action with your account. Anyone who does is an impostor, even if they use our name.

Merchant Portal
Sign in with your username and a one time signature from your hardware device, or request access.
The username you chose when requesting access.
Please wait...
Overview
Setup
0 of 4
Dashboard
Welcome.
Here is everything happening with your Bitcoin payments.
01
Confirm Wallet
Check your addresses and sign to confirm
02
2
Define Products
Set up your tiers and pricing
03
3
Get API Key
Copy your API key to authenticate requests
04
4
Start accepting
Share a payment link or integrate the API
Revenue received
€0
0 sats from customers
0 paid 0 pending 0 expired
Last 30 days
No payments in this period
Spending on BoreLine
€0
Your subscription, not revenue
Net position
€0
Revenue minus spending
Plan renews
Subscription period
Next address index
0
Your ZPUB derivation
Recent Invoices
No invoices yet
Complete your setup and your first invoice will appear here.
Payments
Invoices
Every invoice in one place: payments your customers make to you, and your own subscription payments to BoreLine under "My spending." Tap any invoice for full details.
InvoiceCustomerProductSourceSatsFiatStatusDate
Loading...
Security
Change Your ZPUB
Your wallet was registered when you signed up. Use this page only if you need to switch to a different hardware wallet. It is a deliberate, two signature process with a 48 hour security hold.
Current registered wallet
ZPUB HASH
Loading...

This wallet stays active and keeps receiving payments right up until any change you make below completes its security hold. Nothing is interrupted.

NEVER SHARE YOUR SEED PHRASE. Changing your wallet only needs your ZPUB (a public key) and two signatures. We will never ask for your seed.
Step 1 · Authorize with your current device

First, prove you still control your current ZPUB. This is what stops anyone with a stolen login from rerouting your funds. Sign this message with your current registered hardware device.

Step 2 · Add and prove your new wallet

Paste your new ZPUB, check the derived address, then sign a message with the new wallet to prove you own it.

Paste the ZPUB from your new hardware wallet.
New wallet first address
Confirm this matches the first receive address of your new wallet.
Step 3 · Start the 48 hour hold

Submitting begins a 48 hour security hold. Your current wallet keeps receiving the whole time. When the hold ends, payments switch to your new wallet automatically. You can cancel any time during the hold.

Setup · Step 2
Your Products
Each product gets its own payment link. The product key is part of that link, so the server always knows which product and price to charge.
Add or edit products

Edit a row to change a product. Use the × to remove one. Click Save products to apply your changes.

Tier Key
Display Name
Price
Ship
Tier keys lowercase, no spaces. Tick Ship for physical products to collect the buyer's name, address and contact at checkout.
Currency
Custom one off invoice

For a one time charge that is not one of your fixed products. Enter any amount and get a payment link to send. Nothing is saved as a product, it is a single invoice.

Setup · Step 3
Your API Key
Use this key to authenticate every request your website makes to BoreLine Pay.
Treat your API key like a password. Never commit it to public repositories or expose it in client-side JavaScript. Store it as a server environment variable.
Live API Key
Generate your key to see it here
Setup · Step 4
Integrate
Two ways to accept payments. Pick the one that fits you.
For developers · API integration

Want automatic order fulfilment, a custom checkout, or payments embedded in your own app? Use the API. The three steps below are the whole flow: a button that calls your backend, your backend creating the invoice, and a webhook telling you when it is paid.

Backend only. Your API key is a secret. Use it only on your server, never in browser JavaScript, a mobile app, or any page a visitor can inspect. A leaked key lets anyone create invoices on your account. If you cannot run a backend, use the no code payment links above instead, they carry no secret.
Step 1 · Add a button to your site

There is no BoreLine button to embed, you use your own. Here is a styled one ready to paste. It calls payWithBitcoin(), which you wire up in Step 2.

HTML · CSS
<button class="btc-pay-btn" onclick="payWithBitcoin()">
  ₿ Pay with Bitcoin
</button>

<style>
.btc-pay-btn {
  display: inline-flex; align-items: center; gap: 8px;
  background: #F0B429; color: #0a0a0a;
  font-family: inherit; font-size: 15px; font-weight: 600;
  border: none; border-radius: 8px; padding: 14px 28px;
  cursor: pointer; transition: transform .15s, box-shadow .15s;
  box-shadow: 0 4px 14px rgba(240,180,41,.25);
}
.btc-pay-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px rgba(240,180,41,.4);
}
</style>
Step 2 · Create an invoice from your backend

Your button calls your own server, your server holds the API key and calls BoreLine, then sends the customer to the returned payment page. Pass a saved product with tier, or a custom amount with amount_fiat.

JavaScript · Node.js
// On your backend, e.g. /api/pay
const res = await fetch('https://api.borelinepay.uk/api/invoice', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': process.env.BORELINE_PAY_KEY
  },
  body: JSON.stringify({
    email:  customer.email,
    tier:   'starter'          // a saved product key
    // or for a custom amount instead of tier:
    // amount_fiat: 49.99, note: 'Custom order'
  })
});
const { invoice_url } = await res.json();
// send the customer to the hosted payment page
return { redirect: invoice_url };
Step 3 · Verify the webhook and fulfil the order

When the payment confirms on chain, we POST a signed event to your webhook URL (set it on the Settings page). Verify the signature, then run your own fulfilment. The X-BoreLine-Key header tells you which of your keys signed it — matters only if you run several active keys on Business or Enterprise.

JavaScript · Node.js
app.post('/webhooks/payment', (req, res) => {
  const sig  = req.headers['x-boreline-sig'];
  const ts   = parseInt(req.headers['x-boreline-time']);
  const hint = req.headers['x-boreline-key'];  // prefix of the signing key
  if (Math.abs(Date.now() / 1000 - ts) > 300)
    return res.status(400).send('Replay');
  // One key on Starter/Pro; several on Business/Enterprise — pick the
  // one named by the hint, then sign with its SHA-256 hex.
  const key      = WEBHOOK_KEYS.find(k => k.startsWith(hint)) || YOUR_API_KEY;
  const keyHash  = sha256(key);
  const expected = hmac(keyHash, req.rawBody);
  if (!timingSafeEqual(sig, expected)) return res.status(401).end();
  if (req.body.event === 'payment.confirmed')
    grantAccess(req.body.email, req.body.tier);
  if (req.body.event === 'payment.late')
    handleLatePayment(req.body.email);  // paid after expiry
  if (req.body.event === 'payment.reversed')
    revokeAccess(req.body.email);
  res.status(200).end();
});
Full integration guide

Step by step walkthrough with a live button preview, the no code path, and copy paste snippets for JavaScript, Python, and PHP.

Account
Settings
Account
Permanent
Your username is your account identity and cannot be changed. If you ever forget it, recover it from the sign in screen by signing with your registered ZPUB.
minutes
How long a customer has to pay before the invoice expires. A longer window helps during network congestion. Default is 360 minutes (6 hours).
Urgent contact Optional

If you want us to be able to reach you fast about something urgent on your account, you can leave a Telegram handle. This is entirely your choice. It is never used to sign in, it does not affect your account, and you can remove it at any time.

Webhook
Called on payment.confirmed and payment.reversed events.
Your plan

You are on the Starter plan.

Upgrading gives you a fresh month on the new plan starting today, at the new plan price. You keep your ZPUB, products, and API key.

Your data

You are in control of your data. Download everything BoreLine holds about your account at any time, or delete your account entirely. Your Bitcoin is never held by BoreLine, it stays in your own wallet, so nothing here can touch your funds.

Delete account

This permanently deletes your account and all associated data: your invoices, API keys, settings, and history. It cannot be undone.

Your wallet and funds are not affected. BoreLine only ever held your watch only public key. To confirm this is really you, you will sign with your wallet, the same way you authorise key changes.

Security
Verify ZPUB and Derivation
Confirm that the addresses we derive from your ZPUB match your hardware wallet. You do not have to trust us, check it yourself.
ZPUB Fingerprint
SHA-256 hash of your registered ZPUB. The server checks the stored key against this fingerprint before deriving any address, and locks the account if they ever differ. You can compare it yourself any time. If it changes without your action, contact support.
ZPUB HASH
Not configured
Derivation Path
Pathm/84h/0h/0h/0/{index}
TypeBIP84 Native SegWit
Next index0
Derived Addresses tap to show or hide

These are receiving addresses derived from your ZPUB. Open your hardware wallet receive screen and compare them against your address list. They must match exactly, in the same order. This proves the addresses on your invoices are truly yours.

We keep the most recent 30 addresses visible here to keep this view clean. Older used addresses scroll out of view, they are never lost, they always live in your hardware wallet and on the Bitcoin network.
No addresses yet
Your derived addresses will appear here.
Mobile
Pair a Phone for Read Only
Scan the code with your phone to check payments, balances, and invoices on the go. A paired phone can only look, never change anything, never touch funds. No sign in needed on the phone.
Scan to pair
Open your phone camera and point it at the code.
Paired phones
Active pairings: 0 of 3
Each pairing lasts 30 days, then the phone asks you to scan again. You can pair up to three phones. Adding a fourth drops the oldest automatically.
What a paired phone can do
See invoices, payments, balances, transactions, and your ZPUB fingerprint. Nothing else. It can never change settings, rotate your ZPUB, create keys, or move funds. Those always need a sign in with your hardware device.
Changing your ZPUB automatically revokes all paired phones for safety.