infr.ad

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

ModelContextNotes
deepseek-v4-flash1M The default. Sent when you omit model.
hy3262K Stronger reasoning and coding.
gpt-5.6-luna1M 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.

LimitValueResets
Tokens per day2,000,00000:00 UTC
Compute per day$0.2500:00 UTC
Requests per minute30rolling
Context per request64,000 tokens
GitHub account age30 days

Errors

StatusCodeWhat happened
401invalid_api_key Key rotated or auto-revoked. Generate a new one.
403permission_error Account suspended. Mail us.
400model_not_found We serve three models, listed above.
400context_length_exceeded Over 64,000 tokens in one request.
429rate_limit_exceeded Over 30 requests a minute.
429daily_cap_exceeded Daily token or compute cap reached.
502upstream_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.