Quickstarts
AI Gateway quickstart
Send a chat completion through api.pre.dev/v1 with curl or a stock SDK.
Send one chat completion to deepseek/deepseek-v4.1-flash-1017 and read the credits it charged.
Before you start
Copy your pre.dev API key from Integrations → Built-in in the dashboard: pre.dev/projects/integrations for your personal workspace, or the Integrations page of a team workspace. Workspace keys start with pdk_.
Store it as PREDEV_API_KEY. A Free workspace can spend 5 credits on gateway calls in total, whatever its balance; after that, calls return 402 until the workspace subscribes. See authentication and pricing.
Send a request
curl --fail-with-body https://api.pre.dev/v1/chat/completions \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek/deepseek-v4.1-flash-1017",
"messages": [{ "role": "user", "content": "Say hello in five words." }]
}'Install the stock SDK with npm install openai, then set baseURL:
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.pre.dev/v1',
apiKey: process.env.PREDEV_API_KEY!,
});
const completion = await client.chat.completions.create({
model: 'deepseek/deepseek-v4.1-flash-1017',
messages: [{ role: 'user', content: 'Say hello in five words.' }],
});
console.log(completion.choices[0].message.content);Install the stock SDK with pip install openai, then set base_url:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.pre.dev/v1",
api_key=os.environ["PREDEV_API_KEY"],
)
completion = client.chat.completions.create(
model="deepseek/deepseek-v4.1-flash-1017",
messages=[{"role": "user", "content": "Say hello in five words."}],
)
print(completion.choices[0].message.content)Install ai and @ai-sdk/openai, then create a provider with the gateway URL:
import { createOpenAI } from '@ai-sdk/openai';
import { generateText } from 'ai';
const predev = createOpenAI({
baseURL: 'https://api.pre.dev/v1',
apiKey: process.env.PREDEV_API_KEY!,
});
const { text } = await generateText({
model: predev('deepseek/deepseek-v4.1-flash-1017'),
prompt: 'Say hello in five words.',
});
console.log(text);The gateway serves the Anthropic Messages shape at /v1/messages. The Anthropic SDK appends /v1/messages itself, so its base URL is https://api.pre.dev without /v1. Use your pre.dev key as the API key:
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
baseURL: 'https://api.pre.dev',
apiKey: process.env.PREDEV_API_KEY!,
});
const message = await client.messages.create({
model: 'anthropic/claude-sonnet-5',
max_tokens: 256,
messages: [{ role: 'user', content: 'Say hello in five words.' }],
});
console.log(message.content);Model ids stay in catalog form (anthropic/claude-sonnet-5), not Anthropic’s native names. See Messages.
Read the response
The body is a standard chat completion response. Three headers come from the gateway:
| Header | Meaning |
|---|---|
x-predev-request-id | Gateway request id, pdr_…; quote it in support requests |
x-predev-credits-charged | Credits charged for this call |
x-predev-credits-remaining | Workspace balance after the call; omitted when the workspace has no credit limit |
Add -i to the curl command to print them. In the SDKs, use the raw-response helpers (client.chat.completions.with_raw_response in Python, .withResponse() in Node) when you need headers.
Swap the model
Reasoning models spend your max_tokens thinking. Many models reason by default. With a small max_tokens, the reply can come back as content: null with finish_reason: "length" because the whole budget went to reasoning tokens, which are still billed. For chat, summarize, or classify features, pass reasoning: { "enabled": false } (or { "effort": "low" }), or set max_tokens to at least 1024.
Change model to any id from GET /v1/models, for example anthropic/claude-sonnet-5, google/gemini-3.8-flash, or openai/gpt-6-luna. An id the catalog does not serve returns a 4xx error; check the id against the catalog.
Continue with streaming, tools and structured output, or fallbacks and advanced options.