Stitchflow
Redash logo

Redash User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 16, 2026

Summary and recommendation

Redash exposes a REST API under /api/ (no versioned path prefix) authenticated via an API key passed as a query parameter (?api_key=<key>) or an Authorization: Key <key> header.

All user-management operations - create, update, disable, group assignment - require an admin-level key; non-admin keys return 403.

The API is non-standard in two important ways: updates use POST rather than PATCH or PUT, and there is no hard-delete endpoint for users - deactivation via POST /api/users/{id}/disable is the only supported removal path.

Because the API carries no version prefix, breaking changes across major Redash releases are possible without a deprecation signal.

For identity graph construction, the user object exposes id, email, groups (array of group IDs), is_disabled, is_invitation_pending, active_at, and api_key.

Group membership is the authoritative access vector: data source permissions are assigned at the group level, so resolving a user's effective access for the identity graph requires a secondary GET /api/groups/{id} call to map group IDs to data source grants.

There is no SCIM endpoint and no webhook system; the identity graph must be built and maintained by polling GET /api/users and correlating against GET /api/groups.

For teams using an MCP server with 60+ deep IT/identity integrations, Redash's flat REST surface is straightforward to wrap, but the absence of pagination on /api/users means the full user list is returned in a single payload on every sync.

SSO-authenticated users (SAML/LDAP) may have password fields ignored and group membership controlled by IdP attribute mapping rather than the API, which can cause drift between API-visible group state and effective access.

API quick reference

Has user APIYes
Auth methodAPI Key (passed as query parameter `api_key` or via `Authorization: Key <api_key>` header)
Base URLOfficial docs
SCIM availableNo
SCIM plan requiredN/A

Authentication

Auth method: API Key (passed as query parameter api_key or via Authorization: Key <api_key> header)

Setup steps

  1. Log in to Redash as an admin user.
  2. Navigate to the user's profile page (Settings → Profile or /users/).
  3. Copy the API Key shown under 'API Key'.
  4. Include it in requests as a query parameter: ?api_key=, or as an HTTP header: Authorization: Key .
  5. Admin-level API keys are required for user-management operations (create, update, disable).

User object / data model

Field Type Description On create On update Notes
id integer Unique user ID auto-assigned read-only
name string Display name required optional
email string User email address (login identifier) required optional Must be unique within the org
password string Password (write-only) optional optional Only used when local auth is enabled
password_repeat string Password confirmation optional optional Must match password field
org_id integer Organization ID the user belongs to auto-assigned read-only
profile_image_url string URL to user avatar (Gravatar-based) auto-assigned read-only
is_disabled boolean Whether the user account is disabled defaults false optional Set true to deactivate without deleting
is_invitation_pending boolean True if user has not yet accepted invite auto-set read-only
is_email_verified boolean Whether email has been verified auto-set read-only
active_at string (ISO 8601) Timestamp of last activity null auto-updated
created_at string (ISO 8601) Account creation timestamp auto-set read-only
updated_at string (ISO 8601) Last update timestamp auto-set auto-updated
groups array[integer] List of group IDs the user belongs to optional optional Group IDs; default group is auto-assigned
api_key string User's personal API key auto-generated regeneratable via separate endpoint Returned only to admins or the user themselves

Core endpoints

List all users

  • Method: GET
  • URL: /api/users
  • Watch out for: Returns all users in the organization. No pagination; large orgs may return large payloads.

Request example

GET /api/users?api_key=<admin_key>

Response example

[
  {
    "id": 1,
    "name": "Alice",
    "email": "alice@example.com",
    "is_disabled": false,
    "groups": [1, 2]
  }
]

Get single user

  • Method: GET
  • URL: /api/users/{id}
  • Watch out for: Use id=current to retrieve the authenticated user's own record.

Request example

GET /api/users/42?api_key=<admin_key>

Response example

{
  "id": 42,
  "name": "Bob",
  "email": "bob@example.com",
  "is_disabled": false,
  "api_key": "abc123",
  "groups": [1]
}

Create user (invite)

  • Method: POST
  • URL: /api/users
  • Watch out for: Creates user and sends an invitation email. Requires admin API key. Password is not set until the user accepts the invite.

Request example

POST /api/users
Content-Type: application/json

{
  "name": "Carol",
  "email": "carol@example.com"
}

Response example

{
  "id": 99,
  "name": "Carol",
  "email": "carol@example.com",
  "is_invitation_pending": true
}

Update user

  • Method: POST
  • URL: /api/users/{id}
  • Watch out for: Redash uses POST (not PATCH/PUT) for updates. Admins can update any user; non-admins can only update their own profile.

Request example

POST /api/users/42
Content-Type: application/json

{
  "name": "Bob Updated",
  "email": "bob2@example.com"
}

Response example

{
  "id": 42,
  "name": "Bob Updated",
  "email": "bob2@example.com"
}

Disable user

  • Method: POST
  • URL: /api/users/{id}/disable
  • Watch out for: Disabling is the recommended deactivation method; there is no hard-delete endpoint exposed via the REST API.

Request example

POST /api/users/42/disable?api_key=<admin_key>

Response example

{
  "id": 42,
  "is_disabled": true
}

Re-enable user

  • Method: DELETE
  • URL: /api/users/{id}/disable
  • Watch out for: Counter-intuitively uses DELETE on the /disable sub-resource to re-enable an account.

Request example

DELETE /api/users/42/disable?api_key=<admin_key>

Response example

{
  "id": 42,
  "is_disabled": false
}

Regenerate API key

  • Method: POST
  • URL: /api/users/{id}/regenerate_api_key
  • Watch out for: Immediately invalidates the previous API key for that user.

Request example

POST /api/users/42/regenerate_api_key?api_key=<admin_key>

Response example

{
  "api_key": "newkey456"
}

Send password reset email

  • Method: GET
  • URL: /api/users/{id}/reset_password
  • Watch out for: Only applicable when local password authentication is enabled. Has no effect when SSO is the sole auth method.

Request example

GET /api/users/42/reset_password?api_key=<admin_key>

Response example

{}

Rate limits, pagination, and events

  • Rate limits: No rate limiting is documented in official Redash sources. Self-hosted deployments inherit whatever limits the operator configures at the infrastructure level.

  • Rate-limit headers: No

  • Retry-After header: No

  • Rate-limit notes: No official rate-limit documentation exists. Operator-configured reverse-proxy limits (e.g., nginx) may apply.

  • Pagination method: none

  • Default page size: 0

  • Max page size: 0

  • Pagination pointer: Not documented

  • Webhooks available: No

  • Webhook notes: Redash does not provide a native webhook system for user lifecycle events.

  • Alternative event strategy: Poll /api/users periodically to detect changes, or monitor application logs / database events on self-hosted deployments.

SCIM API status

  • SCIM available: No
  • SCIM version: Not documented
  • Plan required: N/A
  • Endpoint: Not documented

Limitations:

  • No SCIM support exists in the open-source Redash codebase.
  • IdP integrations (Okta, Entra ID, OneLogin) are limited to SSO/SAML authentication; user provisioning must be done via the REST API or manually.
  • The Redash cloud service was discontinued in November 2021; no hosted SCIM offering exists.

Common scenarios

Three automation scenarios are well-supported by the API.

First, provisioning: POST /api/users with {name, email} creates the user and triggers an invitation email; group assignment is a separate POST /api/groups/{group_id}/members call using the returned user_id - group IDs must be resolved via GET /api/groups beforehand, as they are not accepted in the create payload.

Second, deprovisioning: GET /api/users to resolve the user's id by email, then POST /api/users/{id}/disable; follow with POST /api/users/{id}/regenerate_api_key to immediately invalidate their personal key. Note that disabling does not remove group memberships or retroactively revoke access to shared resources.

Third, directory sync: fetch the full user list via GET /api/users, diff against the external directory on email and is_disabled, create missing users, and disable users absent from the directory.

No delta or incremental endpoint exists, so every sync cycle fetches the complete list.

Provision a new user and assign to a group

  1. POST /api/users with {name, email} using an admin API key to create the user and trigger an invitation email.
  2. Note the returned user id.
  3. POST /api/groups/{group_id}/members with {user_id: } to add the user to the desired group.
  4. User accepts the invitation email and sets their password to complete onboarding.

Watch out for: Group membership is managed via /api/groups/{id}/members, not directly in the user create payload. Confirm group IDs via GET /api/groups first.

Deactivate a departed user

  1. GET /api/users to find the user's id by email.
  2. POST /api/users/{id}/disable with an admin API key to set is_disabled=true.
  3. Optionally POST /api/users/{id}/regenerate_api_key to invalidate their API key immediately.

Watch out for: Disabling does not remove the user from groups or revoke existing query/dashboard permissions retroactively. Review shared resources separately.

Sync user list to an external directory

  1. GET /api/users with an admin API key to retrieve all users.
  2. Compare returned list (email, is_disabled, groups) against the external directory.
  3. For missing users, POST /api/users to create them.
  4. For users present in Redash but removed from the directory, POST /api/users/{id}/disable.

Watch out for: No pagination or delta/incremental endpoint exists; the full user list is fetched on every sync. For large orgs this may be slow. No webhook exists to trigger real-time sync.

Why building this yourself is a trap

The primary integration risk is the lack of pagination on GET /api/users: all users are returned in one response with no cursor, offset, or Link header. This is acceptable at small scale but becomes a latency and memory concern as the user base grows, and there is no documented plan to add pagination.

A second caveat is the re-enable endpoint: DELETE /api/users/{id}/disable re-enables an account - the DELETE method on a /disable sub-resource is counter-intuitive and easy to misread as a permanent delete operation.

Finally, because there is no webhook or event stream for user lifecycle changes, any integration that needs near-real-time sync must poll; missed deprovisioning events between cycles represent a real access-control gap in environments with compliance requirements.

Automate Redash workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 16, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

Abnormal Security logo

Abnormal Security

API Only
AutomationAPI only
Last updatedMar 2026

Abnormal Security is an enterprise email security platform focused on detecting and investigating threats such as phishing, account takeover (ATO), and vendor email compromise. It does not support SCIM provisioning, which means every app in your stack

ActiveCampaign logo

ActiveCampaign

API Only
AutomationAPI only
Last updatedFeb 2026

ActiveCampaign uses a group-based permission model: every user belongs to exactly one group, and all feature-area access (Contacts, Campaigns, Automations, Deals, Reports, Templates) is configured at the group level, not per individual. The default Adm

ADP logo

ADP

API Only
AutomationAPI only
Last updatedFeb 2026

ADP Workforce Now is a mid-market to enterprise HCM platform that serves as the HR source of record for employee data — payroll, benefits, time, and talent. User access is governed by a hybrid permission model: predefined security roles (Security Maste