Pulse Python SDK API
The Pulse SDK (pulse-api) is a Python client library that wraps the Pulse REST endpoints used by the admin pages. It is session-based: you authenticate once, with an API key or with a username and password, and every subsequent call is carried by the session cookie, with CSRF handled automatically. Each PulseApi object owns its own cookie jar and cached CSRF token, so one client instance is one Pulse session. Every call raises a PulseApiError (with .message, .status, and .body) on failure.
The SDK uses the Python standard library only, so it has no third party dependencies and installs on a machine with no internet access. It requires Python 3.8 or later.
The previous browser-side JavaScript client (
pulse.api.js) has been discontinued. Python is now the only supported client SDK.
Download
The SDK is distributed by Cubewise as a zip package. It is not published on GitHub or on PyPI.
The package contains:
Item | Description |
|---|---|
| The SDK, installable with |
| Ready to run sample applications covering environments, users, groups, alerts, instance settings, migration packages and approvals. |
| Install instructions, configuration, and the full usage guide. |
Install
Unzip the package, then install the wheel with pip. Using a virtual environment is recommended.
python -m venv .venv
.venv\Scripts\activate
pip install pulse_api-8.0.1-py3-none-any.whlOn Linux or macOS, use python3 -m venv .venv and source .venv/bin/activate.
Verify the install:
python -c "from pulse_api import PulseApi; print(PulseApi.VERSION)"If you see ModuleNotFoundError: No module named 'pulse_api', the wheel was installed into a different Python than the one running the script. Use python -m pip install ... so that pip and python are the same interpreter.
Getting started
Create a client against your Pulse Server URL, then log in before making any other calls. Unlike the old browser client, the Python client connects to a full URL, so it can run from any machine that can reach the Pulse Server.
from pulse_api import PulseApi, PulseApiError
client = PulseApi('https://pulse.example.com') # base_url='/pulse/' when Pulse is served under a sub-path
client.login.login_with_api_key('pulse_xxxxxxxx')
try:
for env in client.system.get_system_servers():
print(env['serverName'], env.get('RESTURL'))
finally:
client.login.logout()Method names are snake_case. Payload keys are the server's own JSON and stay camelCase (serverName, RESTURL, emailGroupId).
Follow the instructions in this article to Create a Pulse API key.
Full reference: This page is a summary only. The complete details of every SDK call (parameters, object shapes, sample flows, and return values) are covered by the README.md and the sample applications shipped in the SDK package.
Authentication (login)
Function | Purpose |
|---|---|
| Log in with a username and password. |
| Log in with a personal API key minted from the API Keys screen. |
| Log out and end the session. |
| Advanced: fetch or refresh the cached CSRF token (normally handled for you). |
Environments (system)
Manage Pulse environments (TM1 servers) shown on the Environments admin page.
Function | Purpose |
|---|---|
| List environments (optionally include soft-deleted, or return workspace agents). |
| List environments the current non-admin user may see. |
| Test an environment connection without saving. |
| Create, update, activate, or deactivate an environment. |
| Soft-delete an environment. |
Instance settings (system)
Manage the TM1 instances (services) within an environment.
Function | Purpose |
|---|---|
| List instances plus notification email groups for an environment. |
| Save, activate, or deactivate instances (re-validates active ones). |
| Request a TM1 instance upgrade (PAoC / managed environments only). |
Users (system_users)
Function | Purpose |
|---|---|
| List users, groups, and a dummy-password placeholder. |
| Create ( |
| Delete a user (built-in admin and SYNC-source users are protected). |
Groups (system_groups)
Function | Purpose |
|---|---|
| List security groups with their permission flags. |
| Get a blank group template (starting point for a create). |
| Create ( |
| Delete a group (the built-in PUBLIC group cannot be deleted). |
| List Windows / Active Directory groups available to import. |
| Import the named AD groups. |
Alerts (settings)
Create, update, and delete Pulse system alerts and alert templates.
Function | Purpose |
|---|---|
| List alerts, alert types, and email groups for an environment. |
| Create, update, or delete an alert (set |
| List alert templates for the environment's TM1 version. |
| Create or update an alert template. |
| Delete an alert template. |
| Restore built-in templates by id. |
| Upload a |
| Read / save monitor-connectivity alerts. |
| List email groups selectable for alerts. |
Credentials (credentials)
Function | Purpose |
|---|---|
| Read a masked environment or instance credential. |
| List credentials the current user may see for an environment. |
| Save a TM1 or workspace credential. |
API keys (api_keys)
Function | Purpose |
|---|---|
| List API keys for the current user (or all users, for an administrator). |
| Create a new API key. The key value is returned once, at creation. |
| Revoke a key without deleting it. |
| Delete a key. |
Migration: create a package (packages)
The Create Package wizard threads a mutable state object through several calls, then saves asynchronously (poll the status until it resolves).
Function | Purpose |
|---|---|
| Initial wizard state: available services plus a default date range. |
| Pre-selected items for a manual source-to-target create. |
| Change authors within the source / date range. |
| Detected changes for the selection. |
| Dependencies for the included changes. |
| Start the create asynchronously. |
| Poll create status; returns the created package(s) once done. |
Migration: execute a package (packages)
Executing a package updates the target TM1 instance. Test against a non-production environment first.
Function | Purpose |
|---|---|
| Prepare: candidate target service plus package metadata. |
| Compute the operations to apply for the prepared target. |
| Re-read the previously computed operation list. |
| Start the execution asynchronously. |
| Poll overall run status until it succeeds. |
| Stream per-item progress log lines (incremental). |
Migration: list, view & import packages (packages)
Function | Purpose |
|---|---|
| List packages, newest first (no execution history). |
| List packages with their per-package execution history (date-filterable). |
| Full package details: contents, execution, and approval history. |
| Recreate a new package from an existing one. |
| Upload a previously exported package file (multipart). |
Migration: approvals (packages)
Function | Purpose |
|---|---|
| List migration approval requests. |
| Submit a package for approval. |
| Approve or deny an approval request. |
| Archive an approval request. |
Other namespaces
The same client also exposes the remaining Pulse REST areas, following the same naming rules: system_account, system_sync, reserved_credentials, permissions, vcs, metadata, process_history, monitoring, live_monitor, object_locking, web_artifacts and reports.
Any endpoint that has no dedicated method yet is still reachable through the underlying request helper, with the same CSRF and error handling:
client.request('GET', 'api/system/status', csrf=False)
client.request('POST', 'api/system/alert', body=alert)Error handling
Every call raises a PulseApiError on failure. Note that .status may be 200 for envelope-style errors, where .body holds the parsed { Message, Success: false, Failed: true } response.
from pulse_api import PulseApi, PulseApiError
try:
client.system_users.save(user)
except PulseApiError as e:
print(e.message, e.status, e.body)