> ## Documentation Index
> Fetch the complete documentation index at: https://docs.payai.network/llms.txt
> Use this file to discover all available pages before exploring further.

# Express

## Getting started with Express

Start accepting x402 payments in your Express server in 2 minutes.

<Note>You can find the full code for this example [here](https://github.com/x402-foundation/x402/tree/main/examples/typescript/servers/express).</Note>

### Step 1: Create a project and install dependencies

Use your favorite package manager:

##### npm

```bash theme={null}
mkdir my-server && cd my-server
npm init -y && npm pkg set type=module
npm install express dotenv @payai/facilitator @x402/core @x402/evm @x402/express @x402/extensions @x402/svm
npm install -D typescript tsx @types/express
```

##### pnpm

```bash theme={null}
mkdir my-server && cd my-server
pnpm init && pnpm pkg set type=module
pnpm add express dotenv @payai/facilitator @x402/core @x402/evm @x402/express @x402/extensions @x402/svm
pnpm add -D typescript tsx @types/express
```

##### bun

```bash theme={null}
mkdir my-server && cd my-server
bun init -y
bun add express dotenv @payai/facilitator @x402/core @x402/evm @x402/express @x402/extensions @x402/svm
bun add -d typescript @types/express
```

This is the same dependency set as the [upstream Express example](https://github.com/x402-foundation/x402/tree/main/examples/typescript/servers/express).

### Step 2: Set your environment variables

Create a `.env` file in the project root and set:

```env theme={null}
EVM_ADDRESS=0x...   # EVM wallet address to receive payments
SVM_ADDRESS=...    # Solana wallet address to receive payments
```

<Tip>`@payai/facilitator` automatically connects to the PayAI facilitator — no URL configuration needed.</Tip>

### Step 3: Preview the server code

Create `index.ts`: It loads your env, applies the x402 payment middleware, defines example routes, and logs the server URL.

```ts theme={null}
import { config } from "dotenv";
import express from "express";
import { paymentMiddleware, x402ResourceServer } from "@x402/express";
import { ExactEvmScheme } from "@x402/evm/exact/server";
import { ExactSvmScheme } from "@x402/svm/exact/server";
import { HTTPFacilitatorClient } from "@x402/core/server";
import { declareDiscoveryExtension } from "@x402/extensions/bazaar";
import { facilitator } from "@payai/facilitator";

config();

const evmAddress = process.env.EVM_ADDRESS as `0x${string}`;
const svmAddress = process.env.SVM_ADDRESS;
if (!evmAddress || !svmAddress) {
  console.error("Missing required environment variables");
  process.exit(1);
}

const facilitatorClient = new HTTPFacilitatorClient(facilitator);

const app = express();

app.use(
  paymentMiddleware(
    {
      "GET /weather": {
        accepts: [
          {
            scheme: "exact",
            price: "$0.001",
            network: "eip155:84532",
            payTo: evmAddress,
          },
          {
            scheme: "exact",
            price: "$0.001",
            network: "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
            payTo: svmAddress,
          },
        ],
        description: "Weather data",
        mimeType: "application/json",
        serviceName: "Weather API",
        tags: ["weather", "api"],
        extensions: {
          ...declareDiscoveryExtension({
            output: {
              example: {
                report: {
                  weather: "sunny",
                  temperature: 70,
                },
              },
            },
          }),
        },
      },
    },
    new x402ResourceServer(facilitatorClient)
      .register("eip155:84532", new ExactEvmScheme())
      .register("solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1", new ExactSvmScheme()),
  ),
);

app.get("/weather", (req, res) => {
  res.send({
    report: {
      weather: "sunny",
      temperature: 70,
    },
  });
});

app.listen(4021, () => {
  console.log(`Server listening at http://localhost:${4021}`);
});
```

### Step 4: Run the server

```bash theme={null}
npx tsx index.ts
```

<Check>
  Your server is now accepting 402 payments!
</Check>

### Step 5: Test the server

You can test payments against your server locally by following the [fetch example](/x402/clients/typescript/fetch) or the [axios example](/x402/clients/typescript/axios).

## Going to production

This setup works on the **free tier** out of the box — no API keys required.

When you're ready for production, create a merchant account at [merchant.payai.network](https://merchant.payai.network), get your API keys, and add them to your `.env`:

```env theme={null}
PAYAI_API_KEY_ID=your-key-id
PAYAI_API_KEY_SECRET=your-key-secret
```

The `@payai/facilitator` package automatically detects these environment variables and authenticates your requests to the facilitator. See [Facilitator Pricing](/x402/facilitators/pricing) for tier details and [Facilitator Authentication](/x402/facilitators/authentication) for the full protocol reference.

## x402 reference

For a deeper dive into message shapes, headers, verification and settlement responses, see the [x402 Reference](/x402/reference).

## Need help?

<Card title="Join our Community" icon="discord" href="https://discord.gg/eWJRwMpebQ">
  Have questions or want to connect with other developers? Join our Discord server.
</Card>
