What actually runs where. Useful if you're deciding whether to depend on this API, debugging something unexpected, or just curious.
| Domain / path | What it is |
|---|---|
| www.israelgpt.site | The main site — web chat, docs, dashboard. A custom domain in front of the Vercel deployment. |
| www.israelgpt.site/api/v1/chat | The public API described throughout these docs. |
| www.israelgpt.site/dashboard | API key management and usage, gated behind sign-in. |
| www.israelgpt.site/docs | This documentation. |
The underlying Vercel-assigned domain is a slightly different spelling (a historical artifact, not a typo you need to worry about) — always use www.israelgpt.site, not any *.vercel.app URL, which can change.
| Service | Role |
|---|---|
| Vercel | Hosts the Next.js app — every page and API route, including /api/v1/chat itself, runs as a Vercel serverless function. |
| Supabase | Postgres database + auth. Stores accounts, hashed API keys, per-request usage logs, and the lore content injected into every reply. The web chat also uses it for saved chats and memories — the public API only touches the account/key/log/lore tables. |
| Upstash Redis | Backs rate limiting. A shared, cross-instance store (unlike an in-memory cache, which wouldn't behave consistently across separate serverless invocations) — also caches the lore content for a few minutes so most requests skip the database read entirely. |
| OpenRouter | Routes model completions to the underlying open-source models (see model_id in a response, or the model table on Personas & Models). Not called directly by you — the API is the only thing that talks to OpenRouter. |
| Discord | Only relevant if you use or fork the reference Discord bot (see Discord Bot) — it connects to Discord's own gateway/REST API independently, as a separate always-on process outside this stack entirely. |
502 — see Errors.www.israelgpt.site.The endpoint returns one complete JSON response, not a token stream. Two reasons: the reference client (a Discord bot) posts one finished message rather than editing it token-by-token, and a plain JSON contract is what keeps onboarding to a curl command and a 10-line snippet instead of an SSE/streaming parser.
// what you get: one response, once generation finishes
const data = await res.json();
console.log(data.reply);