@payweave/express
Express middleware for PayWeave - accept per-request USD micropayments on any Express route.
Install
npm install @payweave/express
Quick Start
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?)
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>.
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
app.get(
'/api/search',
payweave.charge({ price: '0.01' }),
(req, res) => {
res.json({ results: [] });
}
);
Dynamic pricing
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
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
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
- A request hits your route without a payment header
- The middleware responds with
402 Payment Required and a WWW-Authenticate header containing pricing
- The agent submits payment on Tempo and retries with
Authorization: Payment <credential>
- PayWeave verifies the payment and sets a
Payment-Receipt header
- Your handler executes normally
License
MIT