Base URL: https://clavisagent.com/v1/ — Bearer token authentication required on all protected endpoints.
Five steps from zero to a running agent with managed credentials:
pip install clavisPOST /v1/auth/register with email + passwordPOST /v1/auth/login → receive a JWT (24-hour expiry)POST /v1/services with a connector name (e.g. openai)POST /v1/services/{service_id}/credentials with your API key or OAuth tokenAfter that, call get_token() or proxy() from the SDK — Clavis handles token refresh and rate limiting automatically.
from clavis import ClavisClient
client = ClavisClient(api_key="eyJ...", base_url="https://clavisagent.com")
# Get a valid token — refreshed automatically if expired
token = await client.get_token("my-openai")
print(token.access_token) # sk-...
# Or proxy a full request — auth injected, rate limits tracked
response = await client.proxy(
"my-openai", "POST", "/v1/chat/completions",
body={"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]},
)
All protected endpoints require a Bearer token in the Authorization header:
Authorization: Bearer <your-jwt-token>
Tokens are obtained by logging in via POST /v1/auth/login and expire after 24 hours. There is no API key separate from the JWT — your login token is your API key.
| Method | Path | Description |
|---|---|---|
| POST | /v1/auth/register | Register a developer account |
| POST | /v1/auth/login | Log in and receive a JWT |
| GET | /v1/services | List all registered services |
| POST | /v1/services | Register a new service with a connector |
| GET | /v1/services/{service_id} | Get details for a specific service |
| POST | /v1/services/{service_id}/credentials | Store an API key or OAuth token for a service |
| GET | /v1/services/{service_id}/credentials | Check credential status (never returns raw secrets) |
| POST | /v1/tokens/{service_id} | Retrieve a valid token — auto-refreshed if expired |
| POST | /v1/proxy/{service_id} | Proxy a full HTTP request with auth injected |
| GET | /v1/billing/plan | Current plan and usage counters |
The following endpoints are also available. For full request/response schemas, use the Interactive Explorer below or fetch /openapi.json directly.
| Method | Path | Description |
|---|---|---|
| POST | /v1/call/{service_name} | Call a service by name (resolves service ID automatically) |
| GET | /v1/credentials/{name}/check | Check whether credentials for a service are present and valid |
| POST | /v1/credentials/{name}/verify | Actively verify credentials against the upstream service |
| POST | /v1/credentials/{name}/headers | Get auth headers for a service (for manual HTTP requests) |
| POST | /v1/credentials/{name}/ws_headers | Get auth headers for WebSocket connections |
| GET | /v1/credentials/summary | Summary of all stored credentials across services |
| POST | /v1/auth/logout | Invalidate the current JWT |
| POST | /v1/auth/request-reset | Request a password reset email |
| POST | /v1/auth/reset-password | Complete a password reset with a token |
| GET | /v1/auth/me/billing | Current account billing status and plan details |
Pass one of these as connector_name when registering a service:
The api-key connector is a generic fallback for any service that accepts a static API key in an Authorization: Bearer header.
All error responses return JSON: {"detail": "human-readable message"}
| Status | Meaning |
|---|---|
401 | Missing or expired JWT |
403 | Valid JWT but insufficient permissions |
404 | Service or credential not found |
422 | Validation error — check request body fields |
429 | Rate limit exceeded for this service |
402 | Plan usage limit reached — upgrade to continue |
Try live requests below. Click Authorize and paste your JWT to authenticate.