Skip to main content
Complete reference for the 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 from devhelm.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 a pydantic.BaseModel. The full set is re-exported from devhelm:
The full DTO/request inventory is in devhelm/__init__.py.

Next steps

Error handling

Exception types and retry patterns.

Concurrency patterns

Run the sync client concurrently in threads or asyncio.