Getting started
Use your API key
Token Relay exposes two upstream-compatible endpoints. Once you have a key, you can keep using your existing OpenAI or Anthropic client libraries — only the base_url and the API key change.
1. Get a key
- Sign in to the developer console.
- Open API keys.
- Click Create API key. Give it a name (something like
local-devorprod-app) and optionally a monthly spend cap in USD. - A token starting with
tsk_appears in the reveal banner. Copy it now — the platform never shows the full token again.
Why reveal-once? The backend only stores a SHA-256 hash of the token. Even an admin with full database access can't recover the original — they can only revoke and reissue.
2. Endpoints
The relay exposes two protocols. Pick the one your client already speaks.
| Protocol | Base URL | Auth header |
|---|---|---|
| OpenAI Chat Completions | https://chinzy.com/v1 | Authorization: Bearer tsk_... |
| Anthropic Messages (streaming) | https://chinzy.com/anthropic/v1 | x-api-key: tsk_... |
3. Pick a model
Pass any of our public model aliases as the model field. The full list is at Models. A few common ones:
gpt-5.2,gpt-5,gpt-5-mini,gpt-5.4-mini— OpenAI familyclaude-sonnet-4.5,claude-haiku-4.5,claude-opus-4.5— Anthropic familydeepseek-v3.2,kimi-k2-thinking,glm-4.6— open-weight families
You always pass the platform alias, never the upstream-specific id. Behind the scenes the relay picks a healthy upstream and routes the call there with automatic failover.
4. Examples
curl
curl https://chinzy.com/v1/chat/completions \
-H "Authorization: Bearer $TOKEN_RELAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.2",
"messages": [
{"role": "user", "content": "Hi in one sentence"}
]
}'Python (OpenAI SDK)
from openai import OpenAI
client = OpenAI(
api_key=os.environ["TOKEN_RELAY_KEY"],
base_url="https://chinzy.com/v1",
)
resp = client.chat.completions.create(
model="gpt-5.2",
messages=[{"role": "user", "content": "Hi in one sentence"}],
)
print(resp.choices[0].message.content)Node.js (OpenAI SDK)
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.TOKEN_RELAY_KEY,
baseURL: 'https://chinzy.com/v1',
});
const resp = await client.chat.completions.create({
model: 'gpt-5.2',
messages: [{ role: 'user', content: 'Hi in one sentence' }],
});
console.log(resp.choices[0].message.content);Anthropic SDK (streaming)
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.TOKEN_RELAY_KEY,
baseURL: 'https://chinzy.com/anthropic',
});
const stream = await client.messages.stream({
model: 'claude-sonnet-4.5',
max_tokens: 512,
messages: [{ role: 'user', content: 'Hi in one sentence' }],
});
for await (const event of stream) {
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
process.stdout.write(event.delta.text);
}
}5. Common errors
| Status | Meaning | Fix |
|---|---|---|
401 | Token missing, malformed, or disabled. | Verify the Authorization header value matches the token from the reveal banner. Check API keys — disabled keys show a red badge. |
402 / 403 "balance too low" | Wallet has no balance to settle this request. | Top up at Billing. |
403 "monthly spend cap reached" | This specific key's monthly quota is exhausted. | Either wait for the next calendar month, raise the cap on API keys, or use a different key. |
429 | You crossed the per-IP rate limit (300 req/min for relay). | Backoff and retry; widen the gap between requests. |
503 | Every upstream that serves this alias is down. Rare — the relay already auto-retries on intermittent failures. | Try a sibling alias (e.g. gpt-5-mini instead of gpt-5.2). If persistent, check your status page. |
6. Tips
- One key per app. Cheap to rotate; lets you disable a leaked credential without breaking other clients.
- Set a monthly cap. A runaway dev loop is much easier to recover from when each key is bounded.
- Watch usage at /console/usage. The page shows per-model + per-key spend, recent calls with status codes, and a CSV export for accounting.
- Streaming is supported on both protocols. Just pass
stream: truein the OpenAI SDK or usemessages.stream()with Anthropic.
Found something missing or wrong in this doc? Open an issue or ping an admin.