Skip to main content

Facilitator

The facilitator is a Cloudflare Worker that verifies and settles x402 payments on the Stacks blockchain.

URL

https://facilitator.shadowfeed.app

Why a Custom Facilitator?

ShadowFeed built its own facilitator instead of using the official facilitator.stacksx402.com because:

  • The official facilitator returns 500 errors on /settle for mainnet transactions
  • Custom facilitator gives us full control over broadcast retry logic
  • Hiro API key integration for reliable transaction broadcasting
  • Better error messages for debugging

Endpoints

GET /supported

Returns supported networks and assets.

curl https://facilitator.shadowfeed.app/supported
{
"x402Version": 2,
"kinds": [
{
"scheme": "exact",
"network": "stacks:1",
"asset": "STX"
},
{
"scheme": "exact",
"network": "stacks:2147483648",
"asset": "STX"
}
]
}

POST /verify

Validates a signed transaction without broadcasting it.

curl -X POST https://facilitator.shadowfeed.app/verify \
-H "Content-Type: application/json" \
-d '{
"paymentPayload": { "payload": { "transaction": "hex..." } },
"paymentRequirements": { "amount": "5000", "payTo": "SP1DV..." }
}'
{
"valid": true,
"payer": "SP2PBB...",
"invalidReason": null
}

POST /settle

Broadcasts the transaction and waits for confirmation.

curl -X POST https://facilitator.shadowfeed.app/settle \
-H "Content-Type: application/json" \
-d '{
"paymentPayload": { "payload": { "transaction": "hex..." } },
"paymentRequirements": { "amount": "5000", "payTo": "SP1DV..." }
}'
{
"success": true,
"payer": "SP2PBB...",
"transaction": "0xabc123...",
"network": "stacks:1"
}

Implementation Details

  • Runtime: Cloudflare Workers (Hono framework)
  • TX Deserialization: @stacks/transactions v7
  • Broadcasting: Direct POST to Hiro API (/v2/transactions) with API key
  • Confirmation: Polls Hiro API for TX status (up to 25 seconds)
  • Address Derivation: c32address from signer hash for proper SP-prefix addresses
  • Retry Logic: 3 attempts with exponential backoff for 429 rate limits