Axios Client

Make x402 payments using Axios with automatic retry logic

Installation

npm install @getconduit/x402-axios axios @solana/web3.js

Basic Usage

import axios from 'axios'
import { x402Interceptor } from '@getconduit/x402-axios'
import { Connection, Keypair } from '@solana/web3.js'

// Create axios instance
const client = axios.create({
  baseURL: 'https://api.example.com'
})

// Add x402 interceptor
x402Interceptor(client, {
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  payer: yourKeypair,
})

// Make paid requests (automatically handles 402 responses)
const { data } = await client.get('/premium')
console.log(data) // Premium content

Configuration

import axios from 'axios'
import { x402Interceptor } from '@getconduit/x402-axios'
import { Connection, Keypair } from '@solana/web3.js'

const client = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
})

x402Interceptor(client, {
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  payer: yourKeypair,
  
  // Optional: Custom payment handler
  onPayment: (amount, recipient) => {
    console.log(`Paying ${amount} USDC to ${recipient}`)
  },
  
  // Optional: Error handler
  onError: (error) => {
    console.error('Payment failed:', error)
  },
  
  // Optional: Max retries for failed payments
  maxRetries: 3,
})

Multiple Endpoints

import axios from 'axios'
import { x402Interceptor } from '@getconduit/x402-axios'
import { Connection, Keypair } from '@solana/web3.js'

const client = axios.create()

x402Interceptor(client, {
  connection: new Connection('https://api.mainnet-beta.solana.com'),
  payer: yourKeypair,
})

// Make requests to different paid APIs
async function fetchAllData() {
  const [data1, data2, data3] = await Promise.all([
    client.get('https://api1.example.com/premium'),
    client.get('https://api2.example.com/data'),
    client.get('https://api3.example.com/content'),
  ])
  
  return {
    api1: data1.data,
    api2: data2.data,
    api3: data3.data,
  }
}

Error Handling

import axios from 'axios'
import { x402Interceptor, X402Error } from '@getconduit/x402-axios'

const client = axios.create()
x402Interceptor(client, { /* config */ })

async function fetchPremiumData() {
  try {
    const { data } = await client.get('/premium')
    return data
  } catch (error) {
    if (error instanceof X402Error) {
      switch (error.code) {
        case 'INSUFFICIENT_FUNDS':
          console.error('Not enough USDC in wallet')
          break
        case 'PAYMENT_REJECTED':
          console.error('Payment was rejected by facilitator')
          break
        case 'NETWORK_ERROR':
          console.error('Solana network error')
          break
        default:
          console.error('Payment error:', error.message)
      }
    } else {
      console.error('Request error:', error)
    }
    throw error
  }
}

Next Steps