Getting started
Kindo exposes a single base URL — https://api.kindo.ai — that
speaks three industry-standard wire protocols. You bring whichever
client you already use, point it at api.kindo.ai, and the rest of
your code works unmodified.
The three APIs are:
| Endpoint | Protocol | Use it when |
|---|---|---|
/v1/chat/completions | OpenAI Chat Completions | You’re migrating from OpenAI’s Chat Completions API or any OpenAI-compatible proxy. |
/v1/responses | OpenAI Responses | You’re using codex, the new OpenAI Responses surface, or want stateful conversations. |
/v1/messages | Anthropic Messages | You’re using Claude Code, the Anthropic SDK, or any Anthropic-compatible client. |
All three accept the same Kindo API key — there are no per-protocol credentials. The only difference between using Kindo and calling OpenAI or Anthropic directly is which base URL you point your client at and which key you use.
Pick your client
Kindo follows the upstream specs faithfully. If your client speaks the protocol, it works:
| If you use… | Set this base URL | Set this key envvar | API surface |
|---|---|---|---|
codex | OPENAI_BASE_URL=https://api.kindo.ai/v1 | OPENAI_API_KEY=$KINDO_API_KEY | /v1/responses |
openai-python | OpenAI(base_url="https://api.kindo.ai/v1") | OpenAI(api_key=os.environ["KINDO_API_KEY"]) | /v1/chat/completions (or client.responses.*) |
openai-node | new OpenAI({ baseURL: "https://api.kindo.ai/v1" }) | apiKey: process.env.KINDO_API_KEY | /v1/chat/completions (or client.responses.*) |
| Anthropic Python SDK | Anthropic(base_url="https://api.kindo.ai") | Anthropic(api_key=os.environ["KINDO_API_KEY"]) | /v1/messages |
| Anthropic TypeScript SDK | new Anthropic({ baseURL: "https://api.kindo.ai" }) | apiKey: process.env.KINDO_API_KEY | /v1/messages |
| Claude Code | ANTHROPIC_BASE_URL=https://api.kindo.ai | ANTHROPIC_API_KEY=$KINDO_API_KEY | /v1/messages |
Raw curl | https://api.kindo.ai | Authorization: Bearer $KINDO_API_KEY | All three |
The Anthropic SDKs and Claude Code append /v1/messages
internally, so the base URL omits /v1. Including it would produce a
double path segment (/v1/v1/messages).
Why one base URL, three APIs
Different teams standardize on different SDKs, and each protocol has different ergonomics: Chat Completions is the broadly-supported baseline, the Responses API adds stateful conversations and typed-output items, Messages is what Anthropic’s first-party tools speak. By accepting all three, Kindo lets every team keep its existing client choice while still routing through a single governance pipeline (auth, model access, audit, DLP, metering).
Default behavior is stock provider behavior
When you call /v1/chat/completions, /v1/responses, or
/v1/messages with a stock OpenAI or Anthropic client, you get
stock OpenAI or Anthropic semantics. Kindo does not silently
inject system prompts, hidden tools, or stateful side effects.
If you want any of those things on /v1/responses, opt in
explicitly via the Chat Actions extensions: a curated system
prompt, the Kindo-hosted tool catalog, and Kindo-managed
conversation state. Each is independent and documented at
guides/chat-actions. /v1/chat/completions
and /v1/messages are stock OpenAI and stock Anthropic; the Chat
Actions opt-ins are not available there.
Next steps
- Authentication — header options and key formats.
- Model catalog — discover what model IDs to send.
- Pick your protocol:
- Responses API quickstart for
codexand the OpenAI Responses SDK. - Chat Completions API quickstart
for
openai-python/openai-node. - Messages API quickstart for Claude Code and the Anthropic SDKs.
- Responses API quickstart for
- Chat Actions — opt in to Kindo’s curated
prompt, hosted tools, or stateful conversations on
/v1/responses.