Documentation

Primer x402 TypeScript SDK v1.1.0

Primer ecosystem toolkit for TypeScript. Use with the official x402 SDK packages.

Breaking changes from v0.x. See deprecated TypeScript docs for the old API.

npm @primersystems/x402

Installation

bash
npm install @primersystems/x402

Peer Dependencies

The SDK requires @x402/core as a peer dependency:

bash
# For Express middleware
npm install @x402/core @x402/express

# For Hono middleware
npm install @x402/core @x402/hono

# For Prism (ERC-20 payments)
npm install viem

Facilitator Client

Create a pre-configured client for the Primer facilitator:

typescript
import { primerFacilitator, PRIMER_FACILITATOR_URL } from '@primersystems/x402';

// Create facilitator client
const facilitator = primerFacilitator();

// Use with official x402 middleware
import { paymentMiddleware } from '@x402/express';

const routes = {
  '/api/premium': {
    price: '$0.01',
    network: 'eip155:8453',
    payTo: '0xYourWalletAddress'
  }
};

app.use(paymentMiddleware(routes, { facilitator }));

With Hono

typescript
import { Hono } from 'hono';
import { paymentMiddleware } from '@x402/hono';
import { primerFacilitator } from '@primersystems/x402';

const app = new Hono();
const facilitator = primerFacilitator();

const routes = {
  '/v1/*': {
    price: '$0.001',
    network: 'eip155:8453',
    payTo: '0xYourWalletAddress'
  }
};

app.use('/v1/*', paymentMiddleware(routes, { facilitator }));

API Reference

Export Type Description
primerFacilitator(config?) Function Creates an HTTPFacilitatorClient for x402.primer.systems
PRIMER_FACILITATOR_URL string "https://x402.primer.systems"

SKALE Networks

Network constants for SKALE chains:

typescript
import { skaleNetworks, skaleRpcUrls } from '@primersystems/x402';

// Network identifiers (CAIP-2 format)
skaleNetworks.base        // "eip155:1187947933"
skaleNetworks.baseSepolia // "eip155:324705682"

// RPC endpoints
skaleRpcUrls.base        // "https://skale-base.skalenodes.com/v1/base"
skaleRpcUrls.baseSepolia // "https://base-sepolia-testnet.skalenodes.com/v1/..."

Using SKALE Networks

typescript
import { skaleNetworks } from '@primersystems/x402';

const routes = {
  '/api/data': {
    price: '$0.001',
    network: skaleNetworks.base,
    payTo: '0xYourWalletAddress'
  }
};

Robinhood Chain

Network constants for Robinhood Chain (Arbitrum Orbit L2):

typescript
import { robinhoodNetworks, robinhoodRpcUrls } from '@primersystems/x402';

// Network identifiers (CAIP-2 format)
robinhoodNetworks.mainnet // "eip155:4663"
robinhoodNetworks.testnet // "eip155:46630"

// RPC endpoints
robinhoodRpcUrls.mainnet // "https://rpc.mainnet.chain.robinhood.com"
robinhoodRpcUrls.testnet // "https://rpc.testnet.chain.robinhood.com"

Using Robinhood Chain

typescript
import { robinhoodNetworks } from '@primersystems/x402';

const routes = {
  '/api/data': {
    price: '$0.001',
    network: robinhoodNetworks.mainnet,
    payTo: '0xYourWalletAddress'
  }
};

Prism Settlement

Prism enables gasless payments for any ERC-20 token via EIP-712 signatures. Use this for tokens that don't support EIP-3009 (like USDC does).

Creating Payment Payloads

typescript
import {
  createPrismPayload,
  getPrismNonce,
  PRISM_CONTRACT_ADDRESS,
  type PrismPaymentParams,
} from '@primersystems/x402';
import { createWalletClient, createPublicClient, http } from 'viem';
import { base } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';

// Set up viem clients
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const publicClient = createPublicClient({ chain: base, transport: http() });
const walletClient = createWalletClient({
  account,
  chain: base,
  transport: http()
});

// Create a signed payment payload
const payload = await createPrismPayload(walletClient, publicClient, {
  token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC on Base
  to: '0xRecipientAddress',
  value: 1000000n, // 1 USDC (6 decimals)
}, 'eip155:8453');

console.log(payload);
// {
//   x402Version: 2,
//   scheme: "exact",
//   network: "eip155:8453",
//   payload: {
//     signature: "0x...",
//     authorization: {
//       from: "0x...",
//       to: "0x...",
//       value: "1000000",
//       nonce: "0",
//       validAfter: 1234567890,
//       validBefore: 1234571490
//     }
//   }
// }

Prism API Reference

Export Description
createPrismPayload(walletClient, publicClient, params, network) Create a signed EIP-712 payment payload
getPrismNonce(publicClient, user, token) Get current nonce for a user/token pair
PRISM_CONTRACT_ADDRESS 0x402357ff1e18d42d0f14a5d56d6e1ebd741b3a86
PRISM_ABI Contract ABI for direct interaction
ERC20_PAYMENT_TYPES EIP-712 type definitions

PrismPaymentParams

Field Type Required Description
token Address Yes ERC-20 token contract address
to Address Yes Recipient address
value bigint Yes Amount in smallest unit (e.g., wei)
validAfter number No Unix timestamp (default: now - 60s)
validBefore number No Unix timestamp (default: now + 1hr)

CLI

The CLI provides project scaffolding for Bittensor/Chutes AI proxies:

bash
# Create a new Chutes AI proxy
npx @primersystems/x402 create chutes-proxy my-ai-api

# Navigate and install
cd my-ai-api
npm install

# Edit src/worker.ts to set your wallet address

# Set your Chutes API key
wrangler secret put CHUTES_API_KEY

# Run locally
npm run dev

# Deploy to Cloudflare Workers
npm run deploy

Generated Project Structure

text
my-ai-api/
  src/
    worker.ts      # Hono app with x402 middleware
  package.json     # Dependencies and scripts
  wrangler.toml    # Cloudflare Workers config
  tsconfig.json
  README.md
  .gitignore

Default Pricing

The generated proxy includes these endpoints:

Endpoint Price
/v1/chat/completions $0.001
/v1/completions $0.001
/v1/embeddings $0.0001
/v1/images/generations $0.01