Client‑agnostic by design. If your client can call an OpenAI‑style HTTP API, it works with Paywalls. In most cases you only change the baseURL and the API key — no new SDK integration or code changes required.
Works with: official OpenAI SDK, Vercel AI SDK, OpenRouter SDK, community clients, and plain HTTP requests. Edge/serverless runtimes are supported.
Compatibility: Chat Completions (including streaming), tools/function‑calling, JSON/structured outputs.
OpenAI SDK
import OpenAI from "openai";
const user = "user_123"; // Stable, pseudonymous user ID
const client = new OpenAI({
apiKey: process.env.PAYWALLS_API_KEY, // Set your Paywalls API key here
baseURL: "https://api.paywalls.ai/v1", // Change baseURL to Paywalls
headers: {
"X-Paywall-User": user // Identify the end user
}
});
const stream = await client.chat.completions.create({
model: "gpt-5",
user: "user_123",
stream: true,
messages: [
{ role: "user", content: "Explain usage-based pricing in 2 lines." },
],
});
for await (const chunk of stream) {
const delta = chunk.choices?.[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
from openai import OpenAI
import os
client = OpenAI(api_key=os.environ["PAYWALLS_API_KEY"], base_url="https://api.paywalls.ai/v1")
with client.chat.completions.create(
model="openai/gpt-4o-mini",
user="user_123",
stream=True,
messages=[{"role": "user", "content": "Explain usage-based pricing in 2 lines."}],
) as stream:
for event in stream:
delta = event.choices[0].delta.content if event.choices and event.choices[0].delta else None
if delta:
print(delta, end="")
Vercel AI SDK with Next.js
Next.js API route
Client component
import { streamText } from 'ai'
import { createOpenAI } from '@ai-sdk/openai'
export async function POST(request: Request) {
const { messages } = await request.json()
const user = "user_123" // Stable, pseudonymous user ID
const monetizedAI = createOpenAI({
apiKey: process.env.PAYWALLS_API_KEY, // Your Paywalls API key
baseURL: 'https://api.paywalls.ai/v1', // Change baseURL to Paywalls
headers: {
"X-Paywall-User": user // Identify the end user
}
})
const result = await streamText({
model: monetizedAI('gpt-5'),
messages
})
return result.toAIStreamResponse()
}
'use client'
import { useChat } from 'ai/react'
export default function PersonalAssistant() {
const { messages, input, handleInputChange, handleSubmit } = useChat()
return (
<div className="flex flex-col h-screen max-w-2xl mx-auto p-4">
<div className="flex-1 overflow-y-auto space-y-4">
{messages.map((message) => (
<div
key={message.id}
className={`p-4 rounded-lg ${
message.role === 'user' ? 'bg-blue-100 ml-auto' : 'bg-gray-100'
}`}
>
<p>{message.content}</p>
</div>
))}
</div>
<form onSubmit={handleSubmit} className="mt-4">
<input
value={input}
onChange={handleInputChange}
placeholder="Tell me about yourself or ask me anything..."
className="w-full p-2 border rounded"
/>
</form>
</div>
)
}
OpenRouter
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
import { streamText } from "ai";
const openrouter = createOpenRouter({
apiKey: process.env.PAYWALLS_API_KEY, // Your Paywalls API key
baseURL: "https://api.paywalls.ai/v1", // Change baseURL to Paywalls
headers: {
"X-Paywall-User": "user_123", // Stable, pseudonymous user ID
},
});
const model = openrouter("anthropic/claude-3.7-sonnet:thinking");
await streamText({
model,
messages: [{ role: "user", content: "Hello" }],
});
Together AI
import Together from "together-ai";
const client = new Together({
apiKey: process.env.PAYWALLS_API_KEY, // Your Paywalls API key
baseURL: "https://api.paywalls.ai/v1", // Change baseURL to Paywalls
headers: {
"X-Paywall-User": "user_123", // Stable, pseudonymous user ID
},
});
const chatCompletion = await client.chat.completions.create({
messages: [
{ role: "user", content: "Explain usage-based pricing in 2 lines." },
],
model: "mistralai/Mixtral-8x7B-Instruct-v0.1",
});
console.log(chatCompletion.choices);
Environment Setup
Ensure you have your Paywalls API key set in your environment variables:
PAYWALLS_API_KEY="your_paywalls_api_key_here"
Always send a stable, pseudonymous user id. For browser-only apps, do not expose your paywall key — use a server or edge function.