Documentation

Everything you need to use ZapLLM

ZapLLM is a free tool: connect your ChatGPT account, get an OpenAI-compatible API endpoint, and create keys to use it anywhere. Everything is on this page.

Using it

From zero to a request

1

Install the extension

OpenAI only redirects to localhost, so the browser extension completes the handoff. It is a hard requirement, and the only setup step on your machine.

2

Sign in with ChatGPT

Your account is created from your ChatGPT identity — no password, and nothing to confirm by email. Requests use the plan you already have.

3

Create an API key

The dashboard shows the key once. Only its SHA-256 hash is stored, so a leak of the database exposes no usable key.

4

Point your client at the endpoint

Set the base URL to https://api.zap.dscv.me/v1 and the key as the bearer token. Any OpenAI-compatible SDK or tool works.

The endpoint

The API endpoint is https://api.zap.dscv.me/v1 — the site itself is zap.dscv.me. Point any OpenAI-compatible client there with your key as the bearer token; responses stream back as they arrive.

PathBehaviour
/v1/chat/completionsChat, streaming and non-streaming. The response is OpenAI-shaped, including errors.
/v1/responsesThe Responses API surface, forwarded as-is.
/v1/modelsReflects your account and the models you have enabled, not a hardcoded list.
/v1/images/*Not supported. Image generation is out of scope for now and returns a clear error rather than failing halfway through.
Examples

Calling it

Replace sk_live_... with your key from the dashboard and <model-id> with a slug from /v1/models — the list depends on your plan, so it is not worth hardcoding here.

curl https://api.zap.dscv.me/v1/chat/completions \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model-id>",
    "messages": [{ "role": "user", "content": "Say pong" }],
    "reasoning_effort": "medium",
    "stream": true
  }'
import OpenAI from "openai"

const client = new OpenAI({
  apiKey: process.env.ZAPLLM_KEY,
  baseURL: "https://api.zap.dscv.me/v1",
})

// Streaming works: each chunk is forwarded as it arrives.
const stream = await client.chat.completions.create({
  model: "<model-id>",
  messages: [{ role: "user", content: "Explain SSE in one line" }],
  stream: true,
})

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "")
}
from openai import OpenAI

client = OpenAI(
    api_key="sk_live_...",
    base_url="https://api.zap.dscv.me/v1",
)

response = client.chat.completions.create(
    model="<model-id>",
    messages=[{"role": "user", "content": "Say pong"}],
)

print(response.choices[0].message.content)
Thinking models

Reasoning effort and the thinking process

Both endpoints accept reasoning control. The chat endpoint takes a flat parameter; the responses endpoint takes the nested Responses-API shape and can also stream the thinking process itself.

ParameterWhat it does
reasoning_effort (chat/completions)One of minimal, low, medium, high (plus the extended levels the underlying API supports, such as xhigh). Higher means the model thinks longer and better — and spends more of your plan's usage on reasoning tokens.
reasoning.effort (responses)The same dial, in the Responses API's nested shape. Add reasoning.summary set to auto and the model's thinking process comes back as reasoning summary items in the stream — that is what you render if your app shows a thinking pane.
curl https://api.zap.dscv.me/v1/responses \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model-id>",
    "input": [{ "role": "user", "content": "Prove that the square root of 2 is irrational" }],
    "reasoning": {
      "effort": "high",
      "summary": "auto"
    },
    "stream": true
  }'

Reasoning tokens are real tokens: a high-effort request can spend more on thinking than on the answer itself. The usage events and the dashboard count them.

If you do not send either parameter, a sensible default for the model is applied — you do not have to opt in to get reasonable behaviour.

Whether visible thinking text is produced depends on the model: some emit reasoning summaries, others think silently. Your app should tolerate both.

Good to know

Limits and behaviour

Requests are on your plan

Every call runs on your own ChatGPT account, so your plan's usage limits apply directly. Free plans get free-model access; paid plans get what they pay for.

Rate limiting

Requests are rate limited per key and per account. A 429 means the limit was hit, not that something is broken — retry after a short wait.

Platform limits

A request can run for at most 300 seconds, and request bodies are capped at 4.5 MB. Long completions still stream fine; only the total duration is bounded.

No image generation

Image endpoints are refused with an explanation. Nothing about your account is affected by trying one.

Roadmap

More providers are coming

ChatGPT is the first supported provider, not the last. Two things are planned next, both through the same endpoint you already use.

PlannedWhat it means
More OAuth providersSign in with other AI providers the same way — connect an account, get its models on your endpoint. No new client configuration.
Bring your own keysPaste API keys from the free tiers of other providers, and merge several keys from the same provider into one endpoint that spreads requests across them.
When it breaks

Common failures

SymptomCause
401 or “Invalid API key”The key was revoked, or it was pasted with surrounding whitespace. Create a new one in the dashboard — keys are shown once at creation.
“No connected ChatGPT account”The key is valid but the account behind it is not connected, or the connection expired. Open the dashboard and reconnect.
Sign-in stops at “The ChatGPT login popup was blocked”The browser blocked the popup. Allow popups for this site and press the button again.
“ChatGPT did not accept that session”The handoff did not complete, or the token expired before it reached the server. Start the sign-in again from the dashboard.
The sign-in page says the extension is missing even though it is installedChrome derives an extension's ID from its public key. An extension installed from a different build has a different ID and is invisible to this site — install the download this site serves.
A model the dashboard lists returns an errorIt is disabled for your account, or your plan does not include it. Re-enable it in the dashboard, or check /v1/models for what is available.
429 responsesRate limit reached, applied per key and per account. Wait briefly and retry; the limit resets each minute.
Streaming answer arrives as one delayed blobSome corporate proxies and VPNs buffer server-sent events. Try a direct connection — the endpoint streams each chunk as it is produced.

Still stuck?

The dashboard shows the connection state, recent requests, and per-model usage — usually enough to tell a configuration problem from an upstream one.

Open the dashboard