npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@x402fly/express

v0.1.2

Published

Express.js middleware and decorators for 402fly payment protocol

Readme

@402fly/express

Express.js middleware and utilities for implementing the X402 payment protocol in your web applications.

Overview

The Express package provides middleware and helper functions to easily add X402 payment requirements to your Express.js routes. It handles payment verification, 402 response generation, and integrates seamlessly with Solana blockchain payments.

Features

  • Payment Middleware: Easy-to-use paymentRequired() middleware for protecting routes
  • Automatic Verification: Built-in payment verification using Solana blockchain
  • Flexible Configuration: Global configuration or per-route options
  • 402 Response Builder: Helper function for creating proper 402 responses
  • TypeScript Support: Full type definitions for Express request extensions

Installation

npm install @402fly/express
# or
pnpm add @402fly/express
# or
yarn add @402fly/express

Usage

Basic Setup with Global Configuration

import express from 'express';
import { initFly402, paymentRequired } from '@402fly/express';

const app = express();

// Initialize X402 with global configuration
initFly402({
  paymentAddress: 'YourSolanaWalletAddress',
  tokenMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC
  network: 'solana-devnet',
  autoVerify: true
});

// Protect a route with payment requirement
app.get('/premium-content',
  paymentRequired({
    amount: '1000000', // 1 USDC (6 decimals)
    description: 'Access to premium content'
  }),
  (req, res) => {
    // This code only runs after payment is verified
    res.json({
      content: 'Premium content here',
      paidBy: req.payment?.publicKey
    });
  }
);

app.listen(3000, () => console.log('Server running on port 3000'));

Per-Route Configuration

import { paymentRequired } from '@402fly/express';

// Override global config for specific routes
app.get('/api/data',
  paymentRequired({
    amount: '500000',
    paymentAddress: 'SpecificWalletAddress',
    tokenMint: 'So11111111111111111111111111111111111111112', // Native SOL
    network: 'solana-mainnet',
    description: 'API data access',
    expiresIn: 300, // 5 minutes
    autoVerify: true
  }),
  (req, res) => {
    res.json({ data: 'Your data here' });
  }
);

Manual Payment Verification

import { paymentRequired } from '@402fly/express';
import { Fly402Request } from '@402fly/express';

app.post('/custom-endpoint',
  paymentRequired({
    amount: '2000000',
    autoVerify: false // Disable automatic verification
  }),
  (req: Fly402Request, res) => {
    // Payment authorization is available but not verified
    const payment = req.payment;

    // Do custom verification logic
    if (payment && customVerificationLogic(payment)) {
      res.json({ success: true });
    } else {
      res.status(403).json({ error: 'Payment verification failed' });
    }
  }
);

Building 402 Responses Manually

import { build402Response } from '@402fly/express';

app.get('/custom-protected', (req, res) => {
  // Check some condition
  if (!userHasPaid) {
    const response = build402Response({
      amount: '1000000',
      paymentAddress: 'YourWalletAddress',
      tokenMint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
      network: 'solana-devnet',
      resource: req.path,
      description: 'Custom payment required'
    });

    return res.status(402).json(response);
  }

  res.json({ content: 'Protected content' });
});

Configuration Options

import { initFly402, Fly402ConfigOptions } from '@402fly/express';

const config: Fly402ConfigOptions = {
  paymentAddress: string;      // Your Solana wallet address
  tokenMint: string;            // Token mint address (SPL token or SOL)
  network: string;              // 'solana-devnet' or 'solana-mainnet'
  rpcUrl?: string;              // Optional custom RPC endpoint
  autoVerify?: boolean;         // Auto-verify payments (default: true)
  expiresIn?: number;           // Payment expiration in seconds (default: 600)
};

initFly402(config);

Accessing Payment Information

import { Fly402Request } from '@402fly/express';

app.get('/payment-info',
  paymentRequired({ amount: '1000000' }),
  (req: Fly402Request, res) => {
    const payment = req.payment;

    res.json({
      paymentId: payment?.paymentId,
      amount: payment?.actualAmount,
      payer: payment?.publicKey,
      transactionHash: payment?.transactionHash,
      timestamp: payment?.timestamp
    });
  }
);

API Reference

Middleware

paymentRequired(options: PaymentRequiredOptions)

Middleware that requires payment to access a route.

Options:

  • amount: string - Required payment amount in token base units
  • paymentAddress?: string - Override global payment address
  • tokenMint?: string - Override global token mint
  • network?: string - Override global network
  • description?: string - Payment description
  • expiresIn?: number - Payment expiration in seconds
  • autoVerify?: boolean - Enable automatic verification

Configuration

initFly402(config: Fly402ConfigOptions)

Initialize global X402 configuration.

getConfig()

Get current configuration.

isInitialized()

Check if X402 is initialized.

Response Builders

build402Response(options: Build402ResponseOptions)

Build a 402 Payment Required response object.

Documentation

For complete API documentation and guides, visit 402fly.github.io

Testing

pnpm test

Contributing

See CONTRIBUTING.md

License

MIT - See LICENSE