devhelm Python SDK (v1.3.0). Every list/get returns a Pydantic model; every body parameter accepts either a dict or the corresponding Pydantic request class.
Client initialization
Devhelm() with no arguments reads DEVHELM_API_TOKEN and, when set, DEVHELM_WORKSPACE_ID. Leave the workspace unset when the organization has one workspace. DEVHELM_API_URL is not read; pass base_url.
The client is built on httpx.Client. It is synchronous and thread-safe; share one instance across threads (see concurrency patterns).
Resource namespaces
The client exposes 19 resources. List/get/delete signatures return Pydantic DTOs fromdevhelm.types; mutations accept RequestBody[...] (dict or model instance).
client.monitors
Both
list() and list_page() accept optional server-side filter kwargs: enabled, type, managed_by, tags (comma-separated), search, and environment_id.
client.incidents
Incidents have no
delete method — they are resolved, not deleted.client.alert_channels
client.notification_policies
client.tags
client.environments
client.secrets
client.resource_groups
client.webhooks
client.inboxes
Webhook testing inboxes: URLs that capture the requests your code sends.client.webhooks is the opposite direction. See Webhook inboxes. Documented against devhelm 1.10.0.
Inbox has id (a UUID), name, status, http_url, public_token, http_response, cors, retention_days, max_events, created_at, and updated_at, plus:
ListedEvent (a list row) has raw() -> bytes for the exact body bytes, save(path) -> Path, and delete(). Event (from get or wait) adds text() and json() over body. Wait returns the full body, not clipped.
Wait arguments:
In 1.10.0,
Inbox has no last_event_at, and events have no body_truncated or raw_url. Use raw() for the exact bytes and body for the text. Verify signatures against raw(), not text(): text() is decoded UTF-8.client.email
Email testing: per-test addresses on the workspace’s assigned domain, inject, and wait. This is separate from email alert channels. See Email testing.
Wait takes
received_after (omit it for the server lookback of 60 seconds), timeout_ms (default 30000, clamped at 120000), and subject_contains (case-insensitive).
Address has email, domain, and local_part, plus:
Message has id, inbox, received_at, from_, to, subject, headers, body_preview, text, html, body_truncated, raw_url, otp, links, sha256, and attachments, plus raw() -> bytes (the .eml), save(path), source() -> MessageSource (source, truncated), delete(), list_otp(), and list_links(). Wait and get fill text and html, clipped at 256 KB. Do not rely on attachments today: inject cannot attach files and real mail does not list them yet.
client.api_keys
There is no
get(id) — fetch the list and filter, or store the ID from create().client.dependencies
alert_sensitivity is one of ALL, INCIDENTS_ONLY, MAJOR_ONLY, or AWARENESS (the API default). component_id subscribes to a single component instead of the whole service.
client.deploy_lock
client.maintenance_windows
client.services
Read-only access to the third-party service status catalog (GitHub, Stripe, AWS, …).client.status
client.status_pages
The largest namespace; root operations plus five sub-namespaces.
Sub-namespaces:
client.forensics
Read-only audit trail for the detection engine. See Incident Forensics for the conceptual overview.Pagination types
Page
CursorPage
Pydantic models
Every request and response is apydantic.BaseModel. The full set is re-exported from devhelm:
devhelm/__init__.py.
Next steps
Error handling
Exception types and retry patterns.
Concurrency patterns
Run the sync client concurrently in threads or asyncio.