Build at the speed
of thought.
One API. Every model. Zero vendor lock-in.
Go from zero to your first completion in minutes.
Quickstart
All requests go through one public base URL. Create a key in your dashboard, then send your first request.
curl https://api.pkay.dev/v1/chat/completions \
-H "Authorization: Bearer $PKAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"your-model","messages":[{"role":"user","content":"Hello!"}]}'Or use any OpenAI-compatible SDK — only the base URL and key change.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.PKAY_API_KEY,
baseURL: "https://api.pkay.dev/v1",
});
const res = await client.chat.completions.create({
model: "your-model",
messages: [{ role: "user", content: "Summarize this changelog" }],
});Authentication
Every request needs an Authorization header with your API key. Keys are generated from your dashboard and can be revoked or replaced at any time without downtime.
Authorization: Bearer pkay_********Agentic AI configuration
Pkay works with the most popular agentic coding CLIs. Every tool speaks either the OpenAI or Anthropic protocol, so configuration is just a base URL and your key.

OpenCode
OpenCode speaks the OpenAI protocol — point base URL at Pkay and pick any model with /models.
export OPENAI_API_KEY=pkay_********
export OPENAI_BASE_URL=https://api.pkay.dev/v1
opencodeClaude Code
Pkay exposes an Anthropic-compatible endpoint, so Claude Code works without a proxy.
export ANTHROPIC_AUTH_TOKEN=pkay_********
export ANTHROPIC_BASE_URL=https://api.pkay.dev
claude --model claude-sonnet-5Codex CLI
Add Pkay as a custom provider, then launch codex normally.
model = "gpt-5.6-sol"
model_provider = "pkay"
[model_providers.pkay]
base_url = "https://api.pkay.dev/v1"
env_key = "PKAY_API_KEY"Aider
Prefix any catalog model with openai/ to route it through Pkay.
export OPENAI_API_BASE=https://api.pkay.dev/v1
export OPENAI_API_KEY=pkay_********
aider --model openai/deepseek-v4-proQwen Code
Any model in the catalog is selectable — not just Qwen models.
export OPENAI_API_KEY=pkay_********
export OPENAI_BASE_URL=https://api.pkay.dev/v1
qwen --model kimi-k3Streaming
Set stream: true to receive server-sent events. Each chunk carries a delta you can append directly to your UI.
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0].delta.content ?? "");
}Errors
Errors return a stable JSON shape with a machine-readable code, so retries and alerting stay simple.
{ "error": { "type": "rate_limit_error", "message": "Too many requests", "request_id": "req_9f2a..." } }Rate limits
Requests are metered per API key and per model. When a limit is exceeded the gateway returns rate_limit_error with HTTP 429 — back off and retry. Need higher limits? Contact support and we'll raise them for your key.
