Key Configuration

A MASTER_API_KEY can be specified as part of the Admin Configuration. We recommend using an online UUID generator.

Note
Available in Enterprise edition.

API REST Calls

CURL Examples

The simplest example is a call for which no authentication is required. For example:

Fetching CSV SQL Query Results

To authenticate calls as using HTTP basic authentication either:

  • Pass the username:password of a selected user
  • Pass the username api_key with the password MASTER_API_KEY as set in Admin Configuration

Creating Users via API

Server administrators can provision users via REST. Authenticate as an existing admin user (admin:pass) or use the api_key:MASTER_API_KEY mechanism shown above.

ActionurlMethodContent Type
Create user/api/user/adminPOSTapplication/json
Update user/api/user/adminPUTapplication/json
Delete user/api/user/{id}DELETE
List all users/api/user/privateGET

Supported JSON fields when creating a user:

  • name (required) - lowercase letters and digits only, 3-30 characters.
  • password (required) - at least 7 characters. Hashed before storage; never returned to the client.
  • email (optional) - must be unique if specified.
  • roleType (optional, defaults to EDITOR) - one of ADMIN, EDITOR, or VIEWER.

Mirroring Permissions via API

The POST /api/admin/sync-permissions endpoint accepts a flat list of (user, team, role) triples and idempotently ensures each user, team, and membership exists. Designed for enterprise SSO deployments to mirror their permissions source-of-truth (LDAP, SCIM, custom HR system, etc.) into Pulse on a schedule.

Users created by this endpoint are stored with the sentinel password constant User.EXTERNAL_AUTH_PASSWORD (currently the literal "EXTERNALAUTHENTICATION") — the same convention used for all SSO-authenticated users. They cannot sign in with a Pulse-managed password; authentication is delegated to your SSO / trusted-header layer.

ActionURLMethodContent Type
Sync permissions/api/admin/sync-permissionsPOSTapplication/json

Request body is a JSON array. Every row must have all three fields:

  • user — required. Used as the canonical user name. Stored as-provided (case-sensitive, not whitespace-trimmed) so the caller should send pre-normalized lowercase names to match existing Pulse usernames.
  • team — required. Same conventions as user.
  • role — required. Case-insensitive. Must resolve to VIEWER or EDITOR. Any other value (including ADMIN, NONE, or unknown strings) is counted as an error and the rest of the batch continues.

Response is a JSON object with four counts:

  • created — new memberships (possibly with new users/teams).
  • updated — existing memberships whose role changed (either direction).
  • noop — existing memberships unchanged.
  • errors — rows that failed validation. Per-row reasons are in the server log.

Behaviour summary:

  • Users, teams, and memberships are created if missing.
  • An existing membership's role is updated to the incoming value, including downgrades (EDITOR → VIEWER).
  • A user's global role is bumped from VIEWER to EDITOR if any row grants them EDITOR. ADMIN users are never modified. Global role is never downgraded by this endpoint.
  • Memberships present in Pulse but absent from the batch are not removed; they are logged at WARN as sync-permissions would-delete user=… team=… role=… so operators can spot drift.