1. Install
2. Create a PayKit instance
3. Mount the catch-all route
createEndpointHandlers generates handlers for every PayKit resource. Mount them behind a single catch-all API route:
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
Up and running in under a minute.
npm install @paykit-sdk/core @paykit-sdk/stripe
import { PayKit, createEndpointHandlers } from '@paykit-sdk/core';
import { stripe } from '@paykit-sdk/stripe';
export const paykit = new PayKit(stripe());
export const endpoints = createEndpointHandlers(paykit);
createEndpointHandlers generates handlers for every PayKit resource. Mount them behind a single catch-all API route:
import { endpoints } from '@/lib/paykit';
import type {
EndpointArgs,
EndpointHandler,
EndpointPath,
} from '@paykit-sdk/core';
import { NextRequest, NextResponse } from 'next/server';
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ endpoint: string[] }> },
) {
const { endpoint: endpointArray } = await params;
const endpoint = ('/' + endpointArray.join('/')) as EndpointPath;
const handler = endpoints[endpoint] as EndpointHandler<
typeof endpoint
>;
if (!handler) {
return NextResponse.json(
{ message: 'Endpoint not found' },
{ status: 404 },
);
}
const body = await request.json();
const { args } = body as { args: EndpointArgs<typeof endpoint> };
try {
const result = await handler(...args);
return NextResponse.json({ result });
} catch (error) {
return NextResponse.json(
{
message:
error instanceof Error
? error.message
: 'Internal server error',
},
{ status: 500 },
);
}
}
const webhook = paykit.webhooks
.setup({ webhookSecret: process.env.STRIPE_WEBHOOK_SECRET! })
.on('payment.created', async event => {
console.log(event.data);
});
await webhook.handle({
body: rawBody,
headersAsObject: Object.fromEntries(request.headers),
fullUrl: request.url,
});
import { paystack } from '@paykit-sdk/paystack';
export const paykit = new PayKit(paystack());