Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.monkepay.xyz/llms.txt

Use this file to discover all available pages before exploring further.

Hono

import { Hono } from 'hono'
import { MonkePayHono } from '@monkepay/sdk'

const app = new Hono()

const monkePay = MonkePayHono({
  apiKeyId: process.env.MONKEPAY_API_KEY_ID!,
  apiKeySecret: process.env.MONKEPAY_API_KEY_SECRET!,
  price: '0.001', // default — used if no override
})

app.use('/api/cheap', monkePay({ price: '0.001' }))
app.use('/api/expensive', monkePay({ price: '0.10' }))
app.use('/api/report', monkePay({ price: '1.00', paymentMode: 'one_time' }))

app.get('/api/cheap', (c) => c.json({ result: 'cheap' }))
app.get('/api/expensive', (c) => c.json({ result: 'expensive' }))
app.get('/api/report', (c) => c.json({ result: 'report' }))

Express

import express from 'express'
import { MonkePayExpress } from '@monkepay/sdk'

const app = express()

const monkePay = MonkePayExpress({
  apiKeyId: process.env.MONKEPAY_API_KEY_ID!,
  apiKeySecret: process.env.MONKEPAY_API_KEY_SECRET!,
  price: '0.001',
})

app.get('/api/cheap', monkePay({ price: '0.001' }), (req, res) => {
  res.json({ result: 'cheap' })
})

app.get('/api/expensive', monkePay({ price: '0.10' }), (req, res) => {
  res.json({ result: 'expensive' })
})

app.get('/api/report', monkePay({ price: '1.00', paymentMode: 'one_time' }), (req, res) => {
  res.json({ result: 'report' })
})

Fastify

Fastify requires routes to be registered inside setup() for hooks to fire correctly. Each price tier gets its own app.register() call:
import Fastify from 'fastify'
import { MonkePayFastify } from '@monkepay/sdk'

const app = Fastify()

const monkePay = MonkePayFastify({
  apiKeyId: process.env.MONKEPAY_API_KEY_ID!,
  apiKeySecret: process.env.MONKEPAY_API_KEY_SECRET!,
  price: '0.001',
})

app.register(monkePay({
  price: '0.001',
  setup: (scope) => {
    scope.get('/api/cheap', async () => ({ result: 'cheap' }))
  },
}))

app.register(monkePay({
  price: '0.10',
  setup: (scope) => {
    scope.get('/api/expensive', async () => ({ result: 'expensive' }))
  },
}))

app.register(monkePay({
  price: '1.00',
  paymentMode: 'one_time',
  setup: (scope) => {
    scope.get('/api/report', async () => ({ result: 'report' }))
  },
}))
See the Fastify adapter docs for why setup() is required.

Next.js

Pass overrides as the second argument to the route wrapper:
// app/api/data/route.ts
import { MonkePayNext } from '@monkepay/sdk/next'
import { NextResponse } from 'next/server'

const monkePay = MonkePayNext({
  apiKeyId: process.env.MONKEPAY_API_KEY_ID!,
  apiKeySecret: process.env.MONKEPAY_API_KEY_SECRET!,
  price: '0.001',
})

export const GET = monkePay(
  async () => NextResponse.json({ result: 'cheap' })
)

export const POST = monkePay(
  async (req) => NextResponse.json({ result: 'expensive' }),
  { price: '0.10' }
)
For different prices on different routes, create a new MonkePayNext instance per route file or pass overrides inline.
// app/api/report/route.ts — different file, different price
import { MonkePayNext } from '@monkepay/sdk/next'
import { NextResponse } from 'next/server'

const monkePay = MonkePayNext({
  apiKeyId: process.env.MONKEPAY_API_KEY_ID!,
  apiKeySecret: process.env.MONKEPAY_API_KEY_SECRET!,
  price: '1.00',
  paymentMode: 'one_time',
})

export const GET = monkePay(async () => NextResponse.json({ report: '...' }))