{
  "$schema": "https://x402.org/schemas/discovery-v2.json",
  "x402Version": 2,
  "status": "live",
  "lastUpdated": "2026-09-06T00:00:00Z",
  "provider": {
    "name": "VirtualSMS",
    "url": "https://virtualsms.io",
    "agentLanding": "https://virtualsms.io/agents",
    "skill": "https://virtualsms.io/agents/skill.md",
    "contact": "hello@virtualsms.io"
  },
  "resources": [
    {
      "resource": "https://virtualsms.io/api/v1/x402/sms-verify",
      "type": "http",
      "methods": [
        "POST"
      ],
      "x402Version": 2,
      "description": "Pay-per-call SMS verification. Send a payment matching one of the accepted assets for the requested service + country and receive the OTP/verification code in the same response. No account or API key needed, settlement happens inline per call. There is no fixed per-call rate: the amount quoted in the 402 challenge is the ordinary catalogue price for that service + country, the same price the storefront and a topped-up balance pay.",
      "accepts": [
        {
          "scheme": "exact",
          "network": "eip155:8453",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "50000",
          "maxAmount": "5000000",
          "decimals": 6,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDC",
            "humanMin": "$0.05",
            "humanMax": "$5",
            "humanPrice": "varies by service and country — the exact amount is quoted in the 402 challenge"
          }
        },
        {
          "scheme": "exact",
          "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
          "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "payTo": "7AJwx3J2qXnURXZmU5AotDeMUY5dDBqBFbweHLZ2UeUs",
          "minAmount": "50000",
          "maxAmount": "5000000",
          "decimals": 6,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDC",
            "humanMin": "$0.05",
            "humanMax": "$5",
            "humanPrice": "varies by service and country — the exact amount is quoted in the 402 challenge"
          }
        },
        {
          "scheme": "exact",
          "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
          "asset": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
          "payTo": "7AJwx3J2qXnURXZmU5AotDeMUY5dDBqBFbweHLZ2UeUs",
          "minAmount": "50000",
          "maxAmount": "5000000",
          "decimals": 6,
          "token": "USDT",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDT",
            "humanMin": "$0.05",
            "humanMax": "$5",
            "humanPrice": "varies by service and country — the exact amount is quoted in the 402 challenge"
          }
        },
        {
          "scheme": "exact",
          "network": "eip155:56",
          "asset": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "50000000000000000",
          "maxAmount": "5000000000000000000",
          "decimals": 18,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "Binance-Peg USDC",
            "version": "1",
            "assetTransferMethod": "permit2",
            "permit2Address": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
            "proxyAddress": "0x402085c248EeA27D92E8b30b2C58ed07f9E20001",
            "humanMin": "$0.05",
            "humanMax": "$5",
            "humanPrice": "varies by service and country — the exact amount is quoted in the 402 challenge"
          }
        },
        {
          "scheme": "exact",
          "network": "eip155:56",
          "asset": "0x55d398326f99059fF775485246999027B3197955",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "50000000000000000",
          "maxAmount": "5000000000000000000",
          "decimals": 18,
          "token": "USDT",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "Binance-Peg USDT",
            "version": "1",
            "assetTransferMethod": "permit2",
            "permit2Address": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
            "proxyAddress": "0x402085c248EeA27D92E8b30b2C58ed07f9E20001",
            "humanMin": "$0.05",
            "humanMax": "$5",
            "humanPrice": "varies by service and country — the exact amount is quoted in the 402 challenge"
          }
        }
      ],
      "metadata": {
        "input": {
          "service": "string (required, e.g. \"telegram\", \"whatsapp\")",
          "country": "string (required, 2-letter country code)",
          "max_price_usdc": "number (optional, price ceiling only — max 5.00. It caps what you are willing to pay; it never sets the price. If the catalogue price for the requested service + country exceeds it, the call is refused rather than repriced.)"
        },
        "output": {
          "phone_number": "string",
          "code": "string (the OTP/verification code received)",
          "sms_content": "string (full SMS body)",
          "service": "string (echoed from request)",
          "country": "string (echoed from request)",
          "x402_settlement": {
            "tx_hash": "string (onchain settlement reference)",
            "amount_paid_usdc": "number",
            "network": "string",
            "token": "string"
          }
        },
        "categories": [
          "sms",
          "verification",
          "otp",
          "phone",
          "agent-tools"
        ],
        "tags": [
          "real-sim",
          "x402",
          "sms-verify",
          "pay-per-call",
          "145-countries",
          "2500-services"
        ]
      }
    },
    {
      "resource": "https://virtualsms.io/api/v1/x402/topup",
      "type": "http",
      "methods": [
        "POST"
      ],
      "x402Version": 2,
      "description": "Deposit-first top-up. Pay once to receive a reusable balance and an API key, then buy SMS verifications, rentals and proxies at ordinary retail prices through the standard customer API instead of paying per call.",
      "accepts": [
        {
          "scheme": "exact",
          "network": "eip155:8453",
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "2500000",
          "maxAmount": "10000000000",
          "decimals": 6,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDC",
            "humanMin": "$2.50",
            "humanDefault": "$2.50",
            "humanMax": "$10000"
          }
        },
        {
          "scheme": "exact",
          "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
          "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
          "payTo": "7AJwx3J2qXnURXZmU5AotDeMUY5dDBqBFbweHLZ2UeUs",
          "minAmount": "2500000",
          "maxAmount": "10000000000",
          "decimals": 6,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDC",
            "humanMin": "$2.50",
            "humanDefault": "$2.50",
            "humanMax": "$10000"
          }
        },
        {
          "scheme": "exact",
          "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
          "asset": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
          "payTo": "7AJwx3J2qXnURXZmU5AotDeMUY5dDBqBFbweHLZ2UeUs",
          "minAmount": "2500000",
          "maxAmount": "10000000000",
          "decimals": 6,
          "token": "USDT",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "USDT",
            "humanMin": "$2.50",
            "humanDefault": "$2.50",
            "humanMax": "$10000"
          }
        },
        {
          "scheme": "exact",
          "network": "eip155:56",
          "asset": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "2500000000000000000",
          "maxAmount": "10000000000000000000000",
          "decimals": 18,
          "token": "USDC",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "Binance-Peg USDC",
            "version": "1",
            "assetTransferMethod": "permit2",
            "permit2Address": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
            "proxyAddress": "0x402085c248EeA27D92E8b30b2C58ed07f9E20001",
            "humanMin": "$2.50",
            "humanDefault": "$2.50",
            "humanMax": "$10000"
          }
        },
        {
          "scheme": "exact",
          "network": "eip155:56",
          "asset": "0x55d398326f99059fF775485246999027B3197955",
          "payTo": "0xfEc54264350d97d9b63f9Cc415BAF708C4695F32",
          "minAmount": "2500000000000000000",
          "maxAmount": "10000000000000000000000",
          "decimals": 18,
          "token": "USDT",
          "maxTimeoutSeconds": 45,
          "extra": {
            "name": "Binance-Peg USDT",
            "version": "1",
            "assetTransferMethod": "permit2",
            "permit2Address": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
            "proxyAddress": "0x402085c248EeA27D92E8b30b2C58ed07f9E20001",
            "humanMin": "$2.50",
            "humanDefault": "$2.50",
            "humanMax": "$10000"
          }
        }
      ],
      "metadata": {
        "input": {
          "amount_usd": "number (optional, default 2.50, min 2.50, max 10000, USD deposit amount)",
          "mint_new_key": "boolean (optional, default false; mint a fresh API key even if this wallet already has one — e.g. the original key was lost)"
        },
        "output": {
          "api_key": "string (returned once; present on a wallet's first deposit or when mint_new_key was set)",
          "user_id": "string (uuid)",
          "balance_usd": "number (current wallet balance after this deposit)",
          "credited_usd": "number (amount this deposit credited)",
          "endpoints": "object (the standard customer API routes to spend the balance with the api_key)",
          "x402_settlement": {
            "tx_hash": "string (onchain settlement reference)",
            "amount_paid_usdc": "number",
            "network": "string",
            "token": "string"
          }
        },
        "categories": [
          "payments",
          "account",
          "agent-tools"
        ],
        "tags": [
          "real-sim",
          "x402",
          "topup",
          "deposit-first",
          "api-key"
        ]
      }
    }
  ],
  "deprecated": [],
  "roadmap": {
    "additionalChains": [
      {
        "network": "eip155:137",
        "asset": "USDC + USDT",
        "blockedBy": "operator config (X402_DISABLED_NETWORKS), same Permit2 wire format as BNB, unlocks with env-var change"
      },
      {
        "network": "eip155:42161",
        "asset": "USDC + USDT",
        "blockedBy": "operator config (X402_DISABLED_NETWORKS), same Permit2 wire format as BNB, unlocks with env-var change"
      },
      {
        "network": "eip155:10",
        "asset": "USDC",
        "blockedBy": "operator config (X402_DISABLED_NETWORKS), same Permit2 wire format as BNB, unlocks with env-var change"
      }
    ],
    "plannedResources": [
      {
        "name": "facilitator",
        "status": "not_deployed",
        "description": "Standalone self-hosted facilitator HTTP endpoint. Not implemented as a separate route, payment verification and settlement happen inline inside the sms-verify resource handler. Calling /api/v1/x402/facilitator returns 404."
      }
    ]
  },
  "notes": [
    "x402 sms-verify (pay-per-call SMS verification) is LIVE on Base USDC (EIP-3009), Solana USDC + USDT, and BNB Chain USDC + USDT (Permit2).",
    "x402 topup (deposit-first, reusable balance + API key) is LIVE on the same chains/tokens as sms-verify, minimum deposit $2.50.",
    "sms-verify has no flat per-call rate. Each 402 challenge quotes the catalogue price for the requested service + country; max_price_usdc is an optional ceiling (max $5.00) that refuses an over-priced call, it does not set the price.",
    "BNB Chain settlement uses the canonical x402ExactPermit2Proxy at 0x402085c248EeA27D92E8b30b2C58ed07f9E20001 with the witness pattern, facilitator cannot redirect funds.",
    "Polygon / Arbitrum / Optimism share the BNB Permit2 wire format; they unlock with an X402_DISABLED_NETWORKS env-var change, no new implementation.",
    "Payment verification and settlement happen inline in the sms-verify and topup resource handlers, there is no separate facilitator endpoint to call.",
    "Self-hosted. No Coinbase CDP dependency.",
    "See roadmap.plannedResources for features that are not yet deployed to this server."
  ]
}
