Skip to main content
The Confidential Proxy is a local termination proxy that comes with @premai/api-sdk. It exposes supported OpenAI- and Anthropic-compatible HTTP routes on your machine. For a supported OpenAI client, set the base URL to http://127.0.0.1:8787/v1. Anthropic clients use the same local base URL when the proxy runs in Anthropic mode. In both mode, use the separate prefixes documented below.
If you use the TypeScript SDK, you do not need the Confidential Proxy.The SDK encrypts in the same process. Use the Confidential Proxy for other languages and for existing OpenAI or Anthropic codebases.

How it works

The Confidential Proxy runs on your machine and applies the SDK’s client-side encryption. It encrypts the request payload before network egress. The Prem API Gateway receives payload ciphertext plus operational metadata. The selected confidential runtime decrypts the request inside its Trusted Execution Environment (TEE). See Encryption for the full cryptographic design: the XWing key exchange, the two-server model, and the threat model.

Run the server

Run the Confidential Proxy directly with bunx or npx. No installation is necessary. As an alternative, install it globally:
A prebuilt Docker image is available at ghcr.io/premai-io/confidential-proxy:latest:
The image sets HOST=0.0.0.0 and PORT=8787. You can override these values with environment variables or CLI flags. Use CLI flags for --compat and --tls. You cannot set these two flags with environment variables. By default, the server listens on http://127.0.0.1:8787.
8787 is the default in @premai/api-sdk and in the confidential-claude launcher. Port 8000 also works when you start the proxy with --port 8000 and point every client at the same port. A client configured for 8000 cannot reach a proxy that was started without a port override, because that proxy listens on 8787.
Set PROXY_URL and ENCLAVE_URL to the values for your environment. Get the latest values from dashboard.prem.io/endpoints.json.

Configuration

Configure the Confidential Proxy with environment variables or CLI flags. Flags have precedence.

Environment variables

Set PREM_API_KEY to a default API key. The proxy applies this key when a client does not supply its own key. Each client can also send its own API key with each request. Use Authorization: Bearer <key> for OpenAI routes. Use x-api-key: <key> for Anthropic routes. The Confidential Proxy keeps one client in memory for each API key.CLIENT_KEK is a separate key. The Confidential Proxy uses it only to wrap encryption keys. It is not an API key. The current CLI does not bind the CLIENT_KEK environment variable to the server option. Pass the value explicitly with --kek "$CLIENT_KEK".

CLI options

All commands accept the same server options:

Compatibility modes

Use --compat to select the API surface:
In both mode, the Confidential Proxy serves the two APIs under separate prefixes. This prevents route conflicts. Set the base URL to http://127.0.0.1:8787/openai/v1 for OpenAI clients. Set it to http://127.0.0.1:8787/anthropic/v1 for Anthropic clients. The Anthropic surface translates each Anthropic Messages request into the internal OpenAI-compatible enclave pipeline. It then returns the response as Anthropic SSE events.

Connect a client

OpenAI

Set the base URL to http://127.0.0.1:8787/v1. If you use --compat both, set it to http://127.0.0.1:8787/openai/v1. Send your API key as a bearer token:
See OpenAI-compatible clients for supported routes, configuration patterns, production controls, and compatibility limits.
As an alternative, use the OpenAI SDK in Node.js:
The same pattern applies to all other languages. This is a Python example:

Anthropic

Set the base URL to http://127.0.0.1:8787/v1. If you use --compat both, set it to http://127.0.0.1:8787/anthropic/v1. Authenticate with x-api-key. Send the anthropic-version header:
Add "stream": true for incremental responses:
The Anthropic surface supports system prompts, tool use, image inputs, stop sequences, temperature, and top_p. Streaming responses follow the Anthropic SSE format (message_start, content_block_start, content_block_delta, content_block_stop, message_delta, message_stop).
See Anthropic-compatible clients for translation behavior, model substitution, token estimates, tool handling, and known limits.

Agent harnesses

Use a dedicated guide for each harness. The provider schema, protocol selection, tool boundary, and startup command differ.

OpenCode

Configure an OpenAI-compatible provider in a project.

Claude Code

Launch Claude Code through the bundled Anthropic adapter.

OpenClaw

Configure a custom Chat Completions provider.

Hermes Agent

Use a named custom provider with an explicit Chat Completions transport.

Goose

Point the built-in OpenAI provider at the local proxy.

Loupe

Review the current boundary around Loupe’s embedded Claude Code workers.

Cursor compatibility

Understand why Cursor’s base URL override is not a confidential local path.

Codex CLI compatibility

Review the current Responses API protocol mismatch.

Router alternative

Beta Router is a separate, non-confidential service with a broader current chat-model catalog. It does not use the Confidential Proxy, client KEK, or attestation path. Use the Router integrations guide for supported Chat Completions harnesses. Router uses PREM_ROUTER_API_KEY and https://router.prem.io/v1; the Confidential API uses PREM_API_KEY, a client KEK, and the local proxy. Their credentials and data-handling properties are not interchangeable.

Claude for Microsoft 365

The Confidential Proxy can be the gateway for the Claude for Microsoft 365 add-in. The add-in uses HTTPS and CORS. Start the proxy with these flags:
See Claude for Microsoft 365 for tenant setup, key custody, network placement, acceptance tests, and security boundaries.
The add-in cannot connect to 127.0.0.1 on macOS. macOS prevents cross-origin browser requests to loopback addresses. Run the proxy on a different machine on your network, or use a container with its own network interface. Point the add-in at that hostname.

Run the proxy as a daemon

By default, the Confidential Proxy runs in the foreground. The CLI can also manage it as a background daemon.
1

start

The start command does these steps:
  • It checks for a daemon that is in operation. It does not start a second daemon.
  • It spawns itself as a child process. It sends the logs to the log file that you configure.
  • It polls the HTTP endpoint until the server is reachable.
  • It then exits and the daemon continues to run.
2

stop

The stop command stops the daemon. It waits a maximum of 5 seconds. If the daemon does not stop, the command stops it immediately.
3

status

The status command checks if the process is alive and if the HTTP endpoint is reachable.
These options apply to the daemon commands (start, stop, status):

Next steps

Quickstart

The step-by-step guide to get your first request working.

Developer Experience

The two ways to integrate: the TypeScript SDK and the Confidential Proxy.

Chat completions

The chat API in detail, with streaming and vision payloads.

Encryption

The key exchange and the end-to-end encryption in detail.

Agents & Automation

Running the proxy behind an unattended agent or automation? Start here.

OpenCode

Connect OpenCode to the encrypted OpenAI-compatible route.

Claude Code

Launch Claude Code through the encrypted Anthropic-compatible route.

OpenAI-compatible clients

Connect existing OpenAI SDKs and applications.

Anthropic-compatible clients

Use the Messages API shape with explicit compatibility limits.

Claude for Microsoft 365

Deploy the proxy as a Microsoft 365 add-in gateway.
The SDK also includes confidential-claude. It launches Claude Code with the local Anthropic-compatible proxy and forwards Claude Code’s arguments. See Claude Code for the exact environment variables, model picker, stop command, and plaintext boundary.