Setup
Every client below needs the same two things: a base URL and a key. Get your key, then pick your tool.
export OPENAI_BASE_URL=https://api.infr.ad/v1
export OPENAI_API_KEY=sk-infr-...
Clients
OpenAI SDK — Python
from openai import OpenAI
client = OpenAI(base_url="https://api.infr.ad/v1", api_key="sk-infr-...")
print(client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": "explain sse in one paragraph"}],
).choices[0].message.content)
OpenAI SDK — Node
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.infr.ad/v1",
apiKey: process.env.OPENAI_API_KEY,
});
const r = await client.chat.completions.create({
model: "deepseek-v4-flash",
messages: [{ role: "user", content: "hello" }],
});
aider
export OPENAI_API_BASE=https://api.infr.ad/v1
export OPENAI_API_KEY=sk-infr-...
aider --model openai/deepseek-v4-flash
aider sends long system prompts, so it never crosses the ad threshold. That is by design, not a loophole.
llm (Simon Willison's CLI)
llm install llm-openai-plugin
cat >> "$(dirname "$(llm logs path)")/extra-openai-models.yaml" <<'YAML'
- model_id: infrad
model_name: deepseek-v4-flash
api_base: https://api.infr.ad/v1
api_key_name: infrad
YAML
llm keys set infrad # paste your sk-infr- key
llm -m infrad "hello"
Continue — VS Code and JetBrains
{
"models": [{
"title": "infr.ad",
"provider": "openai",
"model": "deepseek-v4-flash",
"apiBase": "https://api.infr.ad/v1",
"apiKey": "sk-infr-..."
}]
}
Open WebUI
Settings → Connections → OpenAI API. Set the base URL to
https://api.infr.ad/v1 and paste the key. All three models appear in
the picker.
Models
| Model | Context | Notes |
|---|---|---|
| deepseek-v4-flash | 1M | The default. Sent when you omit model. |
| hy3 | 262K | Stronger reasoning and coding. |
| gpt-5.6-luna | 1M | Most capable. Accepts images. Moderated by the provider. |
Reasoning tokens are disabled on all three. They bill as output and this tier is free, so the option is not exposed.
Checking where you stand
curl -s https://api.infr.ad/v1/usage \
-H "Authorization: Bearer $OPENAI_API_KEY"
{"key_id":"a1b2c3d4","tier":"free",
"tokens_today":184320,"tokens_this_month":2931004,
"daily_token_cap":2000000,
"spend_today_usd":0.019,"daily_spend_cap_usd":0.25}
Fair use
Generous by default, and the numbers are here so nothing surprises you. Sign-in is GitHub only, one active key per account, and generating a new key revokes the old one immediately.
| Limit | Value | Resets |
|---|---|---|
| Tokens per day | 2,000,000 | 00:00 UTC |
| Compute per day | $0.25 | 00:00 UTC |
| Requests per minute | 30 | rolling |
| Context per request | 64,000 tokens | — |
| GitHub account age | 30 days | — |
Errors
| Status | Code | What happened |
|---|---|---|
| 401 | invalid_api_key | Key rotated or auto-revoked. Generate a new one. |
| 403 | permission_error | Account suspended. Mail us. |
| 400 | model_not_found | We serve three models, listed above. |
| 400 | context_length_exceeded | Over 64,000 tokens in one request. |
| 429 | rate_limit_exceeded | Over 30 requests a minute. |
| 429 | daily_cap_exceeded | Daily token or compute cap reached. |
| 502 | upstream_auth_failed | Our problem, not yours. Your key is fine. |
Errors come back in the shape the OpenAI SDKs expect, as a
top-level error object.