X402 Accessibility - Complete End-to-End Example
This document shows a complete payment flow using the X402 Accessibility Extension.
Scenario
María is a Spanish-speaking user with visual impairment who wants to access protected content. She uses a screen reader and needs simple explanations.
Step 1: Client Requests Resource (Without Payment)
GET /api/data HTTP/1.1
Host: resource-server.example.com
Accept-Language: es
Response: 402 Payment Required
{
"scheme": "exact",
"network": "bsv-testnet",
"maxAmountRequired": "1000",
"resource": "https://resource-server.example.com/api/data",
"description": "Acceso al endpoint de datos protegidos",
"payTo": "mhSDV8SPswwXCGFpkE8pTWUftVnSW6g3qk",
"maxTimeoutSeconds": 300
}
Step 2: Client Creates Payment with Accessibility Preferences
María’s MCP wallet creates a payment with her preferences:
// In MCP Wallet
const payment = await createX402Payment({
walletId: "maria-wallet",
payTo: "mhSDV8SPswwXCGFpkE8pTWUftVnSW6g3qk",
amount: 1000,
network: "testnet",
// Accessibility preferences
accessibilityPrefs: {
language: "es",
cognitiveLevel: "simple",
format: "audio-friendly"
}
});
Generated Payment Payload
{
"x402Version": 1,
"scheme": "exact",
"network": "bsv-testnet",
"payload": {
"transaction": "0100000001cadc11f61b..."
},
"accessibility": {
"language": "en",
"cognitiveLevel": "simple",
"format": "audio-friendly"
}
}
Encoded as base64: eyJ4NDAyVmVyc2lvbiI6MSw...
Step 3: Client Retries with Payment
GET /api/data HTTP/1.1
Host: resource-server.example.com
X-PAYMENT: eyJ4NDAyVmVyc2lvbiI6MSw...
Step 4: Resource Server → Facilitator (Verify)
Resource server extracts preferences and forwards to facilitator:
POST /verify HTTP/1.1
Host: facilitator.example.com
Content-Type: application/json
{
"payload": {
"x402Version": 1,
"scheme": "exact",
"network": "bsv-testnet",
"payload": {
"transaction": "0100000001cadc11f61b..."
},
"accessibility": {
"language": "en",
"cognitiveLevel": "simple",
"format": "audio-friendly"
}
},
"paymentRequirements": {
"scheme": "exact",
"network": "bsv-testnet",
"maxAmountRequired": "1000",
"payTo": "mhSDV8SPswwXCGFpkE8pTWUftVnSW6g3qk",
"resource": "https://resource-server.example.com/api/data",
"maxTimeoutSeconds": 300
},
"accessibilityPreferences": {
"language": "en",
"cognitiveLevel": "simple",
"format": "audio-friendly"
}
}
Step 5: Facilitator Verifies and Responds
Facilitator validates the transaction and generates accessible metadata:
{
"data": {
"isValid": true,
"payer": "mjBHBLkSqeGbNf4JJrwUvPkSWTxTSQWUYG",
"payee": "mhSDV8SPswwXCGFpkE8pTWUftVnSW6g3qk",
"amount": "1000",
"network": "bsv-testnet"
},
"accessibility": {
"plainLanguage": "El pago fue verificado correctamente",
"explanation": "Tu transacción BSV es válida. Pagaste 1000 satoshis desde tu dirección mjBHBLkS... a la dirección mhSDV8SP...",
"stepByStep": [
"Verificamos que la transacción esté firmada correctamente",
"Confirmamos que el monto sea exactamente 1000 satoshis",
"Validamos que el pago vaya a la dirección correcta",
"Comprobamos que estés usando BSV testnet"
],
"hints": {
"nextSteps": "Ahora transmitiremos tu transacción a la blockchain para confirmarla"
},
"language": "en",
"audioFriendly": true,
"cognitiveLevel": "simple"
}
}
Step 6: Resource Server → Facilitator (Settle)
Resource server asks facilitator to broadcast the transaction:
POST /settle HTTP/1.1
Host: facilitator.example.com
Content-Type: application/json
{
"payload": { ... },
"paymentRequirements": { ... },
"accessibilityPreferences": {
"language": "en",
"cognitiveLevel": "simple",
"format": "audio-friendly"
}
}
Facilitator Settle Response
{
"data": {
"success": true,
"transaction": "6b64a3dc076f00061a339bbcb73ae385bfc8240e4abc8bb48dd86eaf1f06a9cc",
"payer": "mjBHBLkSqeGbNf4JJrwUvPkSWTxTSQWUYG",
"network": "bsv-testnet"
},
"accessibility": {
"plainLanguage": "El pago se completó exitosamente",
"explanation": "Tu transacción fue transmitida a la blockchain BSV testnet con ID 6b64a3dc076f00061a339bbcb73ae385bfc8240e4abc8bb48dd86eaf1f06a9cc",
"stepByStep": [
"Recibimos tu transacción firmada",
"La validamos contra la red BSV",
"La transmitimos a la blockchain",
"La transacción está confirmada en la red"
],
"hints": {
"nextSteps": "Puedes verificar tu transacción en WhatsOnChain con el ID proporcionado"
},
"language": "en",
"audioFriendly": true,
"cognitiveLevel": "simple"
}
}
Step 7: Resource Server → Client (Success)
Resource server returns protected content with accessibility metadata:
HTTP/1.1 200 OK
Content-Type: application/json
{
"message": "¡Pago exitoso! Aquí están tus datos protegidos.",
"data": {
"timestamp": "2025-11-28T11:27:31.572Z",
"content": "Este es contenido protegido accesible solo con pago BSV válido",
"funFact": "¡Bitcoin SV puede manejar más de 50,000 transacciones por segundo!"
},
"payment": {
"txid": "6b64a3dc076f00061a339bbcb73ae385bfc8240e4abc8bb48dd86eaf1f06a9cc",
"payer": "mjBHBLkSqeGbNf4JJrwUvPkSWTxTSQWUYG",
"network": "bsv-testnet",
"amount": "1000"
},
"accessibility": {
"plainLanguage": "El pago se completó exitosamente",
"explanation": "Tu transacción fue transmitida a la blockchain BSV testnet con ID 6b64a3dc076f00061a339bbcb73ae385bfc8240e4abc8bb48dd86eaf1f06a9cc",
"stepByStep": [
"Recibimos tu transacción firmada",
"La validamos contra la red BSV",
"La transmitimos a la blockchain",
"La transacción está confirmada en la red"
],
"hints": {
"nextSteps": "Puedes verificar tu transacción en WhatsOnChain con el ID proporcionado"
},
"language": "en",
"audioFriendly": true,
"cognitiveLevel": "simple"
}
}
Step 8: Screen Reader Output
María’s screen reader narrates:
El pago se completó exitosamente.
Tu transacción fue transmitida a la blockchain BSV testnet con ID 6 b 6 4 a 3 d c 0 7 6 f 0 0 0 6 1 a 3 3 9 b b c b 7 3 a e 3 8 5 b f c 8 2 4 0 e 4 a b c 8 b b 4 8 d d 8 6 e a f 1 f 0 6 a 9 c c.
Pasos realizados:
- Recibimos tu transacción firmada.
- La validamos contra la red BSV.
- La transmitimos a la blockchain.
- La transacción está confirmada en la red.
Siguiente paso: Puedes verificar tu transacción en WhatsOnChain con el ID proporcionado.
Error Example: Insufficient Funds
If María didn’t have enough funds:
Facilitator Response
{
"data": {
"isValid": false,
"invalidReason": "insufficient_funds"
},
"accessibility": {
"plainLanguage": "No hay fondos suficientes en tu wallet",
"explanation": "Tu wallet tiene 500 satoshis pero necesitas 1113 satoshis. Esto incluye 1000 satoshis para el pago y 113 satoshis de comisión para los mineros.",
"stepByStep": [
"Verifica cuántos satoshis tienes en tu wallet",
"Obtén más fondos de un faucet de BSV testnet",
"Espera a que los fondos se confirmen en la blockchain",
"Intenta hacer el pago nuevamente"
],
"hints": {
"nextSteps": "Obtén fondos gratuitos de testnet en https://faucet.bitcoincloud.net/",
"common": "La comisión de minería se calcula según el tamaño de tu transacción. Transacciones más grandes tienen comisiones más altas."
},
"analogies": [
"Es como intentar comprar algo de $11.13 cuando solo tienes $5 en tu billetera. Necesitas agregar más dinero antes de poder comprarlo."
],
"language": "en",
"audioFriendly": true,
"cognitiveLevel": "simple"
}
}
Screen Reader Output
No hay fondos suficientes en tu wallet.
Tu wallet tiene 500 satoshis pero necesitas 1113 satoshis. Esto incluye 1000 satoshis para el pago y 113 satoshis de comisión para los mineros.
Pasos para resolver:
- Verifica cuántos satoshis tienes en tu wallet.
- Obtén más fondos de un faucet de BSV testnet.
- Espera a que los fondos se confirmen en la blockchain.
- Intenta hacer el pago nuevamente.
Consejo: Obtén fondos gratuitos de testnet en h t t p s dos puntos barra barra faucet punto bitcoincloud punto net.
Analogía: Es como intentar comprar algo de $11.13 cuando solo tienes $5 en tu billetera. Necesitas agregar más dinero antes de poder comprarlo.
Technical Level Example
If a developer requested cognitiveLevel: "technical":
{
"accessibility": {
"plainLanguage": "Transaction validation successful",
"explanation": "Transaction 6b64a3dc... validated successfully. Input: 1 UTXO from cadc11f6:1 (99791 sats). Outputs: P2PKH(mhSDV8SP..., 1000 sats), P2PKH(n2CazoRP..., 98678 sats). Fee: 113 sats (0.50 sat/byte). Signature: ECDSA secp256k1 valid.",
"stepByStep": [
"Parsed raw transaction from hex using @bsv/sdk",
"Validated ECDSA signature using secp256k1 curve",
"Verified output[0] script matches required P2PKH(mhSDV8SP...)",
"Confirmed UTXO availability via WhatsOnChain API",
"Calculated fee: 113 sats (226 bytes × 0.50 sat/byte)"
],
"hints": {
"nextSteps": "Transaction will be broadcast to BSV testnet nodes",
"technical": "Fee rate: 0.50 sat/byte. Typical testnet confirmation time: ~10 minutes (next block)"
},
"language": "en",
"audioFriendly": false,
"cognitiveLevel": "technical"
}
}
Summary
This example demonstrates:
- ✅ Client specifies preferences (language, cognitive level, format)
- ✅ Facilitator generates appropriate metadata (simple Spanish, audio-friendly)
- ✅ Resource server propagates metadata to client
- ✅ Screen reader compatibility (linear narrative, no symbols)
- ✅ Error handling with actionable guidance
- ✅ Flexibility (technical users get technical details)
The entire flow is accessible to users with:
- Visual impairments (screen reader compatible)
- Language barriers (Spanish, with support for more languages)
- Cognitive differences (simple explanations with analogies)
- Technical expertise (can request technical details)