Public APIs
Base URL: https://pay.bwallet.space. Read endpoints are open and need no key. Write endpoints are signed by the user’s wallet (BRC-43 protocol [2, "bwallet paymail"], key ID "1"), so only the owner of a name can change it. Responses below were captured live on 17 Oct 2026; long values are cut with ….
bwalletx.com/.well-known/bsvalias and pay.bwallet.space/.well-known/bsvalias return the same capabilities, so name@bwalletx.com works with any paymail client.
Paymail (read)
Section titled “Paymail (read)”| Method and path | What it returns |
|---|---|
GET /.well-known/bsvalias |
Paymail capabilities |
GET /api/paymail/id/{name}@bwalletx.com |
The name’s key and its owner-signed binding (pki) |
GET /api/paymail/profile/{name}@bwalletx.com |
Display name and avatar |
GET /api/paymail/verify/{name}@bwalletx.com/{pubkey} |
Whether that key belongs to the name |
GET /api/paymail/ord/{name}@bwalletx.com |
Ordinals receive address, if the wallet published one |
GET /api/paymail/lookup?key={identityKey} |
Every name that receives for a wallet, main one marked |
GET /api/paymail/config |
Name rules (fee, days between changes) |
GET /api/paymail/name-log[?alias=] |
The public, hash-chained log of name changes |
GET /api/paymail/handovers-for?key={identityKey} |
Pending two-party handovers for a wallet |
GET /api/paymail/social?provider=x|google|all |
Names verified with an X or Google account |
GET /api/paymail/bphone-get?key={identityKey} |
A wallet’s bPhone rate card |
GET /api/paymail/bphone-directory[?category=&limit=] |
Public bPhone directory |
curl https://pay.bwallet.space/api/paymail/id/npg@bwalletx.com{"bsvalias":"1.0","handle":"npg@bwalletx.com","pubkey":"026607f6…b59b", "binding":{"alias":"npg","identityKey":"026607f6…b59b","seq":1,"timestamp":"1792222561138","signature":"30440220…", "scheme":"bwallet-paymail/v1 bind; BRC-43 protocol [2,\"bwallet paymail\"] keyID \"1\", counterparty anyone"}}curl https://pay.bwallet.space/api/paymail/profile/npg@bwalletx.com{"name":"NPG","avatar":"https://www.bchatx.com/api/bavatar/026607f6…b59b.png"}curl https://pay.bwallet.space/api/paymail/verify/npg@bwalletx.com/026607f6…b59b{"bsvalias":"1.0","handle":"npg@bwalletx.com","pubkey":"026607f6…b59b","match":true}curl "https://pay.bwallet.space/api/paymail/lookup?key=026607f6…b59b"{"paymail":"npg@bwalletx.com","alias":"npg","names":[{"paymail":"npg@bwalletx.com","kind":"plain","main":true},{"paymail":"ninjapunkgirls@bwalletx.com","kind":"plain","main":false}]}curl https://pay.bwallet.space/api/paymail/config{"nameFee":null,"nameChangeDays":30}curl "https://pay.bwallet.space/api/paymail/handovers-for?key=026607f6…b59b"{"handovers":[]}Errors are JSON with an error field and an HTTP status, for example {"error":"invalid-key"} (400) when key is not a compressed public key, {"error":"no-ord-address"} (404) when a wallet has not published an ordinals address, and {"error":"not-found"} (404).
Paymail (payments)
Section titled “Paymail (payments)”| Method and path | Capability |
|---|---|
POST /api/paymail/p2p-destination/{name}@bwalletx.com |
P2P payment destination (2a40af698840): returns BRC-29 outputs and a reference |
POST /api/paymail/receive-tx/{name}@bwalletx.com |
Receive a raw transaction (5f1323cddf31) |
POST /api/paymail/receive-beef/{name}@bwalletx.com |
Receive a BEEF transaction (5c55a7fdb7bb) |
The server broadcasts what it receives to ARC as Extended Format and keeps it for the recipient’s wallet to collect. Use any paymail client, or pay() from @bwalletx/connect.
Paymail (signed writes)
Section titled “Paymail (signed writes)”These are called by the wallet and need the owner’s signature over bwallet-paymail|v1|<action>|<sorted key=value fields> with a timestamp within a few minutes:
register, bind, set-name, names-list, names-add, names-remove, names-primary, unlink, delete, inbox, ack, history, apps-get, apps-put, handover-release, handover-cancel, handover-accept, bphone-put, bphone-book, bphone-bookings, bphone-book-act (all POST /api/paymail/{action}).
If you are building a wallet and want to support bWalletX names, the name bindings page has the signed message format.
Themes and Store
Section titled “Themes and Store”| Method and path | What it returns |
|---|---|
GET /api/themes |
The theme catalogue (bwx-theme/1): tiers and packs with their look |
GET /api/theme-orders/store-key |
The Store’s receipt-signing public key |
POST /api/theme-orders/buy-quote |
A signed quote and receipt for a theme (wallet-signed request) |
POST /api/theme-orders/buy-claim |
Claim a paid quote with its transaction (wallet-signed request) |
POST /api/theme-orders/owned |
Themes a wallet owns (wallet-signed request) |
curl https://pay.bwallet.space/api/theme-orders/store-key{"signer":"03c6705a389715243e51638fefa43772c51292de4af134b1dfce75128f8ace9ea7"}curl https://pay.bwallet.space/api/themes{"format":"bwx-theme/1","tiers":["free","premium","holder","edition"],"packs":[{"format":"bwx-theme/1","id":"gold","label":"Gold","blurb":"Black and gold, the o…"},…]}Verify a receipt end to end: Store receipts.
| Method and path | What it returns |
|---|---|
GET /api/contracts |
Published contract templates ({"contracts":[]} today) |
GET /api/strategies |
Published trading strategies ({"strategies":[]} today) |
POST /api/apps-submit |
Submit an app for the bWallet app directory; reviewed before it ships |
POST /api/waitlist |
Join the bWallet testing waitlist |
Rate limits
Section titled “Rate limits”Paymail requests are limited to 120 per minute per IP, and name changes (names-*) to 20. Over the limit you get 429 {"error":"rate-limited"}: wait and retry. There is no API key and no account.
Status
Section titled “Status”- ✓ All read endpoints above, checked live 17 Oct 2026
- ✓ Paymail P2P payments with ARC broadcast as EF
- ✓ Signed writes for names, bindings and handovers
- ◻ Daily on-chain anchor of the name log head