The official Python SDK for the Confident AI platform management API.
Project description
confidentai (Python)
The official Python SDK for the Confident AI platform management API — manage organizations, projects, API keys, members, invitations, roles, and policies.
Looking to run evaluations, upload traces, or pull datasets? Use
deepeval. This SDK focuses on platform/administration APIs.
Documentation: Admin SDK docs
Installation
pip install confidentai
Quickstart
from confidentai import ConfidentAI
client = ConfidentAI(api_key="confident_org_...")
# The organization the API key is scoped to
organization = client.organization().get()
# All projects in the organization
projects = client.projects.list()
# A scoped project client
project = client.project("project_id")
members = project.members.list()
Authentication
These endpoints require an organization API key. Provide it explicitly or via the environment:
client = ConfidentAI(api_key="confident_org_...")
export CONFIDENT_ORG_API_KEY="confident_org_..."
Use
CONFIDENT_ORG_API_KEY, notCONFIDENT_API_KEY. The latter is reserved bydeepevalfor a project key; the distinct name lets both SDKs run side by side.
from confidentai import ConfidentAI
client = ConfidentAI() # reads CONFIDENT_ORG_API_KEY
Configuration
ConfidentAI(api_key=None, base_url=None, timeout=None)
| Setting | Resolution order |
|---|---|
api_key |
api_key argument → CONFIDENT_ORG_API_KEY |
base_url |
base_url argument → CONFIDENT_BASE_URL → regional default |
| region | CONFIDENT_REGION (US / EU) → API key prefix → US |
Regional defaults: https://api.confident-ai.com (US),
https://eu.api.confident-ai.com (EU).
Async
Every method that hits the API has an a_-prefixed async counterpart on the
same client (list / a_list, assign / a_assign, …) — the same style as
deepeval's measure / a_measure. There is no separate async client; use one
ConfidentAI and await the a_ methods in asyncio code:
import asyncio
from confidentai import ConfidentAI
async def main():
client = ConfidentAI(api_key="confident_org_...")
organization = await client.a_whoami()
projects = await client.projects.a_list()
project = client.project("project_id") # no I/O, no await
members = await project.members.a_list() # awaited
created = await client.projects.a_create("Async App")
await client.project(created.project.id).a_delete()
asyncio.run(main())
organization() and project(id) just build scoped clients (no network), so
they are not awaited; only the a_-prefixed methods that actually hit the API
are coroutines. Configuration, regions, and ConfidentApiError behave
identically to the sync methods.
Organization example
org_client = client.organization()
# Profile
organization = org_client.get()
org_client.update(name="Acme Inc.")
# API keys (the full value is returned only on create)
created = org_client.api_keys.create(name="CI/CD key")
print(created.value)
org_client.api_keys.update(created.id, valid=False)
org_client.api_keys.delete(created.id)
# Members & invitations
members = org_client.members.list(page=1, page_size=25)
org_client.members.update_role(members[0].id, role_id="role_id")
org_client.invitations.create(["teammate@acme.com"], role_id="role_id")
# IAM: roles, policies & permissions
permissions = org_client.iam.permissions.list()
policy = org_client.iam.policies.create(
"Billing", permission_ids=[permissions[0].id]
)
org_client.iam.roles.create("Billing Manager", policy_ids=[policy.id])
# Governance: list policies and assign projects to one (great for CI/CD)
governance_policies = org_client.governance.policies.list()
if governance_policies:
org_client.governance.policies.assign(
governance_policies[0].id, project_ids=["project_id"]
)
Project example
# Create a project (returns the project + its first API key)
created = client.projects.create("Production App", description="Main app")
print(created.project.id, created.api_key.value)
# List / fetch
projects = client.projects.list()
project = client.project(created.project.id)
project.update(name="Production")
# Project-scoped resources
project.api_keys.create(name="Production agent key")
project.members.list()
project.invitations.create(["analyst@acme.com"], role_id="project_role_id")
# Project-scoped IAM (roles, policies, permissions)
project.iam.roles.list()
project.iam.policies.list()
project.iam.permissions.list()
# Delete
project.delete()
Error handling
When the API returns an unsuccessful response, the SDK raises
ConfidentApiError, which carries the error message and an optional link to
relevant docs.
from confidentai import ConfidentAI, ConfidentApiError
client = ConfidentAI()
try:
client.project("does-not-exist").get()
except ConfidentApiError as err:
print("Something went wrong:", err, err.link)
Development
cd python
poetry install
poetry run pytest
Or without Poetry:
cd python
python -m venv .venv && source .venv/bin/activate
pip install requests "pydantic>=2.11" tenacity aiohttp pytest
pytest
The default suite mocks the HTTP layer and never hits a real API, so it runs anywhere (and is the pre-merge CI gate).
Integration tests (optional, real API)
A separate, opt-in suite under tests/integration/ exercises the live API. It
is excluded from the default run and auto-skips unless
CONFIDENT_ORG_API_KEY is set:
CONFIDENT_ORG_API_KEY="confident_org_..." poetry run pytest -m integration
Most checks are read-only (whoami, projects.list, permissions.list); the
project round-trip creates and then deletes a throwaway project. CI runs this
suite nightly / on demand via the Integration workflow, never on pull
requests.
See ROUTES.md for the full endpoint → method map.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file confidentai-0.2.0.tar.gz.
File metadata
- Download URL: confidentai-0.2.0.tar.gz
- Upload date:
- Size: 19.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.4 CPython/3.13.13 Darwin/25.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
944711c269cc4c4f5534c7cbd49b9be362b7532559bccbb5873e1f183d72a3f7
|
|
| MD5 |
55b0cd2023891e6ac52f2fea2214750d
|
|
| BLAKE2b-256 |
1c00ed2ed48d47f20d93bcb11f3b3f16e2dc875c8cb44bd63a3664773750b741
|
File details
Details for the file confidentai-0.2.0-py3-none-any.whl.
File metadata
- Download URL: confidentai-0.2.0-py3-none-any.whl
- Upload date:
- Size: 37.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.4 CPython/3.13.13 Darwin/25.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d516c3bdeb0b8119f80b163335d7f3e5e14413f25b276a63f9fa998309c885dd
|
|
| MD5 |
996f13b9ede2a9ce046221fb6e64f714
|
|
| BLAKE2b-256 |
39d3a1a9ced29067cdedbb8f5aa8a98c1bae901e1a4b01a46dc941aa3c48d387
|