Pay a match
POST https://api.curb.numetal.xyz/v1/matches/{id}/paySettlement is x402 USDC on both Base and Solana. Each swap clears seller + protocol fee.
Without payment header → 402
Body / headers describe dual accepts[] per enabled rail:
- Seller USDC (
sellerPayTo/ optionalsellerSolPayTo) - Hub fee (
HUB_PAY_TO/HUB_PAY_TO_SOLANA)
Pick one network (Base or Solana). Pay both roles on that network. Retry with PAYMENT-SIGNATURE / X-Payment.
With payment header → 200
On success the match is marked paid and a grant is issued for the seller endpoint.
pay.sh (Solana buyer flow)
# Install: brew install pay # binary: /opt/homebrew/bin/pay (pay 0.21+)
pay setup # once — Solana keypair in Keychain
pay account list
pay topup # fund USDC (no SOL needed for fees)
# Free discovery
pay fetch https://api.curb.numetal.xyz/health
pay fetch https://api.curb.numetal.xyz/v1/offers
pay fetch https://api.curb.numetal.xyz/.well-known/x402
# Sample 402 probe (no match) — pay.sh should recognize x402 + Solana accepts
pay curl -X POST https://api.curb.numetal.xyz/v1/pay
# Real match settle (after POST /v1/intents returned match.id)
pay curl -X POST https://api.curb.numetal.xyz/v1/matches/MATCH_ID/pay
# Touch ID → signs Solana USDC for seller + hub_fee → grantpay discover is not a subcommand. Use pay fetch / pay curl against the origin, or list the public catalog with pay skills search.
Inspect anytime:
GET https://api.curb.numetal.xyz/v1/matches/{id}