Docs
Use it anywhere.
Chat in the browser, or point any app that speaks the OpenAI API at Incognito. This page covers keys, models, pricing, errors and the local proxy.
Quick start
- Open the app. It keeps your memberships in this browser, encrypted, on this device only; download a backup from Backup so you don't lose them.
- Buy questions with USDC or SOL. For the most privacy, pay from a wallet that isn't tied to you.
- Chat in the app, or make a key under Keys for other apps.
API
The API is OpenAI-compatible. Set the base URL and use a key from the app:
Base URL https://…/v1
API key incog_… (from the app; lasts 24 hours)
Python
from openai import OpenAI
client = OpenAI(base_url="https://…/v1", api_key="incog_…")
reply = client.chat.completions.create(
model="smart",
messages=[{"role": "user", "content": "Hello"}],
)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://…/v1", apiKey: "incog_…" });
const reply = await client.chat.completions.create({
model: "smart",
messages: [{ role: "user", content: "Hello" }],
stream: true,
});
curl
curl https://…/v1/chat/completions \
-H "Authorization: Bearer incog_…" -H "Content-Type: application/json" \
-d '{"model":"smart","messages":[{"role":"user","content":"Hello"}]}'
GET /v1/models lists the models with their pricing. Streaming ("stream": true) works as usual. Fields that would buy extra compute, like n or best_of, are ignored, and max_tokens is capped.
Pricing
A question costs 0.002 USDC. A request costs:
questions = model multiplier × ceil(prompt tokens ÷ 4,000)
A normal message to a standard model costs 1 question. Long documents and bigger models cost a few more. Every reply carries the charge in the X-Questions-Charged header.
Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | Unknown or expired key. Make a new one in the app. |
| 402 | out_of_questions | The key can't cover this request. The response includes needed and remaining. |
| 400 | policy_violation | Refused under the acceptable use policy. The request is still charged. |
| 413 | prompt_too_long | Over the model's prompt limit. Nothing is charged. |
| 429 | rate_limited | Too many open requests on one key, or the hourly limit below. |
| 502/503 | upstream_error | The model or safety check was unavailable. The request is refunded. |
Limits
- Keys last 24 hours. Use a new key per app or conversation, so they can't be linked to each other.
- Each membership can make up to 256 questions' worth of keys per hour, enforced by the zero-knowledge proof itself without identifying you.
- At most 2 requests at a time per key.
Local proxy
For the most privacy, run the Incognito proxy on your own machine with Tor running. Point apps at http://127.0.0.1:8765/v1 with any API key: each conversation gets its own freshly minted key and its own Tor circuit, so conversations can't be linked to each other or to your IP address. It adds random delays and decoy requests so your activity pattern doesn't stand out.
node src/main.mjs --import incognito-backup.json # first run: import your vault backup node src/main.mjs # then use http://127.0.0.1:8765/v1