Dobby is freeeeeee — no key, no signup, no card. We don't read docs, we call the endpoint and publish what came back, including the 402s.
One call, then you are calling an LLM
Free LLM API endpoints, tested every hour. Ask what is answering right now.
Base URL, model ID, whether a key is needed, what a real probe proved. Ranked, so models[0] is the pick and the rest are your fallbacks — which you will want, because keyless quotas are per-IP and the one that answered us can refuse you.
curl -s https://stillworks.supercapybara.com/api/llm/upmodelopenai_base_urlauthlatency_msansweredlast_okproved[]claimed_unproved[]failed[]?feature=tools,vision narrows it to what a real call provedimport json, urllib.request
from openai import OpenAI
shelf = json.load(urllib.request.urlopen(
"https://stillworks.supercapybara.com/api/llm/up"))
for endpoint in shelf["models"]: # already ranked, best first
client = OpenAI(base_url=endpoint["openai_base_url"],
api_key="not-needed")
try:
reply = client.chat.completions.create(
model=endpoint["model"],
messages=[{"role": "user", "content": "hello"}],
)
except Exception:
continue # your IP hit its quota — next
print(endpoint["model"], reply.choices[0].message.content)
breakimport OpenAI from "openai";
const shelf = await fetch("https://stillworks.supercapybara.com/api/llm/up")
.then((response) => response.json());
for (const endpoint of shelf.models) { // already ranked, best first
const client = new OpenAI({
baseURL: endpoint.openai_base_url,
apiKey: "not-needed",
});
try {
const reply = await client.chat.completions.create({
model: endpoint.model,
messages: [{ role: "user", content: "hello" }],
});
console.log(endpoint.model, reply.choices[0].message.content);
break;
} catch { continue; } // your IP hit its quota — next
}# whatever your JSON tool is, the two fields you need are the same
read BASE MODEL < <(curl -s https://stillworks.supercapybara.com/api/llm/up \
| jq -r '.models[0] | "\(.openai_base_url) \(.model)"')
curl -s "$BASE/chat/completions" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL\",
\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}"No key needed first, then by how much of the last week each one answered, then by speed. None of it is a promise about the next minute — that is what the timestamps are for. Click any row for its snippet.
| Expand | Model▲ | Key | Tools | Schema | JSON | Vision | Latency▲ | Answered▲ | Verified▲ | Copy |
|---|---|---|---|---|---|---|---|---|---|---|
| › | qwen3-coder free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 408 ms | 38 h ago | ||
curl .env python node
| ||||||||||
| › | qwen7b free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 474 ms | 14 h ago | ||
curl .env python node
| ||||||||||
| › | mistral free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 481 ms | 3 days ago | ||
curl .env python node
| ||||||||||
| › | qwen-coder free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 519 ms | 2 days ago | ||
curl .env python node
| ||||||||||
| › | openrouter/free kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 574 ms | 1 h ago | ||
curl .env python node
| ||||||||||
| › | kilo-auto/small kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 645 ms | 51 min ago | ||
curl .env python node
| ||||||||||
| › | Qwen3.6-27B ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 730 ms | 12 h ago | ||
curl .env python node
| ||||||||||
| › | qwen3-8b free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 750 ms | 14 h ago | ||
curl .env python node
| ||||||||||
| › | Qwen2.5-VL-72B-Instruct ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it failed | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 817 ms | 1 h ago | ||
curl .env python node
| ||||||||||
| › | Qwen3.5-397B-A17B ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 843 ms | 6 h ago | ||
curl .env python node
| ||||||||||
| › | qwen25-vl free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 869 ms | 38 h ago | ||
curl .env python node
| ||||||||||
| › | qwen-vl free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 978 ms | 2 days ago | ||
curl .env python node
| ||||||||||
| › | deepseek-r1 free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 1098 ms | 4 days ago | ||
curl .env python node
| ||||||||||
| › | dots-studio/dots-3-note-preview:free kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 1296 ms | 3 h ago | ||
curl .env python node
| ||||||||||
| › | deepseek-r1-7b free-ai · api.free.ai/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 1335 ms | 3 days ago | ||
curl .env python node
| ||||||||||
| › | Mistral-Small-3.2-24B-Instruct-2506 ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 3525 ms | 15 h ago | ||
curl .env python node
| ||||||||||
| › | nvidia/nemotron-3.5-super-vl:free kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 613 ms | 1 h ago | ||
curl .env python node
| ||||||||||
| › | nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 869 ms | 51 min ago | ||
curl .env python node
| ||||||||||
| › | Qwen3.5-9B ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 2517 ms | 14 h ago | ||
curl .env python node
| ||||||||||
| › | Qwen3.8-27B ovh-anonymous · oai.endpoints.kepler.ai.cloud.ovh.net/v1 | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 492 ms | 7 h ago | ||
curl .env python node
| ||||||||||
| › | minimax/minimax-m3.1-flash:free kilo-gateway · api.kilo.ai/api/gateway | not needed | Tools: we called it and it worked | Schema: we called it and it worked | JSON: we called it and it worked | Vision: we called it and it worked | 1511 ms | 16 days ago | ||
curl .env python node
| ||||||||||
Checked and not listed (17) — endpoints another catalogue calls free, and what they answered here
Cross-checked against OmniRoute's routing registry. 2026-08-11: 226 providers, 18 typed as needing no key. One new claim on the shelf and no new working endpoint. 2026-10-12: 270 providers, 17 typed as needing no key. Two new working keyless endpoints, Kilo Gateway and Free.ai, now on the shelf. Every other claim failed the chat call, and is listed below with the answer it gave.
- Hack Club AI
https://ai.hackclub.com/proxy/v1 - Listing answers a bare GET with 200 and a full model catalogue; the chat call answers 401 Authentication required. A keyless /v1/models is not a keyless endpoint, and this is the shape most often mistaken for one. Separately scoped to Hack Club members by its own terms.
- Naga
https://api.naga.ac/v1 - Same shape: listing 200, chat 401 authentication_required, with the body directing you to sign up. A free tier behind a signup is the keyed shelf's subject, not this one, and we hold no key.
- Pollinations (gen host)
https://gen.pollinations.ai/v1 - 401 UNAUTHORIZED with no header. Worth stating plainly because the catalogue routes here on the grounds that the older text.pollinations.ai host was retired -- and that older host answered our keyless chat call with 200 on the same day. The retired endpoint is the one still serving anonymously, so that is the one on the shelf.
- g4f.space
https://g4f.space/api/{pollinations,groq,gemini,nvidia,ollama}/v1 - 402 insufficient_credits: "No cake credits. Bake proof-of-work cakes ... to earn anonymous usage." Anonymous, but not free of charge -- the price is compute rather than a key. Nothing an OpenAI client can pay, so it cannot be published as an endpoint that works right now.
- MiMo (Xiaomi)
https://api.xiaomimimo.com/v1 - 401 invalid_key on both the listing and the chat call.
- TheOldLLM
https://theoldllm.vercel.app/api/chatgpt - 403 at the edge. The same catalogue's own free-tier research lists this provider as having no current free tier, so the registry entry and the documentation disagree; the call settles it.
- AI Horde
https://oai.aihorde.net/v1/chat/completions - 401 {"detail":"Authorization header missing"} with no header, on 2026-10-12. The same call with its documented public anonymous key (ten zeros) as a bearer token answered 200 on koboldcpp/Angelic_Eclipse-12B, so it is free, and open to anyone, but it is a key: this shelf lists only calls that carry no Authorization header at all. Volunteer-worker queue, latency in minutes on a busy day.
- OpenCode Free
https://opencode.ai/zen/v1/chat/completions - Listing answers a bare GET with 200 and names the free models; the chat call answers 403 FreeTierError: "OpenCode's free tier can only be used from within OpenCode". The body says why, so this is a policy and not a bare 403 -- the free tier is gated on the client, not the credential, and an OpenAI client is not that client.
- Cloudflare AI Playground
https://playground.ai.cloudflare.com - 405 on POST /chat/completions. The source catalogue reaches it by driving a headless Chromium against the playground page, not by an API: there is no OpenAI-style endpoint to hand a client. Same class as the scraped web UIs below, and rejected for the same reason.
- UC (uncensored.com persona)
wss://internal-6.pubyar.com - Not an HTTP chat endpoint. The catalogue's own source describes a WebSocket session minted from an account cookie after an email-code login on a subscription product. That is an account, not a free call, and it cannot be probed by a request with no credential. (GET / on the host answers 200 with a status object; POST /chat/completions answers 404.)
- FriendliAI
https://api.friendli.ai/serverless/v1 - The catalogue's free-tier list tags it keyless. Listing answers 200 and the chat call answers 401 {"detail":"Unauthorized. Please provide a valid credential."}: the listing-is-not-an-endpoint shape again.
- Liquid AI
https://inference.liquid.ai/v1 - Tagged keyless in the catalogue's free-tier list. Both the listing and the chat call answer 403 {"detail":"Not authenticated"}. The body says who is missing, so this is a request for a credential and not a block.
- Blackbox AI
https://api.blackbox.ai/v1 - Tagged keyless in the catalogue's free-tier list. 404 on both the listing and the chat call at the URL the catalogue gives, and 404 on /chat/completions at the host root, so nothing here answered a chat call with or without a key.
- iFlytek Spark / SparkDesk
https://spark-api-open.xf-yun.com/v1 - Tagged keyless in the catalogue's free-tier list. 401 {"message":"Unauthorized"} on the chat call. The two catalogue entries are the same URL.
- Registry entries added since 2026-08-11
52 providers, one anonymous chat call each, 2026-10-12 - None of these is typed keyless by the catalogue, so none was a claim; they were called anyway because a typed key and a working keyless call are not the same thing, and Free.ai is the proof. Of 52 calls: 38 answered 401 or a body asking for a key, 3 answered 400 (one of which, Free.ai, answered 200 once given a model it serves and is on the shelf), 6 answered 404 and 2 answered 405 because they are not OpenAI-shaped (browser-driven or proprietary paths -- not a measurement of the provider), and 3 gave a 5xx from the host (void-ai, tabitoken, chat-oripe) that says nothing about auth. Unmeasured is not rejected: those five-hundreds can be re-run.
- Web-UI scrapers
duckduckgo-web, felo-web, qwen-web, t3-web, muse-spark-web, veoaifree-web, agy - Not probed, and not a measurement question. These drive somebody's chat website through an adapter; the source catalogue's own terms-of-service table marks every one of them avoid for proxied or non-personal use. An endpoint we would have to breach terms to call is not an endpoint we can tell you to call.
- Vendor agent CLIs
auggie, devin-cli-agentic, kiro, amazon-q, zcode, codex-app-server - Credential-free only in the sense that an installed CLI already holds an OAuth session. There is no URL to hand an OpenAI client, so there is nothing here for this shelf to check.
Free LLM API: questions this shelf answers
Is there a free LLM API that needs no API key?
Yes, a handful, and they come and go. The ones answering right now are on the no-key page, each called with no Authorization header and published with how often it answered.
How often is each endpoint checked?
Every endpoint gets real chat calls every hour. Feature checks (tool calling, JSON schema, vision, image output) run daily. The table above carries 143 models, each with the time it was last verified.
Why can a listed endpoint still fail for me?
Quotas are usually per IP. One that answered this server can return 429 or 402 from yours, which is why the API returns a ranked list to walk.
How do I call one from code?
GET /api/llm/up returns the base URL, model id and auth for what is answering. Parameters and a Python, Node and curl loop are in the reference. If you are choosing between lists, see how they compare.