In this quickstart, you will add Circle Gateway payment middleware to an Express API so that it accepts gasless USDC payments via the x402 protocol. By the end, your API will returnDocumentation Index
Fetch the complete documentation index at: https://developers.circle.com/llms.txt
Use this file to discover all available pages before exploring further.
402 Payment Required for unpaid requests and serve
resources when a valid payment signature is provided.
Prerequisites
Before you begin, ensure you have:- Node.js v18 or later and npm installed.
- An EVM wallet address where you want to receive USDC payments.
Step 1: Set up your project
1.1. Create a new project
Create a new directory and initialize a Node.js project:1.2. Install dependencies
1.3. Initialize TypeScript
Create atsconfig.json file:
tsconfig.json file:
Step 2: Create the server
Create a new fileserver.ts with an Express app and the Gateway middleware:
server.ts
0xYOUR_WALLET_ADDRESS with the EVM address where you want to receive
payments. By default, the middleware accepts payments from all Gateway-supported
blockchains.
Step 3: Protect a route
Usegateway.require() to protect any route with a price. When a request
arrives without a valid payment, the middleware returns 402 Payment Required
with the payment details. When a valid payment signature is attached, the
middleware settles it with Gateway using the
Settle x402 Payment API
endpoint and calls next():
server.ts
Step 4: Test the server
4.1. Start the server
4.2. Send an unpaid request
In a separate terminal, usecurl to verify the server returns a 402
response:
402 Payment Required response with a JSON body containing the
accepts array with payment options.
4.3. Pay with a buyer client
Use the buyer quickstart client to make a gasless payment to your server:Advanced: Use BatchFacilitatorClient directly
If you are not using Express, or need custom logic like dynamic pricing, use the
BatchFacilitatorClient directly. The settle() method calls the
Settle x402 Payment API
endpoint:
server.ts
Gateway’s
settle() endpoint is optimized for low latency and guarantees
settlement. Use settle() directly rather than calling verify() followed by
settle() in production flows.Limit accepted networks (optional)
By default, the middleware accepts payments from any Gateway-supported blockchain, discovered through the Get Supported x402 Payment Kinds API endpoint. This maximizes your reach since any buyer with a Gateway balance can pay you, regardless of which blockchain they deposited on. If you need to restrict payments to specific networks:Payment signatures must have at least 3 days of validity. The
validBefore
timestamp in the buyer’s EIP-3009 authorization must be at least 3 days in the
future, or Gateway will reject it.