Getting started with Express
Start accepting x402 payments in your Express server in 2 minutes.
You can find the full code for this example
here.
Step 1: Create a new server from the starter template
Use your favorite package manager.
npm (npx)
npx @PalPaxAI/x402-express-starter my-first-server
pnpm
pnpm dlx @PalPaxAI/x402-express-starter my-first-server
bun
bunx @PalPaxAI/x402-express-starter my-first-server
The starter mirrors the upstream example and bootstraps a ready-to-run Express server.
Step 2: Set your environment variables
Open your generated project’s .env and set:
FACILITATOR_URL: Facilitator base URL (defaults to: https://facilitator.PalPaxAI.network)
NETWORK: Network to use for the facilitator (default: base-sepolia)
ADDRESS: Wallet public address to receive payments to
FACILITATOR_URL=https://facilitator.PalPaxAI.network
NETWORK=base-sepolia # or base
ADDRESS=0x... # wallet public address you want to receive payments to
# required if using the Base mainnet facilitator
CDP_API_KEY_ID="Coinbase Developer Platform Key"
CDP_API_KEY_SECRET="Coinbase Developer Platform Key Secret"
Step 3: Preview the server code
This is the index.ts the starter generates. It loads your env, applies the x402 payment middleware, defines example routes, and logs the server URL.
import { config } from "dotenv";
import express from "express";
import { paymentMiddleware, Resource } from "x402-express";
config();
const facilitatorUrl = process.env.FACILITATOR_URL as Resource;
const payTo = process.env.ADDRESS as `0x${string}`;
if (!facilitatorUrl || !payTo) {
console.error("Missing required environment variables");
process.exit(1);
}
const app = express();
app.use(
paymentMiddleware(
payTo,
{
"GET /weather": {
// USDC amount in dollars
price: "$0.001",
// network: "base" // uncomment for Base mainnet
network: "base-sepolia",
},
"/premium/*": {
// Define atomic amounts in any EIP-3009 token
price: {
amount: "100000",
asset: {
address: "0xabc",
decimals: 18,
eip712: {
name: "WETH",
version: "1",
},
},
},
// network: "base" // uncomment for Base mainnet
network: "base-sepolia",
},
},
{
url: facilitatorUrl,
},
),
);
app.get("/weather", (req, res) => {
res.send({
report: {
weather: "sunny",
temperature: 70,
},
});
});
app.get("/premium/content", (req, res) => {
res.send({
content: "This is premium content",
});
});
app.listen(4021, () => {
console.log(`Server listening at http://localhost:${4021}`);
});
Step 4: Run the server
Your server is now accepting 402 payments!
Step 5: Test the server
You can test payments against your server locally by following the fetch example or the axios example.
Need help?