Guides
Connectors
Clavis ships with 7 ready-to-use connectors. To use any connector, register a service with that connector_name, store credentials, and call get_token(). The connector handles all auth logic.
connector_name is the string you pass when registering a service. It must exactly match one of the names listed in each section below (e.g.,
"openai", "brave-search").
OpenAI
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | OpenAI API key. Must start with sk-. Get one at platform.openai.com/api-keys. |
python โ register & use
# 1. Register the service import httpx async with httpx.AsyncClient() as http: svc = (await http.post("https://clavisagent.com/v1/services", headers={"Authorization": f"Bearer {jwt}"}, json={"name": "my-openai", "connector_name": "openai"})).json() # 2. Store credentials await http.post(f"https://clavisagent.com/v1/services/{svc['id']}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "sk-..."}}) # 3. Get token in your agent token = await client.get_token("my-openai") # token.access_token = "sk-..." โ inject into Authorization: Bearer
Anthropic
Header differs from OpenAI. Anthropic uses
x-api-key, not Authorization: Bearer. Clavis injects the correct header automatically when proxying.
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | Anthropic API key. Must start with sk-ant-. Get one at console.anthropic.com. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "sk-ant-..."}}) # Proxy injects x-api-key + anthropic-version headers automatically response = await client.proxy("my-anthropic", "POST", "/v1/messages", body={"model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hello"}]})
GitHub
Live validation: Clavis calls
GET /user when credentials are first stored to confirm the token is valid.
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | Personal Access Token (classic: ghp_, fine-grained: github_pat_). Create at github.com/settings/tokens. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "ghp_..."}}) # List repos via proxy response = await client.proxy("my-github", "GET", "/user/repos", params={"sort": "updated", "per_page": 10})
Stripe
Live validation: Clavis calls
GET /v1/balance when credentials are first stored to verify the key.
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | Stripe secret key (sk_live_ or sk_test_) or restricted key (rk_live_ / rk_test_). Get one at dashboard.stripe.com/apikeys. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "sk_test_..."}}) # Create a payment intent via proxy response = await client.proxy("my-stripe", "POST", "/v1/payment_intents", body={"amount": 2000, "currency": "usd"})
Brave Search
Custom header: Brave Search uses
X-Subscription-Token, not Authorization: Bearer. Clavis injects the correct header automatically when proxying.
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | Brave Search API key. Get one at api.search.brave.com/app/keys. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "BSA..."}}) # Web search via proxy โ X-Subscription-Token injected automatically response = await client.proxy("my-brave", "GET", "/res/v1/web/search", params={"q": "AI agent authentication", "count": 10})
Kalshi
Session token auth: Unlike API key connectors, Kalshi authenticates with email + password and receives a 24-hour session token. Clavis stores the credentials and re-authenticates automatically when the token expires.
Required credentials
| Field | Description |
|---|---|
| emailrequired | Your Kalshi account email address. |
| passwordrequired | Your Kalshi account password. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"email": "you@example.com", "password": "..."}}) # Token fetched and cached; re-login happens automatically at expiry token = await client.get_token("my-kalshi") response = await client.proxy("my-kalshi", "GET", "/trade-api/v2/markets")
Coinbase Advanced Trade
HMAC signing: Coinbase requires per-request HMAC-SHA256 signatures using a timestamp + method + path. Clavis handles this automatically when proxying โ use the proxy endpoint rather than extracting the token directly.
Required credentials
| Field | Description |
|---|---|
| api_keyrequired | Coinbase API key. Get one at coinbase.com/settings/api. |
| api_secretrequired | Coinbase API secret corresponding to the key above. |
python โ register & use
await http.post(f"https://clavisagent.com/v1/services/{svc_id}/credentials", headers={"Authorization": f"Bearer {jwt}"}, json={"token_type": "api_key", "data": {"api_key": "...", "api_secret": "..."}}) # Use proxy โ Clavis signs each request with HMAC-SHA256 response = await client.proxy("my-coinbase", "GET", "/api/v3/brokerage/accounts")