- Owner
- verified on-chain
- Primary address
- bc1p… connected
- Avatar
- inscription-linked
- Listing
- not listed
What is BNRP?
BNRP is an open resolution layer for BTC-native names. It gives wallets, marketplaces, and apps a shared way to read name records — ownership, avatars, addresses, inscriptions, and provenance data — directly from Bitcoin-native sources.
It is not a registry. It does not issue names. It is the resolver: a standard for reading what already exists on-chain.
- name owner address
- name primary Bitcoin address
- name avatar / inscription link
- name text records (Twitter, website, description)
- name marketplace listing status
- address primary name (reverse lookup)
- namespace supported resolver / indexer
What BTCNative uses it for
BTCNative uses BNRP to index, verify, and display BTC-native identity records across supported namespaces including .btc, .sats, .x, .ord, and others.
What BNRP does not mean
Resolver examples
These are illustrative examples of how BNRP reads name data. Live data is fetched from on-chain sources at resolution time.
- Owner
- verified on-chain
- Primary address
- bc1p… connected
- Avatar
- none set
- Listing
- listed
- Owner
- unresolved placeholder
- Primary address
- unavailable
- Avatar
- none set
- Listing
- listed
Developer reference
BNRP provides a normalized record model for BTC-native names. The API returns a consistent shape regardless of which underlying indexer resolved the name.
/v1/resolve/{name}
Forward resolve — name → records
/v1/reverse/{address}
Reverse resolve — address → primary name
/v1/batch?names=a,b,c
Batch resolve — up to 20 names
Base URL: https://api.bnrp.name/v1/
{
"name": "example.btc",
"owner": "bc1p...",
"primaryAddress": "bc1p...",
"avatar": "inscriptionId or URL",
"records": {
"twitter": "",
"website": "",
"description": ""
},
"listing": {
"status": "listed",
"price": "",
"marketplace": "BTCNative"
},
"provenance": {
"source": "unisat | btcname | sns",
"verifiedAt": "2026-01-01T00:00:00Z"
}
}
One name. Many addresses.
A single BTC-native name can carry records for any chain. Your .btc name is the canonical identity root. Every record below is optional and set by the owner.
GET https://api.bnrp.name/v1/resolve?name=satoshi.btc
{
"name": "satoshi.btc",
"owner": "bc1p...",
"addresses": {
"BTC": "bc1p...",
"LIGHTNING": "satoshi@getalby.com",
"ETH": "0x...",
"SOL": "So1..."
},
"profile": {
"display": "Satoshi",
"com.twitter": "satoshi",
"url": "https://bitcoin.org"
},
"via": "unisat",
"resolved_at": "2026-04-23T20:00:00Z",
"cached": true
}
Bitcoin is always the root. All other address fields are optional owner-set records.
Messaging
A Bitcoin name can now serve as a messaging address. Set a messaging field in your BNRP routing inscription and any app that resolves BNRP can reach you directly — no email, no phone number, no centralized directory.
The first supported protocol is XMTP — end-to-end encrypted, quantum-resistant, decentralized, and in production with 55M+ reachable inboxes. Your name routes to your XMTP inbox ID. Anyone who knows your name can open an encrypted conversation.
{
"p": "bnrp",
"op": "routing",
"name": "alice.btc",
"btc_taproot": "bc1p...",
"messaging": {
"xmtp": "a1b2c3d4e5f6..."
}
}
A resolver reads the messaging.xmtp field from the canonical BNRP inscription. The sender opens an XMTP conversation to that inbox ID. Messages are end-to-end encrypted. Neither BTCNative nor the resolver can read them.
MLS encryption (audited by the same firm that reviews Signal and WhatsApp). Quantum-resistant. No company in the middle. Decentralized node operators. Open source from top to bottom. ~$5 per 100k messages.
Adding a messaging field is opt-in. It makes your inbox ID public — but not your messages. XMTP has built-in consent: you control who can reach you. Block senders across the entire network in one action.
The messaging object supports multiple protocols. xmtp is the first. Reserved keys exist for Nostr (npub), Matrix, and SimpleX. Unknown keys are ignored — no breaking changes when new protocols are added.
/v1/messaging/{name}
Resolve messaging identifiers for a name
GET https://api.bnrp.name/v1/messaging/alice.btc
{
"name": "alice.btc",
"messaging": {
"xmtp": "a1b2c3d4e5f6..."
},
"resolved_at_block": 845000
}
Spec: BNRP-IP-08 — Messaging Records. Status: Draft.
Agent Skills
Every BNRP name has a machine-readable skill file — a single URL any AI agent can fetch to learn how to pay you, message you, and interact with you correctly.
Name owners can also write agent instructions directly into their BNRP record. These are stored on-chain and surfaced automatically in the skill file. Instructions persist as long as the inscription exists — no account, no API key, no service to trust.
GET https://api.bnrp.name/v1/skill/trump.btc
# Agent skill: trump.btc
**Display name:** Trump
**Bio:** Protocol architect. Built BNRP — open standard for Bitcoin-native identity.
**Inscription:** `0243d0e1...`
**Owner:** `bc1pkdqs4...`
## Pay trump.btc
1. Use address: `bc1pkdqs4...`
2. Verified on-chain taproot address
3. Always verify before signing
## Message trump.btc
- Inbox ID: `0e614b04...`
- Open: https://xmtp.chat/dm/0e614b04...
## Instructions from Trump
[custom agent_instructions set by the owner]
Add an agent_instructions field to your BNRP routing inscription. Up to 500 characters. Inscribe it once and it persists on-chain. Update it anytime by re-inscribing — latest valid record wins.
Payment preferences, minimum amounts, contact rules, time zone, preferred currency, or anything an agent should know before initiating a transaction or conversation. You define the terms.
An agent resolves a name, fetches the skill file, reads the verified BTC address and XMTP inbox ID, checks your instructions, then acts. No scraping. No inference. Verified, on-chain data every time.
AI agents are already moving money and sending messages. BNRP gives them a trustless way to find verified addresses and owner-defined rules — with Bitcoin as the root of truth. No middleman in the resolution path.
{
"p": "bnrp",
"op": "routing",
"name": "alice.btc",
"btc_taproot": "bc1p...",
"messaging": {
"xmtp": "a1b2c3..."
},
"agent_instructions": "BTC payments only. Minimum 10,000 sats. Contact via XMTP before initiating any transaction."
}
/v1/skill/{name}
Personalized agent skill file for any registered name
/skill.md
Base BNRP skill — payment and messaging instructions for any agent
Payment Policy
Name owners can publish machine-readable payment rules in their BNRP record. Compliant agents read these rules before sending any funds.
Set require_approval: true and agents must send an XMTP message to your inbox and wait for your reply before initiating any payment. The approval thread is the audit trail. No escrow, no smart contract.
Set min_sats to filter dust payments, and max_sats_per_day to cap daily agent spend. These are on-chain signals — any compliant agent reads and respects them before sending.
{
"p": "bnrp",
"op": "routing",
"name": "alice.btc",
"btc_taproot": "bc1p...",
"messaging": { "xmtp": "a1b2c3..." },
"payment_policy": {
"require_approval": true,
"approval_channel": "xmtp",
"min_sats": 10000,
"max_sats_per_day": 1000000
}
}
Spec: BNRP-IP-09 — Agent Payment Policy. Status: Draft. | Set yours now using the BNRP profile editor or the SDK: nlgal/bnrp-sdk.
Build beneath your name
BNRP supports a parent-child namespace model. A name owner can register subnames beneath their root name and assign records to each.
A subname is a Bitcoin-native record created by the owner of a root name. It is not a smart contract. It is a BNRP inscription event with op: subname_register, referencing the parent name and a label.
shop.artist.btc
← label.parent.tld
The root name owner controls all subnames. They can register, update, revoke, or delegate control of any subname under their root. Delegation requires an additional inscription with op: delegate_add.
Every subname event is inscribed on Bitcoin. Nothing is deleted. BNRP resolvers determine the current state by applying the latest valid inscription win rule: the newest authorized, unrevoked, conforming inscription is the active record.
A newer update only counts as the active record if it was authorized by the owner or an approved manager, follows the namespace policy, has a strictly increasing nonce, and has not been revoked or superseded.
✓ Authorized by owner or approved delegate
✓ Nonce strictly increases from previous record
✓ Not revoked by a later revocation event
✓ Conforms to namespace policy
✓ Confirmed on-chain
{
"p": "bnrp",
"op": "subname_register",
"name": "artist.btc",
"sub": "shop.artist.btc",
"to": "bc1p...",
"records": {
"btc": "bc1p...",
"website": "https://shop.artist.btc"
},
"nonce": 1,
"v": 1
}
Subname issuance is in prototype phase. The event format is finalized. Indexer support is live on testnet. Mainnet resolver activation is roadmap. Do not use for high-value transfers without independent verification.
Permanent history. Current state.
Bitcoin inscriptions are permanent. BNRP does not edit old inscriptions. Instead, each update creates a new Bitcoin-native record. The resolver reads the latest valid record, while the full history remains visible.
A newer inscription is not automatically valid. BNRP validates each update against these requirements:
- Authorized by the current owner or delegated manager
- Matches the namespace policy
- Uses a newer nonce or version number
- Is confirmed or safely indexed (not unconfirmed or chain-reorged)
- Has not been revoked or superseded by a later valid record
Not all operations are live on BNRP indexing today. This is the full planned operation set. Current support: record_register, record_update. Subname ops are roadmap.
What BNRP does not mean
Full resolver record schema
This is the extended BNRP record model including resolver state, namespace data, record history, and provenance.
{
"name": "example.btc",
"owner": "bc1...",
"primaryAddress": "bc1...",
"avatar": "inscriptionId or URL",
"records": {
"twitter": "",
"website": "",
"description": ""
},
"listing": {
"status": "listed",
"price": "",
"marketplace": "BTCNative"
},
"provenance": {
"source": "unisat | btcname | sns",
"verifiedAt": ""
},
"resolver": {
"protocol": "BNRP",
"rule": "latest-valid-inscription-wins",
"currentRecord": "",
"recordHistory": []
},
"namespace": {
"enabled": false,
"policy": "parent-controlled",
"subnameCount": 0,
"delegates": []
}
}
{
"name": "shop.artist.btc",
"type": "subname",
"parent": "artist.btc",
"label": "shop",
"status": "active",
"authorization": {
"authorized": true,
"method": "parent-owner",
"verifiedAt": ""
},
"owner": "bc1...",
"records": {
"btc": "bc1...",
"website": "https://example.com",
"avatar": "inscription-id"
},
"policy": { "type": "parent-controlled" },
"currentRecord": {
"rule": "latest-valid-inscription-wins",
"inscriptionId": "",
"nonce": 3,
"op": "subname_update",
"verifiedAt": ""
},
"recordHistory": [
{ "inscriptionId": "", "op": "subname_register", "nonce": 1, "status": "superseded" },
{ "inscriptionId": "", "op": "subname_update", "nonce": 2, "status": "superseded" },
{ "inscriptionId": "", "op": "subname_update", "nonce": 3, "status": "current" }
],
"provenance": { "source": "bnrp", "createdAt": "", "updatedAt": "" },
"resolver": { "health": "ok", "verifiedAt": "" }
}
Protocol Extensions
BNRP is a living standard. The following Improvement Proposals extend the core resolve schema with new capabilities. Each is a standalone spec with a demo page and API support.
Set a Lightning Address on your .btc name. satoshi.btc resolves as a standard LNURL-pay endpoint. Compatible with any Lightning wallet.
PSBT-challenge authentication for .btc names. No passwords. No OAuth. No ETH. Wallet signs a nonce. Server verifies ownership on-chain.
Register AI agents under your .btc name. agent.company.btc is a first-class BNRP subname with a payment address, pubkey, and capability declarations.
Extended profile schema: Nostr pubkey, Lightning Address, DID, Telegram, Farcaster. One inscription sets your full cross-protocol identity.
Delegate namespace control to an operator. company.btc owners can authorize an address to issue and manage *.company.btc at scale.
All improvement proposals are open for feedback. Open an issue on GitHub or message @btc_native.