⚡ No API key required — Free forever

AharAPI

Free Universal AI API. OpenAI-compatible, blazing fast streaming, tool calling, vision, audio transcription, and a terminal sandbox agent. One model everywhere.

Explore Models → See Examples
bash — aharapi
AHAR API Free Universal AI API $ curl https://api.aharbot.qzz.io/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"ahari","messages":[{"role":"user","content":"Hello!"}]}' {"choices":[{"message":{"content":"Hi! How can I help?"}}]} # No API key. No signup. Just works.
Live Endpoint
Base URL

https://api.aharbot.qzz.io/v1

CheckMethodEndpoint
HealthGET/health
ModelsGET/v1/models
StatusGET/v1/status
ChatPOST/v1/chat/completions
AgentPOST/v1/agent/run
AudioPOST/v1/audio/transcriptions
Features
Everything you need

One Gemma model handles chat, vision, and tool calling. No provider juggling.

🔑

100% Free & Keyless

No API key needed. All real keys live inside Railway environment variables only. Fork, deploy, done.

Blazing Fast Streaming

Realtime token-by-token output over Server-Sent Events. Gemma thinking blocks stream as reasoning_content.

🧠

Tool Calling

Gemma handles OpenAI-style tools natively. Plug your own functions and let the model decide.

🖼️

Vision

Send images as base64 data URIs or public URLs. Same Gemma model understands them — no separate vision model.

🤖

Terminal Sandbox Agent

AI runs real shell commands, creates files, runs servers, and hands you public download links to anything it built.

🎙️

Audio Transcription

Whisper speech-to-text via Groq (whisper-large-v3-turbo). The only part using Groq.

🌐

CORS Open

Works directly from browser JavaScript. No proxy needed.

🛡️

Rate Limited

Per-IP, in-memory rate limiting keeps the free tier fair. Default 120 req/min/IP.

Models
One model, everything

Gemma gemma4 via Ollama — chat, vision, and tool calling all in one.

ahari

Gemma gemma4

Default model. Chat, vision, tool calling.

ahari-vision

Gemma gemma4

Same model, alias kept for clarity. Any request with an image stays on Gemma.

ahari-fast

Gemma gemma4

Fast alias. Routes to the same Gemma backend.

ollama/<model>

Any Ollama model

Access any Ollama model directly by name.

groq/<model>

Any Groq model

Chat passthrough. Groq is mainly used for audio transcription.

unknown name

Falls back to Gemma

Always routes to gemma4.

Examples
Works with every language

OpenAI-compatible. Copy-paste any example as-is.

bash
curl https://api.aharbot.qzz.io/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ahari",
    "stream": true,
    "messages": [{"role": "user", "content": "Tell me a fun fact about space"}]
  }'

Gemma thinking blocks arrive in the stream as delta.reasoning_content before the final answer.

python
from openai import OpenAI

client = OpenAI(base_url="https://api.aharbot.qzz.io/v1", api_key="unused")

stream = client.chat.completions.create(
    model="ahari",
    messages=[{"role": "user", "content": "Write a haiku about APIs"}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")
javascript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.aharbot.qzz.io/v1",
  apiKey: "unused",
});

const stream = await client.chat.completions.create({
  model: "ahari",
  messages: [{ role: "user", content: "Hello!" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
go
payload, _ := json.Marshal(map[string]any{
    "model": "ahari",
    "messages": []map[string]string{
        {"role": "user", "content": "Say hi!"},
    },
})
req, _ := http.NewRequest("POST",
    "https://api.aharbot.qzz.io/v1/chat/completions",
    bytes.NewReader(payload))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
// ... read resp.Body
javascript
const res = await fetch("https://api.aharbot.qzz.io/v1/chat/completions", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "ahari",
    stream: true,
    messages: [{ role: "user", content: "Hello!" }],
  }),
});
const reader = res.body.getReader();
// decode SSE lines and append chunk.choices[0].delta.content
bash — tool calling
curl https://api.aharbot.qzz.io/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ahari",
    "messages": [{"role": "user", "content": "What is the weather in Paris? Use the weather tool."}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get weather for a city",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }]
  }'
python — vision
import base64
from openai import OpenAI

client = OpenAI(base_url="https://api.aharbot.qzz.io/v1", api_key="unused")
b64 = base64.b64encode(open("cat.png", "rb").read()).decode()

resp = client.chat.completions.create(
    model="ahari",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What is in this image?"},
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
        ],
    }],
)
print(resp.choices[0].message.content)

Any request containing an image automatically stays on Gemma — no separate vision model needed.

bash — audio transcription
curl https://api.aharbot.qzz.io/v1/audio/transcriptions \
  -F "file=@meeting.m4a" \
  -F "model=whisper-large-v3-turbo"
# => {"text": "..."}
python — audio transcription
from openai import OpenAI

client = OpenAI(base_url="https://api.aharbot.qzz.io/v1", api_key="unused")
with open("meeting.m4a", "rb") as f:
    result = client.audio.transcriptions.create(
        model="whisper-large-v3-turbo", file=f)
print(result.text)
Agent Mode
Terminal sandbox + download links

The AI can run real shell commands, install packages, create files, run servers, and hand you public download links.

bash — agent
curl https://api.aharbot.qzz.io/v1/agent/run \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{"role": "user", "content":
      "Build a tiny HTML page, put a countdown timer in it,
       then give me the link to download it"}]
  }'

The response is a stream of events:

event: tool → {"type":"tool","name":"write_file","arguments":{...}}
event: tool_result → {"type":"tool_result","name":"write_file","result":{...}}
event: delta → {"type":"delta","content":"..."} (final answer tokens)
event: done → {"type":"done","content":"...", "usage":{...}, "steps":2}

Set "stream": false to get a single JSON response instead.

Agent Tools

ToolWhat it does
terminalRun any shell command in the sandbox (with timeout)
write_file / read_file / list_filesWork with files inside the sandbox
serve_fileCreates a public download link like /files/hello.py
web_searchGoogle Custom Search (needs GOOGLE_API_KEY + GOOGLE_CSE_ID)
python — agent streaming
import json, requests

r = requests.post("https://api.aharbot.qzz.io/v1/agent/run", json={
    "messages": [{"role": "user", "content":
        "Create a python script that prints the first 10 Fibonacci numbers, run it, and give me the download link"}],
}, stream=True)

for line in r.iter_lines():
    if line:
        print(line.decode())