Guides

Connectors

Credential requirements, auth methods, rate limits, and code examples for all 7 built-in 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

api_key auth format validation
connector_name
openai
Base URL
api.openai.com
Rate Limit
60 RPM (GPT-4) ยท 3,500 RPM (GPT-3.5)
Token Expiry
Never

Required credentials

FieldDescription
api_keyrequiredOpenAI 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

api_key auth format validation
connector_name
anthropic
Base URL
api.anthropic.com
Rate Limit
50 RPM (Tier 1 default)
Token Expiry
Never
Header differs from OpenAI. Anthropic uses x-api-key, not Authorization: Bearer. Clavis injects the correct header automatically when proxying.

Required credentials

FieldDescription
api_keyrequiredAnthropic 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

api_key auth live validation
connector_name
github
Base URL
api.github.com
Rate Limit
5,000 req / hour
Token Expiry
Never (PATs)
Live validation: Clavis calls GET /user when credentials are first stored to confirm the token is valid.

Required credentials

FieldDescription
api_keyrequiredPersonal 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

api_key auth live validation
connector_name
stripe
Base URL
api.stripe.com
Rate Limit
100 req / second
Token Expiry
Never
Live validation: Clavis calls GET /v1/balance when credentials are first stored to verify the key.

Required credentials

FieldDescription
api_keyrequiredStripe 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"})
๐Ÿ“ˆ

Kalshi

login โ†’ session token 24h expiry, auto-refresh
connector_name
kalshi
Base URL
api.elections.kalshi.com
Rate Limit
10 req / second
Token Expiry
24 hours (auto-refreshed)
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

FieldDescription
emailrequiredYour Kalshi account email address.
passwordrequiredYour 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-SHA256 signing live validation
connector_name
coinbase
Base URL
api.coinbase.com
Rate Limit
10 req / second
Token Expiry
Never
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

FieldDescription
api_keyrequiredCoinbase API key. Get one at coinbase.com/settings/api.
api_secretrequiredCoinbase 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")