Skip to content
SATSGATE

Take Bitcoin without running any Bitcoin.

You integrate once, against a REST API and a signed webhook. No node, no wallet software or spending keys to give Satsgate. Payments go to your wallet; your integration handles fulfilment after payment acceptance.

You supply
zpub6rFR7y4Q2AijBEqTU…2oz2AGutZYs
An extended public key. It watches, and it cannot spend.
Per checkout
a fresh address at the next unused index
Integration
POST /v1/checkouts, then one signed webhook
Custody
none
Payments settle to a wallet only you can spend from.

The extended public key

An extended public key derives receiving addresses. It cannot sign a spend. Satsgate uses it to issue a fresh address per checkout and to watch that address, which is the whole of our access to your money.

OnboardingSample key
# What you hand over. It can watch, and it cannot spend.
zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs

# What you get back, per checkout.
POST /v1/checkouts  ->  a fresh address, derived at the next unused index

A fresh address identifies the checkout. For x402, keep the issued payment identifier private and bind it to the purchase. Public transaction details do not authorise access. Settlement records every accepted output and that identifier together to prevent payment reuse.

How a checkout gets paid

An agent pays over x402
Your 402 response carries the proposed Bitcoin requirements in PAYMENT-REQUIRED. The payer broadcasts, then retries with a v2 PAYMENT-SIGNATURE payload containing the original requirements and each selected output's txid and vout.
A person pays on a hosted page
The same checkout has a URL with an address, a QR code and a countdown to the rate lock. The hosted page handles the browser flow. A wallet transfer alone does not authorise access to an x402 resource.
The page is machine-readable too
Request it with Accept: application/json and it answers 402 with PAYMENT-REQUIRED, so an agent that reaches a payment link can use the x402 flow. The header carries base64-encoded JSON.
Fiat quote with a rate lock
Price in your own currency. Satsgate quotes a fixed satoshi amount. For x402, the complete payment must qualify and be recorded before expiresAt. A later exchange-rate move does not change that quote.

Checkout states

Satsgate tracks checkouts. An indexer supplies payment observations. For x402, the server checks the exact output total and confirmation policy, records payment acceptance, then runs the bound purchase. A balance or callback alone cannot grant access.

startpendingseensettledunderpaidrevertedexpiredshorttop up + recheckreplaced or droppeddeadline passedcheck + claimAny uncommitted state can expire, even after funds arrive.
Scroll to see the whole diagram
pending
No transaction seen at the address yet.
seen
In the mempool at 0 confirmations.
settled
Accepted under the checkout policy. For x402, the exact output set and payment identifier have been recorded before expiry; fulfil the bound purchase once.
underpaid
Arrived short. An x402 top-up must fit the output limit, bring the selected total to the exact quote and qualify before expiry.
reverted
Replaced or dropped before it settled. The checkout returns to pending and the address stays watched.
expired
The first-settlement deadline passed. Funds may still arrive, with no automatic delivery or refund under the x402 method.

These are Satsgate checkout states. The x402 settlement response has its own result and error codes. An accepted payment stays bound to one purchase even if its transaction is later replaced or reorganised out of the chain.

Receipts and recovery

The x402 receipt lists every output accepted for the purchase in the bip122-payment-set extension. Keep the original requirements and payment references when retrying. A lost response is no reason to send the full amount again.

Through recoveryUntil, an authenticated retry retrieves or resumes the same purchase and returns the original receipt, even after payment expiry. A monitor may record payment first, but it must apply the same checks and share the same settlement records. The receipt confirms payment acceptance; delivery is tracked separately.

Indexers

Blockonomics is the anchor indexer, with an Esplora backend alongside it. You can use your own backend to keep address monitoring under your control. For x402, the backend must establish the transaction history and fresh, consistent evidence required by the chosen confirmation policy. An unconfirmed status flag alone is insufficient.

Developer tooling

Test mode on a simulated chain
Create a checkout, mark it seen, advance its depth, revert it. No coins, no wallet, no testnet faucet. Every failure path is reachable on demand.
Webhooks forwarded to localhost
A CLI that streams events to a local port, so you do not need a public URL to build against.
OpenAPI 3.1 for the checkout API
The product schema describes checkout requests and responses. The linked x402 proposal defines the separate payment messages and settlement rules.
An MCP server for your coding agent
Create checkouts and handle payment events. An x402 integration also validates proof, commits payment and recovers retries before fulfilling the bound purchase.

Out of scope

  • Customers and subscriptions. Bitcoin has no pull payments, so recurring spend belongs in the payer's wallet as a standing approval rather than in our database.
  • Balances and payouts, because nothing is custodial. The money is already where it is going.
  • Disputes and chargebacks. Satsgate cannot undo a Bitcoin transfer. A refund needs a new merchant-authorised transaction to a separately authenticated return address.
  • Platform sub-accounts.

Read the API