base_url to
KINDI's Anthropic proxy path and use two headers: your KINDI key as the
bearer, and your Anthropic key as X-Provider-Key.https://api.kindi.me/api/v1/proxy/anthropicAuthorization: Bearer <your KINDI key> (mk_live_…)X-Provider-Key: <your Anthropic key> (sk-ant-…)Authorization: Bearer
header (not Anthropic's x-api-key). Your Anthropic key rides in
X-Provider-Key. The proxy_config helper sets both for you, which
removes the most common source of header friction.X-Provider-Key is
not in KINDI's CORS allow-list, so a browser preflight carrying it is
rejected and the request never leaves the page; call the proxy from your
backend, not from front-end JavaScript. (You wouldn't want to anyway:
a provider key in a browser is exposed to every visitor.) The
browser-reachable path is the dashboard's managed demo; see
Keys & auth.123456789101112131415161718192021222324import anthropic from kindi import proxy_config cfg = proxy_config( "anthropic", kindi_api_key="mk_live_...", provider_key="sk-ant-...", ) # cfg == {"base_url": "https://api.kindi.me/api/v1/proxy/anthropic", # "default_headers": {"Authorization": "Bearer mk_live_...", # "X-Provider-Key": "sk-ant-..."}} client = anthropic.Anthropic( base_url=cfg["base_url"], default_headers=cfg["default_headers"], api_key="unused", ) msg = client.messages.create( model="claude-haiku-4-5-20251001", max_tokens=256, messages=[{"role": "user", "content": "Summarize: patient John Doe, ID 1012345672, complains of headache."}], ) print(msg.content[0].text)
12345678910curl https://api.kindi.me/api/v1/proxy/anthropic/v1/messages \ -H "Authorization: Bearer mk_live_..." \ -H "X-Provider-Key: sk-ant-..." \ -H "anthropic-version: 2023-06-01" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-haiku-4-5-20251001", "max_tokens": 256, "messages": [{"role": "user", "content": "Summarize: patient John Doe, ID 1012345672."}] }'
system, string or array-of-blocks) are masked
before forwarding and restored in the reply.tool_use
blocks and tool_result content, so PII inside tool arguments/results is
masked too.X-Kindi-Preserve-Tags to instruct
Claude to reproduce the <MASKED_…> tokens verbatim. See
Preserve tags./v1/messages only. Other Anthropic endpoints return
501 endpoint_not_supported_in_v1; see Limitations.