open-index/open-npm huggingface dataset:
npm package: @payweave/express
Description: Express middleware for PayWeave - accept per-request USD micropayments on any Express route.
Latest version: 0.0.3

# @payweave/express

Express middleware for PayWeave - accept per-request USD micropayments on any Express route.

## Install

```bash
npm install @payweave/express
```

## Quick Start

```typescript
import { Payweave } from '@payweave/express';
import express from 'express';

const app = express();
const payweave = new Payweave(
  process.env.PAYWEAVE_APP_ID!,
  process.env.PAYWEAVE_APP_SECRET!
);

app.get(
  '/api/weather',
  payweave.charge({ price: '0.001', description: 'Weather API' }),
  (req, res) => {
    res.json({ temp: 72, unit: 'F' });
  }
);

app.listen(3000);
```

## API

### `new Payweave(appId, appSecret, baseUrl?)`

| Parameter | Type | Description |
|-----------|------|-------------|
| `appId` | `string` | Your app key ID |
| `appSecret` | `string` | Your app secret |
| `baseUrl` | `string?` | API base URL (defaults to `https://api.payweave.app`) |

### `payweave.charge(options)`

Returns Express middleware `(req, res, next) => Promise<void>`.

| Option | Type | Description |
|--------|------|-------------|
| `price` | `string \| (req) => string \| Promise<string>` | USD price per request |
| `description` | `string?` | Human-readable description |
| `meta` | `Record<string, string>?` | API metadata for agent discovery |

## Examples

### Static pricing

```typescript
app.get(
  '/api/search',
  payweave.charge({ price: '0.01' }),
  (req, res) => {
    res.json({ results: [] });
  }
);
```

### Dynamic pricing

```typescript
app.post(
  '/api/generate',
  payweave.charge({
    price: (req) => req.body.premium ? '0.05' : '0.01',
    description: 'Text generation API',
  }),
  (req, res) => {
    res.json({ text: 'generated content' });
  }
);
```

### With metadata for agent discovery

```typescript
app.post(
  '/api/sentiment',
  payweave.charge({
    price: '0.005',
    description: 'Sentiment analysis',
    meta: {
      'method': 'POST',
      'input.content-type': 'application/json',
      'input.schema': '{"type":"object","properties":{"text":{"type":"string"}}}',
      'output.schema': '{"type":"object","properties":{"score":{"type":"number"}}}',
    },
  }),
  (req, res) => {
    res.json({ score: 0.85 });
  }
);
```

### Multiple paid routes

```typescript
app.get('/api/weather', payweave.charge({ price: '0.001' }), weatherHandler);
app.get('/api/forecast', payweave.charge({ price: '0.005' }), forecastHandler);
app.post('/api/analyze', payweave.charge({ price: '0.01' }), analyzeHandler);
```

## How It Works

1. A request hits your route without a payment header
2. The middleware responds with `402 Payment Required` and a `WWW-Authenticate` header containing pricing
3. The agent submits payment on Tempo and retries with `Authorization: Payment <credential>`
4. PayWeave verifies the payment and sets a `Payment-Receipt` header
5. Your handler executes normally

## License

MIT