Stitchflow
Healthie logo

Healthie User Management API Guide

API workflow

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

UpdatedMar 17, 2026

Summary and recommendation

Healthie exposes a single GraphQL endpoint at https://api.gethealthie.com/graphql for all user management operations - there are no REST endpoints.

Authentication uses an API key passed as `Authorization: Basic <api_key>`;

note this is Basic format, not Bearer, despite being a key-based scheme.

Client (patient) users and provider/staff users are managed through entirely separate mutation paths: `createClient` for patients and `createOrganizationMembership` for staff.

This split is a hard architectural constraint, not a configuration choice, and must be accounted for in any identity graph that maps Healthie user types to a unified directory schema.

Rate limits are not publicly documented;

the API may throttle at high request volumes without warning headers or a `Retry-After` signal.

Pagination is offset-based with a default page size of 10;

large roster syncs should batch requests using the `offset` parameter.

GraphQL introspection may be restricted on production environments - rely on official schema docs rather than runtime discovery.

Webhooks are available for key lifecycle events including `client.created`, `client.updated`, and `appointment.*` events, configured under Settings → Integrations → Webhooks.

SCIM 2.0 is not natively supported on any documented plan;

IdP-based provisioning via Okta or Entra ID is not officially documented.

All data handling is subject to HIPAA obligations - confirm BAA requirements with Healthie before storing or processing PHI through the API.

API quick reference

Has user APIYes
Auth methodAPI Key (Bearer token in Authorization header)
Base URLOfficial docs
SCIM availableNo
SCIM plan requiredEnterprise (white-label)

Authentication

Auth method: API Key (Bearer token in Authorization header)

Setup steps

  1. Log in to your Healthie account.
  2. Navigate to Settings > Integrations > API Keys.
  3. Generate a new API key for your organization or user.
  4. Include the key in all requests as: Authorization: Basic

User object / data model

Field Type Description On create On update Notes
id ID Unique identifier for the user auto-generated immutable GraphQL ID scalar
first_name String User's first name required optional
last_name String User's last name required optional
email String User's email address required optional Used as login identifier
phone_number String User's phone number optional optional
dob String Date of birth (YYYY-MM-DD) optional optional Applies to client/patient users
gender String User's gender optional optional
role String User role (e.g., patient, provider, admin) required optional Determines access level
dietitian_id ID ID of the assigned provider/dietitian optional optional Links client to a provider
active Boolean Whether the user account is active optional optional
created_at String Timestamp of account creation auto-generated immutable ISO 8601
updated_at String Timestamp of last update auto-generated auto-updated ISO 8601
timezone String User's timezone optional optional
location String User's location/address optional optional
avatar_url String URL of user's profile photo optional optional
policies [Policy] Insurance policies associated with the user optional optional Nested object
tags [Tag] Tags/labels applied to the user optional optional
user_group UserGroup Group membership for the user optional optional

Core endpoints

Get current user

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Returns the user associated with the API key used in the request.

Request example

query {
  currentUser {
    id
    first_name
    last_name
    email
    role
  }
}

Response example

{
  "data": {
    "currentUser": {
      "id": "123",
      "first_name": "Jane",
      "last_name": "Doe",
      "email": "jane@example.com",
      "role": "provider"
    }
  }
}

Get user by ID

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Requires appropriate provider/admin permissions; clients cannot query other users.

Request example

query {
  user(id: "456") {
    id
    first_name
    last_name
    email
    active
  }
}

Response example

{
  "data": {
    "user": {
      "id": "456",
      "first_name": "John",
      "last_name": "Smith",
      "email": "john@example.com",
      "active": true
    }
  }
}

List users (clients)

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Returns clients visible to the authenticated provider. Use offset for pagination.

Request example

query {
  users(offset: 0, keywords: "") {
    id
    first_name
    last_name
    email
  }
}

Response example

{
  "data": {
    "users": [
      {"id": "1", "first_name": "Alice", "last_name": "A", "email": "a@ex.com"},
      {"id": "2", "first_name": "Bob", "last_name": "B", "email": "b@ex.com"}
    ]
  }
}

Create user (client)

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Use createClient for patient/client users; provider creation uses a separate mutation. dietitian_id assigns the client to a provider.

Request example

mutation {
  createClient(input: {
    first_name: "Jane"
    last_name: "Doe"
    email: "jane@example.com"
    dietitian_id: "789"
  }) {
    user { id email }
    messages { field message }
  }
}

Response example

{
  "data": {
    "createClient": {
      "user": {"id": "999", "email": "jane@example.com"},
      "messages": []
    }
  }
}

Update user

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Partial updates are supported; only provided fields are changed.

Request example

mutation {
  updateClient(input: {
    id: "999"
    phone_number: "555-1234"
    timezone: "America/New_York"
  }) {
    user { id phone_number }
    messages { field message }
  }
}

Response example

{
  "data": {
    "updateClient": {
      "user": {"id": "999", "phone_number": "555-1234"},
      "messages": []
    }
  }
}

Delete user

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Deletion may be irreversible; confirm behavior with Healthie support for HIPAA data retention requirements.

Request example

mutation {
  deleteClient(input: { id: "999" }) {
    id
    messages { field message }
  }
}

Response example

{
  "data": {
    "deleteClient": {
      "id": "999",
      "messages": []
    }
  }
}

Create provider/team member

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Provider/staff creation uses organization membership mutations, not createClient.

Request example

mutation {
  createOrganizationMembership(input: {
    email: "provider@example.com"
    first_name: "Dr"
    last_name: "Smith"
  }) {
    organizationMembership { id }
    messages { field message }
  }
}

Response example

{
  "data": {
    "createOrganizationMembership": {
      "organizationMembership": {"id": "555"},
      "messages": []
    }
  }
}

Get organization members

  • Method: POST
  • URL: https://api.gethealthie.com/graphql
  • Watch out for: Only accessible to organization admin-level API keys.

Request example

query {
  organizationMembers {
    id
    first_name
    last_name
    email
    role
  }
}

Response example

{
  "data": {
    "organizationMembers": [
      {"id": "10", "first_name": "Dr", "last_name": "Jones", "email": "jones@clinic.com", "role": "provider"}
    ]
  }
}

Rate limits, pagination, and events

  • Rate limits: Healthie does not publicly document specific rate limit thresholds or tiers in their developer docs as of the knowledge cutoff.

  • Rate-limit headers: No

  • Retry-After header: No

  • Rate-limit notes: No publicly documented rate limits found. Contact Healthie support for enterprise-level rate limit details.

  • Pagination method: offset

  • Default page size: 10

  • Max page size: Not documented

  • Pagination pointer: offset / page

  • Webhooks available: Yes

  • Webhook notes: Healthie supports webhooks to notify external systems of events such as new appointments, form completions, and user changes. Webhooks are configured in the Healthie dashboard under Settings > Integrations > Webhooks.

  • Alternative event strategy: Polling via GraphQL queries if webhooks are not available on a given plan.

  • Webhook events: appointment.created, appointment.updated, appointment.deleted, client.created, client.updated, form_answer_group.created, billing.updated

SCIM API status

  • SCIM available: No
  • SCIM version: Not documented
  • Plan required: Enterprise (white-label)
  • Endpoint: Not documented

Limitations:

  • No native SCIM 2.0 endpoint documented in official Healthie developer docs.
  • IdP-based provisioning (Okta, Entra, etc.) is not officially documented as supported.
  • User provisioning must be done via the GraphQL API directly.

Common scenarios

Three provisioning scenarios cover the primary lifecycle operations.

To provision a new patient, execute createClient with first_name, last_name, email, and dietitian_id;

omitting dietitian_id will cause the client to not appear in provider dashboards.

To deactivate a departing user, query by email using a keywords filter to retrieve their id, then set active: false via updateClient;

hard deletion via deleteClient is likely irreversible and may conflict with HIPAA data retention obligations, so deactivation is the safer default.

To sync organization staff, query organizationMembers to retrieve current provider accounts, use createOrganizationMembership for new staff, and subscribe to client.created and client.updated webhooks to keep an external directory current

this last step is essential for maintaining an accurate identity graph across your stack.

Provision a new patient/client

  1. Authenticate with your organization API key (Authorization: Basic ).
  2. Execute the createClient GraphQL mutation with required fields: first_name, last_name, email, and dietitian_id.
  3. Capture the returned user.id for future reference.
  4. Optionally update additional profile fields (dob, phone_number, timezone) via updateClient mutation.

Watch out for: dietitian_id is required to assign the client to a provider; without it the client may not appear in provider dashboards.

Deactivate a user when they leave

  1. Query the user by email using the users query with a keywords filter to retrieve their id.
  2. Execute the updateClient mutation with active: false to deactivate the account.
  3. Alternatively, use deleteClient if permanent removal is required and data retention policies permit.

Watch out for: Deletion is likely irreversible and may conflict with HIPAA data retention obligations. Prefer deactivation (active: false) over deletion.

Sync organization staff/providers

  1. Query organizationMembers to retrieve all current provider accounts and their IDs.
  2. For new staff, execute createOrganizationMembership with email, first_name, and last_name.
  3. For role or profile changes, use the appropriate update mutation with the member's id.
  4. Subscribe to client.created and client.updated webhooks to keep an external directory in sync.

Watch out for: Organization member management requires an admin-level API key; provider-level keys will receive permission errors.

Why building this yourself is a trap

The primary integration trap is the client/provider mutation split: tooling that assumes a single user creation path will silently fail or misroute staff accounts into the patient namespace.

A second trap is the undocumented rate limit - pipelines that fan out bulk provisioning requests without backoff logic risk unexpected throttling with no programmatic signal to recover from. The Authorization: Basic header format (rather than Bearer) will cause silent auth failures in any HTTP client that defaults to standard Bearer token handling.

Finally, because SCIM is absent, any IdP sync must be built and maintained against the GraphQL API directly, meaning schema changes in Healthie's API surface require active monitoring and pipeline updates on your side.

Automate Healthie 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 17, 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