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

# With Express

> Accept Armory payments in Express

Accept crypto payments in your Express API with the Armory middleware.

## Installation

```bash theme={null}
# npm
npm install @armory-sh/middleware-express

# yarn
yarn add @armory-sh/middleware-express

# pnpm
pnpm add @armory-sh/middleware-express

# bun
bun add @armory-sh/middleware-express
```

## Quick Start

```typescript theme={null}
import express from 'express';
import { paymentMiddleware } from '@armory-sh/middleware-express';

const app = express();

// Protect all routes with payment
app.use(paymentMiddleware({
  requirements: {
    to: '0xYourWalletAddress...',
    amount: 1000000n, // 1 USDC (6 decimals)
    expiry: Date.now() + 3600 * 1000,
    chainId: 'eip155:8453',
    assetId: 'eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
  }
}));

app.get('/api/data', (req, res) => {
  res.json({ message: 'Payment successful!' });
});

app.listen(3000);
```

***

## Accessing Payment Info

The middleware attaches payment information to every request:

```typescript theme={null}
app.get('/api/user', (req, res) => {
  const { payerAddress, payload, version } = req.payment;

  res.json({
    message: `Hello ${payerAddress}`,
    paid: payload.amount
  });
});
```

***

## Protecting Specific Routes

You can apply the middleware to specific routes only:

```typescript theme={null}
// Public route — no payment required
app.get('/api/public', (req, res) => {
  res.json({ message: 'Anyone can access this' });
});

// Protected route — payment required
app.get('/api/premium',
  paymentMiddleware({ /* config */ }),
  (req, res) => {
    res.json({ message: 'Paid content' });
  }
);
```

## Route Configuration

For per-route pricing or requirements, use `routeAwarePaymentMiddleware`:

```typescript theme={null}
import { routeAwarePaymentMiddleware } from '@armory-sh/middleware-express';

app.use('/api', routeAwarePaymentMiddleware({
  '/api/basic': { requirements: basicRequirements },
  '/api/premium': { requirements: premiumRequirements },
}));
```

***

## Tips

<Tip>
  Want to accept payments on Base using USDC? Use token address `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` with 6 decimals.
</Tip>

<Note>
  Express middleware runs sequentially — place `paymentMiddleware` before any routes that require payment protection.
</Note>

***

## More Information

See [`@armory-sh/middleware-express`](/packages/middleware-express) for full configuration options.
