Official Iteradian Control Plane SDK for Python
Project description
Iteradian Python SDK
Official Python client library for the Iteradian Control Plane API
Features
- Modern HTTP client — powered by httpx with async support
- Automatic retry — exponential backoff on 429 / 5xx responses (configurable max retries)
- Resource-based API — clean
client.auth,client.organizations,client.endpointsaccess pattern - Full API coverage — Auth, Organizations, API Keys, Endpoints, Usage, Dashboard, Alerts, Logs, Subscriptions, Plans, Support
- Type-safe — all responses returned as Python dataclasses with type hints
- Configurable — timeout, retry count, and base URL
- Dual auth — supports both Bearer tokens and API key authentication
- Context manager — use
withstatements for automatic resource cleanup
Requirements
- Python 3.8 or later
- httpx >= 0.25.0
Installation
pip install iteradian
Or with a specific version:
pip install iteradian==1.0.0
From Source
git clone https://github.com/iteradian/iteradian-python.git
cd iteradian-python
pip install -e .
Quick Start
from iteradian import IteradianClient
# Create client
client = IteradianClient(
base_url="https://api.iteradian.com/api/v1"
)
# Login — token is set automatically
tokens = client.auth.login(
email="user@example.com",
password="password123"
)
print(f"Logged in as {tokens.user['email']}")
# List organizations
orgs = client.organizations.list()
for org in orgs:
print(f" {org.name} ({org.slug})")
if orgs:
org_id = orgs[0].id
# List endpoints
endpoints = client.endpoints.list(org_id)
for ep in endpoints:
print(f" {ep.name}: {ep.status} ({ep.region})")
# Create API key
key = client.api_keys.create(org_id, name="Production Key", environment="live")
print(f"Created key: {key.prefix}")
# Query logs
logs = client.logs.query(org_id, page=1, page_size=20)
print(f"Total logs: {logs.total}")
# Cleanup
client.close()
Using API Key Authentication
client = IteradianClient(
base_url="https://api.iteradian.com/api/v1",
api_key="itrd_live_abc123..."
)
endpoints = client.endpoints.list("org-id")
Context Manager
from iteradian import IteradianClient
with IteradianClient(base_url="https://api.iteradian.com/api/v1") as client:
client.auth.login(email="user@example.com", password="password123")
orgs = client.organizations.list()
# client.close() is called automatically
Configuration Options
client = IteradianClient(
base_url="https://api.iteradian.com/api/v1",
timeout=60.0, # Request timeout in seconds (default: 30.0)
max_retries=5, # Max retry attempts on 429/5xx (default: 3)
)
API Reference
Resource Accessors
| Resource | Type | Description |
|---|---|---|
client.auth |
_AuthResource |
Authentication & account management |
client.organizations |
_OrganizationsResource |
Organization CRUD & members |
client.api_keys |
_ApiKeysResource |
API key management |
client.endpoints |
_EndpointsResource |
Endpoint & network management |
client.usage |
_UsageResource |
Usage analytics |
client.dashboard |
_DashboardResource |
Dashboard data & health |
client.alerts |
_AlertsResource |
Alert management & rules |
client.logs |
_LogsResource |
Request log querying |
client.subscriptions |
_SubscriptionsResource |
Subscription & billing |
client.plans |
_PlansResource |
Plan catalog |
client.support |
_SupportResource |
Support ticket management |
Authentication (client.auth)
# Login (token set automatically)
tokens = client.auth.login(email="...", password="...")
# Register
tokens = client.auth.register(email="...", password="...", name="...")
# Refresh token
tokens = client.auth.refresh(refresh_token="...")
# Logout
client.auth.logout()
# Two-Factor Authentication
setup = client.auth.enable_2fa(password="...")
print(f"Secret: {setup.secret}")
print(f"QR Code: {setup.qr_code}")
client.auth.verify_2fa(code="123456")
client.auth.disable_2fa(password="...", code="123456")
# Magic Link
client.auth.send_magic_link(email="user@example.com")
# Password Reset
client.auth.forgot_password(email="user@example.com")
client.auth.reset_password(token="...", new_password="...")
Organizations (client.organizations)
# CRUD
orgs = client.organizations.list()
org = client.organizations.create(name="My Org", slug="my-org")
org = client.organizations.get(org_id)
client.organizations.delete(org_id)
# Members
members = client.organizations.list_members(org_id)
member = client.organizations.invite_member(org_id, email="user@example.com", role="member")
client.organizations.remove_member(org_id, member_id)
API Keys (client.api_keys)
keys = client.api_keys.list(org_id)
key = client.api_keys.create(org_id, name="Key Name", environment="live")
client.api_keys.revoke(org_id, key_id)
new_key = client.api_keys.rotate(org_id, key_id)
analytics = client.api_keys.get_analytics(org_id, key_id)
Endpoints (client.endpoints)
# Networks
networks = client.endpoints.get_networks()
# Endpoint management
endpoints = client.endpoints.list(org_id)
endpoint = client.endpoints.create(org_id, name="...", network_id="...", region="us-east-1")
client.endpoints.delete(org_id, endpoint_id)
endpoint = client.endpoints.pause(org_id, endpoint_id)
endpoint = client.endpoints.resume(org_id, endpoint_id)
health = client.endpoints.check_health(org_id, endpoint_id)
metrics = client.endpoints.get_metrics(org_id, endpoint_id)
Usage (client.usage)
usage = client.usage.get(org_id, from_date="2024-01-01", to_date="2024-01-31")
Dashboard (client.dashboard)
data = client.dashboard.get(org_id, period="7d")
health = client.dashboard.get_health(org_id)
stats = client.dashboard.get_quick_stats(org_id, period="24h")
Alerts (client.alerts)
# Alerts
alerts = client.alerts.list(org_id)
alert = client.alerts.acknowledge(org_id, alert_id)
alert = client.alerts.resolve(org_id, alert_id)
# Alert Rules
rules = client.alerts.list_rules(org_id)
rule = client.alerts.create_rule(
org_id,
name="High Latency",
metric="latency_p95",
condition="greater_than",
threshold=500,
severity="warning",
is_enabled=True,
cooldown_minutes=15
)
client.alerts.delete_rule(org_id, rule_id)
# Channels & Testing
channels = client.alerts.get_channels(org_id)
client.alerts.test_channel(org_id, channel_id)
Logs (client.logs)
# Query logs with filters
logs_response = client.logs.query(
org_id,
page=1,
page_size=50,
status="error",
method="eth_call",
network="ethereum",
sort_by="timestamp",
sort_order="desc"
)
print(f"Page {logs_response.page}/{logs_response.total_pages}")
for log in logs_response.logs:
print(f" [{log.status}] {log.method} ({log.latency_ms}ms)")
# Get single log
log = client.logs.get(org_id, log_id)
# Available filter options
filters = client.logs.get_filter_options(org_id)
# Log stats
stats = client.logs.get_stats(org_id, period="24h")
Subscriptions (client.subscriptions)
sub = client.subscriptions.get(org_id)
sub = client.subscriptions.change_plan(org_id, plan_id="pro")
sub = client.subscriptions.cancel(org_id)
sub = client.subscriptions.reactivate(org_id)
invoices = client.subscriptions.get_invoices(org_id)
Plans (client.plans)
plans = client.plans.list()
plan = client.plans.get(plan_id)
Support (client.support)
tickets = client.support.list_tickets(org_id)
ticket = client.support.create_ticket(
org_id,
subject="API returning 500 errors",
category="technical",
priority="high",
message="Detailed description..."
)
ticket = client.support.get_ticket(org_id, ticket_id)
client.support.add_message(org_id, ticket_id, content="Follow-up message...")
Data Types
All types are defined as Python dataclasses in iteradian/types.py:
| Type | Key Fields |
|---|---|
IteradianConfig |
base_url, api_key?, timeout, max_retries |
AuthTokens |
access_token, refresh_token, user |
TwoFASetup |
secret, qr_code |
Organization |
id, name, slug, created_at, updated_at |
OrgMember |
id, user_id, email, role, joined_at |
ApiKey |
id, name, prefix, key?, environment, status, ip_allowlist?, allowed_networks?, rate_limit?, daily_limit? |
Network |
id, slug, name, chain_id, type, environment, is_active |
Endpoint |
id, organization_id, network_id, region, name, priority, status, is_enabled, timeout_ms, retry_count, metrics fields |
RequestLog |
id, organization_id, method, status, status_code?, latency_ms?, network?, region?, timestamp |
LogsResponse |
logs, total, page, page_size, total_pages |
Alert |
id, organization_id, rule_id?, severity, status, title, message, metadata? |
AlertRule |
id, organization_id, name, metric, condition, threshold, severity, is_enabled, cooldown_minutes |
Plan |
id, name, slug, price, currency, interval, features, limits, is_active |
Subscription |
id, organization_id, plan_id, status, cancel_at_period_end, plan? |
SupportTicket |
id, organization_id, subject, category, priority, status |
Error Handling
from iteradian import IteradianClient, IteradianError
client = IteradianClient(base_url="https://api.iteradian.com/api/v1")
try:
client.auth.login(email="user@example.com", password="wrong")
except IteradianError as e:
print(f"Status: {e.status_code}") # 401
print(f"Message: {e.message}") # "Invalid credentials"
print(f"Error: {e.error}") # Error detail
except Exception as e:
print(f"Network error: {e}")
Retry Behavior
The SDK automatically retries requests on:
- 429 Too Many Requests — with exponential backoff
- 5xx Server Errors — with exponential backoff
Configure via max_retries (default: 3):
client = IteradianClient(
base_url="...",
max_retries=5, # Up to 5 retries
)
Project Structure
sdks/python/
├── pyproject.toml # Package metadata & build config
├── README.md # This file
└── iteradian/
├── __init__.py # Package exports
├── client.py # IteradianClient & all resource classes (407 lines)
├── http.py # HttpClient — httpx, retry, timeouts (107 lines)
├── exceptions.py # IteradianError exception class
└── types.py # Dataclass types (235 lines)
License
MIT © Iteradian
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 iteradian-1.0.0.tar.gz.
File metadata
- Download URL: iteradian-1.0.0.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cbcdd3ab9b0503bc46b73bab5e580ccf1027f69c749c9ef4de954ae4be6992bb
|
|
| MD5 |
58d41222b71d356d8c5dd1b3d1bebcf8
|
|
| BLAKE2b-256 |
d07de4c541ab7ed3e7d37520cd1851ce278a812402912c5e8031cf93083a1d1f
|
Provenance
The following attestation bundles were made for iteradian-1.0.0.tar.gz:
Publisher:
deploy-sdks.yml on CommRadian-Andrey/iteradian-control-plane
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iteradian-1.0.0.tar.gz -
Subject digest:
cbcdd3ab9b0503bc46b73bab5e580ccf1027f69c749c9ef4de954ae4be6992bb - Sigstore transparency entry: 1363780995
- Sigstore integration time:
-
Permalink:
CommRadian-Andrey/iteradian-control-plane@a6572f9f0f3ff83efae3e5bee54b3329f86b9480 -
Branch / Tag:
refs/heads/prod - Owner: https://github.com/CommRadian-Andrey
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy-sdks.yml@a6572f9f0f3ff83efae3e5bee54b3329f86b9480 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file iteradian-1.0.0-py3-none-any.whl.
File metadata
- Download URL: iteradian-1.0.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5322b038d51578c38970ef9e8c9ff1a2674653295c9e246c6f3714d47ba16f48
|
|
| MD5 |
ea8af357e12171043fb57c80534b037d
|
|
| BLAKE2b-256 |
d393727a63303556ca638d6d572a9dfc685cb5b3bba0f46ed8145f1ba145f18e
|
Provenance
The following attestation bundles were made for iteradian-1.0.0-py3-none-any.whl:
Publisher:
deploy-sdks.yml on CommRadian-Andrey/iteradian-control-plane
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
iteradian-1.0.0-py3-none-any.whl -
Subject digest:
5322b038d51578c38970ef9e8c9ff1a2674653295c9e246c6f3714d47ba16f48 - Sigstore transparency entry: 1363781085
- Sigstore integration time:
-
Permalink:
CommRadian-Andrey/iteradian-control-plane@a6572f9f0f3ff83efae3e5bee54b3329f86b9480 -
Branch / Tag:
refs/heads/prod - Owner: https://github.com/CommRadian-Andrey
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploy-sdks.yml@a6572f9f0f3ff83efae3e5bee54b3329f86b9480 -
Trigger Event:
workflow_dispatch
-
Statement type: