Skip to main content

Overview

Lists all payment schemes and networks the facilitator supports. Endpoint: GET https://facilitator.corbits.dev/supported

Purpose

Optional discovery endpoint that allows clients to query the facilitator’s capabilities without making actual payment requests. This is useful for:
  • Discovering which payment methods are available
  • Determining if a specific network is supported
  • Retrieving facilitator addresses for different networks
  • Building dynamic payment UIs

Request

No request body required. This is a simple GET request:
curl https://facilitator.corbits.dev/supported

Response

kinds
array
required
Array of supported payment configurations.

Example Response

{
  "kinds": [
    {
      "x402Version": 1,
      "scheme": "exact",
      "network": "solana-mainnet",
      "extra": {
        "feePayer": "FacilitatorMainnetAddress..."
      }
    },
    {
      "x402Version": 1,
      "scheme": "exact",
      "network": "solana-devnet",
      "extra": {
        "feePayer": "FacilitatorDevnetAddress..."
      }
    },
    {
      "x402Version": 1,
      "scheme": "exact",
      "network": "base-sepolia"
    }
  ]
}

Use Cases

1. Network Discovery

Check if a facilitator supports a specific network:
const response = await fetch('https://facilitator.corbits.dev/supported');
const { kinds } = await response.json();

const supportsSolanaDevnet = kinds.some(
  k => k.network === 'solana-devnet' && k.scheme === 'exact'
);

if (supportsSolanaDevnet) {
  console.log('Facilitator supports Solana Devnet');
}

2. Get Facilitator Addresses

Retrieve facilitator public keys for different networks:
const solanaMainnet = kinds.find(
  k => k.network === 'solana-mainnet'
);

if (solanaMainnet?.extra?.feePayer) {
  console.log(`Mainnet fee payer: ${solanaMainnet.extra.feePayer}`);
}

3. Build Payment UI

Dynamically generate payment options based on supported methods:
const paymentOptions = kinds.map(k => ({
  label: `${k.network} (${k.scheme})`,
  value: k.network,
  feePayer: k.extra?.feePayer
}));

// Render dropdown or radio buttons

Handler Behavior

When the facilitator receives a /supported request:
  1. Queries all handlers: Calls getSupported() on each registered handler
  2. Aggregates results: Combines all supported kinds from all handlers
  3. Returns list: Provides complete list of capabilities
Handlers that don’t implement getSupported() won’t contribute to the response.

Comparison with /accepts

Feature/supported/accepts
PurposeDiscover capabilitiesEnrich requirements
RequestNo body (GET)Requires payment requirements (POST)
ResponseList of supported schemesEnriched requirements
When to useClient wants to know what’s availableResource server needs blockchain-specific params
Extra dataMay include facilitator addressesAlways includes blockchain-specific details

Example: Check Before Payment

// 1. Check if facilitator supports the network
const supported = await fetch(
  'https://facilitator.corbits.dev/supported'
).then(r => r.json());

const canPayWithSolana = supported.kinds.some(
  k => k.network === 'solana-devnet'
);

if (!canPayWithSolana) {
  throw new Error('Facilitator does not support Solana Devnet');
}

// 2. Proceed with payment flow
const requirements = await fetchPaymentRequirements();
// ...

Error Responses

500 Internal Server Error
Facilitator encountered an internal error.Example:
{
  "error": "Failed to query handlers"
}
The /supported endpoint rarely fails since it doesn’t depend on external blockchain RPC endpoints.

See Also