Skip to content

Providers V1 — Developer Guide

Reference: Providers (V1) Endpoint Documentation


Providers represent dentists, hygienists, and other clinical staff in your organization. Use these endpoints to list providers, retrieve individual records, create new providers, and update existing ones. Providers are referenced by linked model { id } on appointments, clinical notes, and other resources.

There is no REST DELETE endpoint for providers.


GET — Bulk List Providers

GET — Bulk List Providers — click to expand

Returns a paginated list of providers filtered by the provided criteria.

⚠️ Rate Limited: This endpoint is rate limited. See the rate limiting guide for details.

Parameters

ParameterInRequiredTypeDescription
Organization-IDheaderYesstringThe organization ID
filterqueryNostringFilter criteria (see filter keys below). If omitted, a default date-limiting filter may be applied automatically.
responseFieldsqueryNostringComma-delimited list of fields to include, or ALL
pageSizequeryNostringNumber of records per page (default 100, maximum 500)
lastIdqueryNostringLargest provider id from the previous page, used for cursor pagination

✅ Recommended: Use lastId cursor pagination for large result sets (see below). Combine with lastModified filters to scope changes over time.

Filter Keys

Filter KeyOperatorsExample
id->?filter=id->[1000000020702,1000000020703]
location.id==, ->?filter=location.id==64000000000004
user.id==, ->?filter=user.id==12000006542062
lastModified>, >=, <, <=?filter=lastModified>=2025-01-01T00:00:00.000Z

When filtering by lastModified, results are returned in descending order (newest first). Use lastId with date filters for stable cursor pagination.

Combine filters with commas, for example: filter=location.id==64000000000004,lastModified>2025-01-01T00:00:00.000Z.

Note: A very wide lastModified range with no other scoping can return 408 (timeout) on large tenants. Narrow your filter and retry.

Example Requests

Fetch providers modified since a date:

GET /api/v1/providers?filter=lastModified>=2025-01-01T00:00:00.000Z

Fetch providers at a specific location:

GET /api/v1/providers?filter=location.id==64000000000004

Fetch specific providers by ID:

GET /api/v1/providers?filter=id->[1000000020702,1000000020703]

Paginating with lastId

Paginating with `lastId` — click to expand

lastId uses the provider's id as a cursor. Pass the largest id from the previous page as lastId for the next request.

When lastId is present, meta.pagination.total is not included in the response. Use GET /v1/providers/totalcount when you need a record count. See also Bulk GET — Total Count Behavior.

Step 1 — Initial request

Send the first request without lastId:

GET /api/v1/providers?pageSize=500&filter=lastModified>2025-01-01T00:00:00.000Z

Step 2 — Subsequent requests

Use the id of the last object in the data array as lastId:

GET /api/v1/providers?lastId=1000000020703&pageSize=500&filter=lastModified>2025-01-01T00:00:00.000Z

Step 3 — Repeat

Continue until data is empty or you have retrieved all records you need.


GET — Total Count

GET — Total Count — click to expand

Returns the number of provider records matching a filter.

GET /api/v1/providers/totalcount

Uses the same filter syntax and filter keys as bulk GET. Only Organization-ID and filter apply — pagination query parameters are not used on this endpoint.

Example Request

GET /api/v1/providers/totalcount?filter=lastModified>=2025-01-01T00:00:00.000Z,location.id==64000000000004

Response

FieldTypeDescription
data.totalCountintegerNumber of providers matching the filter

Example Response

{
  "data": {
    "totalCount": 42
  },
  "warnings": [],
  "errors": []
}

GET — Provider by ID

GET — Provider by ID — click to expand

Returns a single provider by its ID.

Parameters

ParameterInRequiredTypeDescription
providerIdpathYesintegerThe ID of the provider
Organization-IDheaderYesstringThe organization ID
responseFieldsqueryNostringComma-delimited list of fields to include, or ALL

Example Request

GET /api/v1/providers/1000000020702

A provider that does not exist in your organization returns 404 with ProviderV1 not found.


POST — Create Provider

POST — Create Provider — click to expand

Creates a new provider. Returns 201 with the created resource in data.

Base Required Fields

All create requests require:

FieldTypeDescription
firstNamestring1–25 characters
lastNamestring1–50 characters
shortNamestring3–6 characters
specialtystringProvider specialty enum (see below)
isPrimaryProviderbooleanWhether this provider is the primary provider
address1stringStreet address, max 50 characters
citystringMax 30 characters
statestringUS state or territory code (e.g. CA, TX)
postalCodestring5–10 characters

Conditional Required Fields

When isPrimaryProvider is true, or when specialty is not HYGIENIST, these fields are also required:

FieldTypeDescription
npistringNational Provider Identifier, max 10 characters
stateIdstringState license number, 1–20 characters
tinstringTax identification number, exactly 9 numeric digits

Specialty Values

DENTALPUBLICHEALTH, DENTALSPECIALTY, DENTIST, DENTAL, ENDODONTICS, FEDERALLYQUALIFIEDHEALTHCENTER, GENERALPRACTICE, HYGIENIST, MULTISPECIALTY, ORTHODONTICS, ORALMAXILLOFACIALPATHOLOGY, ORALMAXILLOFACIALRADIOLOGY, ORALMAXILLOFACIALSURGERY, PEDIATRICDENTISTRY, PERIODONTICS, PROSTHODONTICS, SINGLESPECIALTY

Scenario 1 — POST: Create a Primary Dentist — click to expand

Use when creating a dentist who is the primary provider. Requires npi, stateId, and tin.

Example Request Body

{
  "firstName": "John",
  "lastName": "Doe",
  "shortName": "JD-DDS",
  "specialty": "DENTIST",
  "isPrimaryProvider": true,
  "npi": "1234567893",
  "stateId": "DDS-12345",
  "tin": "123456789",
  "color": "ffffff",
  "address1": "123 Main St",
  "address2": "Suite 100",
  "city": "Salt Lake City",
  "state": "UT",
  "postalCode": "84103"
}
Scenario 2 — POST: Create a Hygienist Without Identifiers — click to expand

Use when creating a hygienist who is not the primary provider. npi, stateId, and tin can be omitted.

Example Request Body

{
  "firstName": "Jane",
  "lastName": "Smith",
  "shortName": "J-HYG",
  "specialty": "HYGIENIST",
  "isPrimaryProvider": false,
  "color": "ffffff",
  "address1": "123 Main St",
  "city": "Salt Lake City",
  "state": "UT",
  "postalCode": "84103"
}
Scenario 3 — POST: Create a Provider With a Linked User — click to expand

Use when creating a provider and assigning an existing user account. The user must not already be assigned to another provider.

Example Request Body

{
  "firstName": "John",
  "lastName": "Doe",
  "shortName": "JD-DDS",
  "specialty": "DENTIST",
  "isPrimaryProvider": true,
  "npi": "1234567893",
  "stateId": "DDS-12345",
  "tin": "123456789",
  "address1": "123 Main St",
  "city": "Salt Lake City",
  "state": "UT",
  "postalCode": "84103",
  "user": {
    "id": 12000006542062
  }
}

PUT — Update Provider

PUT — Update Provider — click to expand

Updates an existing provider. Only fields included in the request body are changed; omitted fields remain unchanged.

Returns 200 with the updated resource. By default, the response includes only modified fields (responseFields=MODIFIED). Use ?responseFields=ALL when you need the full resource after update.

Example Request

PUT /api/v1/providers/1000000020702?responseFields=ALL
Scenario 1 — PUT: Assign a User (First Time) — click to expand

Use when a provider has no user assigned yet. Once assigned, the user cannot be changed or removed via the API.

Example Request Body

{
  "user": {
    "id": 12000006542062
  }
}
Scenario 2 — PUT: Update Address — click to expand

Example Request Body

{
  "address1": "456 Oak Ave",
  "address2": null,
  "city": "Provo",
  "state": "UT",
  "postalCode": "84604"
}

Note: When responseFields is omitted (default MODIFIED), unchanged fields such as state may not appear in the response even if sent in the request.

Scenario 3 — PUT: Link Insurance Carriers — click to expand

Example Request Body

{
  "insuranceCarriers": [
    { "id": 1000000020702 },
    { "id": 1000000020703 }
  ]
}

Pass an empty array to clear all linked carriers: "insuranceCarriers": [].

Scenario 4 — PUT: Toggle Signature on File — click to expand

Example Request Body

{
  "signatureOnFile": true
}

PUT Constraints

ConstraintBehavior
active: falseNot supported — returns 400. Contact support to deactivate a provider.
Change assigned userNot supported once a user is assigned
user: nullNot supported — cannot unassign a user via API
Provider assigned to a locationfirstName, lastName, address1, address2, city, state, postalCode, and user are read-only
isPrimaryProvider: falseNot allowed when the provider has patients assigned
location in request bodyIgnored with a read-only warning — location assignment is not writable via API
isNonPersonEntityRead-only — ignored if sent on create or update

StreamAPI Webhooks

Providers emit StreamAPI events on CREATE (POST) and UPDATE (PUT). For real-time sync, use StreamAPI webhooks (SNS) instead of polling bulk GET. Setup is covered in Creating and Setting Up Webhooks for the StreamAPI.

There is no REST DELETE endpoint for providers.

Routing Key Format

organizationId.locationId.ProviderV1.operationType

When no location is associated, locationId is -1.

Example Routing Keys

All provider events:

66d22762060811049b50d085.*.ProviderV1.*

Creates only:

66d22762060811049b50d085.*.ProviderV1.CREATE

Updates only:

66d22762060811049b50d085.*.ProviderV1.UPDATE

Payload Behavior

OperationPublic payload
CREATEFull provider resource (public fields only)
UPDATEChanged fields only (public fields only)

Public stream payloads exclude internal-only fields and follow the same field visibility as REST GET responses.


Response Structure

A successful 200/201 response returns:

FieldTypeDescription
dataobjectThe created or retrieved provider
warningsarrayNon-fatal warnings (e.g. read-only fields ignored)
errorsarrayField-level errors

For bulk GET, data is an array and includes meta.pagination.

meta.pagination

FieldTypeDescription
limitintegerPage size used for this response
offsetintegerOffset for this page
totalintegerTotal matching records — omitted when using lastId cursor pagination

data Object — Provider Fields

FieldTypeRead-OnlyDescription
idintegerYesUnique provider ID
typestringYesAlways "ProviderV1"
firstNamestringNoFirst name (1–25 characters)
middleInitialstringNoMiddle initial (max 1 character)
lastNamestringNoLast name (1–50 characters)
shortNamestringNoShort display name (3–6 characters)
specialtystringNoProvider specialty enum
npistringNoNational Provider Identifier
stateIdstringNoState license number
tinstringNoTax identification number (9 digits)
colorstringNoHex color (fff or ffffff)
activebooleanNoWhether the provider is active
isPrimaryProviderbooleanNoPrimary provider flag
isNonPersonEntitybooleanYesWhether the provider is a non-person entity (e.g. equipment)
signatureOnFilebooleanNoSignature-on-file flag
titlestringNoTitle (max 50 characters)
isLocumTenensbooleanNoLocum tenens flag
address1stringNoStreet address line 1
address2stringNoStreet address line 2 (nullable)
citystringNoCity
statestringNoUS state or territory code
postalCodestringNoPostal code
feeScheduleobjectNoLinked model { id, type, url } when assigned
userobjectNoLinked model { id, type, url } when assigned
insuranceCarriersarrayNoArray of linked models { id, type, url } when assigned
locationobjectYesLinked model { id, type, url } when provider is assigned to a location
stateIdExpirationstringNoState ID expiration date (YYYY-MM-DD) when set
lastModifiedstringYesLast modification timestamp (ISO 8601)

Errors & Warnings Reference

HTTP Status Code Errors — click to expand

400 — Bad Request

The request body or parameters are invalid. See field-level errors below.


401 — Unauthorized

MessageAuthentication is required and has failed or has not been provided.
FixProvide a valid Bearer token in the Authorization header.

403 — Forbidden

MessageThe request is understood, but it has been refused or access is not allowed.
WhyThe caller is not allowed to perform this operation for the organization or resource.
FixConfirm your integration credentials and that the organization has enabled the capabilities needed for this API. See the API Consumer Guide.

404 — Not Found

MessageThe requested resource is either missing or does not exist.
WhyNo provider exists for the given providerId within your organization.
FixConfirm the providerId is correct and belongs to your organization.

408 — Request Timeout

MessageThe server timed out while processing the request.
WhyOften caused by an overly broad filter on a large tenant.
FixNarrow filter criteria (add location.id, user.id, or a tighter lastModified range) and retry.

429 — Too Many Requests

MessageRate limit exceeded.
FixImplement exponential backoff. See the rate limiting guide.

500 — Internal Server Error

MessageAn unexpected error occurred.
FixRetry. If the issue persists, contact support.

Field-Level Validation Errors — click to collapse

firstName / lastName

Error: firstName must be longer than or equal to 1 characters (or same for lastName).

WhyThe field was set to null or an empty string on PUT.
FixProvide a non-empty string within the length limits.

specialty

Error: specialty must have a value in [...]

WhyThe specialty was set to null or an unrecognized value.
FixUse one of the supported specialty enum values.

npi, stateId, tin

Error: You cannot make provider primary without setting his npi (and similar for stateId, tin).

WhyisPrimaryProvider is true but one or more identifiers are missing on create or update.
FixInclude all three fields when the provider is primary.

Error: You cannot make provider non-HYGIENIST without setting his npi (and similar for stateId, tin).

WhySpecialty is not HYGIENIST but identifiers are missing or were cleared.
FixInclude npi, stateId, and tin for non-hygienist specialties.

user

Error: Linked model for property 'user' should be plain object with id of UserV1

WhyThe user value is not a valid linked model object.
FixSend { "id": <userId> } with a valid user ID.

Error: Linked model with id '<id>' of type 'UserV1' not found

WhyNo user exists with the given ID in your organization.
FixConfirm the user ID is correct.

Error: userId <id> is incorrect. This user is already assigned to another provider

WhyThe user is already linked to a different provider.
FixChoose a user that is not assigned, or update the existing provider instead.

Error: You cannot change user for provider

WhyAttempted to change the user on a provider that already has one assigned.
FixUser assignment is permanent via the API. Contact support if reassignment is required.

Error: You cannot unassign user from provider for now, please contact support in case of need

WhyAttempted to set user: null.
FixUser unassignment is not supported via the API. Contact support if needed.

feeSchedule

Error: Linked model for property 'feeSchedule' should be plain object with id of FeeScheduleV1

WhyInvalid linked model shape for feeSchedule.
FixSend { "id": <feeScheduleId> } with a valid fee schedule ID.

active

Error: You cannot deactivate a provider for now, please contact support in case of need

WhyAttempted to set active: false.
FixProvider deactivation is not supported via the API. Contact support.

isPrimaryProvider

Error: You cannot set isPrimaryProvider to false because he has patients

WhyThe provider has patients assigned and cannot be demoted from primary.
FixReassign patients before changing the primary provider flag.

Location-assigned read-only fields

Error: Provider is assigned to location. Field <fieldName> is readonly

WhyThe provider is assigned to a location and the field cannot be updated via API.
FixAffected fields: firstName, lastName, address1, address2, city, state, postalCode, user.

insuranceCarriers

Error: insuranceCarriers must be an array

WhyinsuranceCarriers was set to null.
FixSend an array (use [] to clear).

Error: Each element in array should be an object and contain 'id' key...

WhyAn array element is missing a valid id.
FixEach entry must be { "id": <insuranceCarrierId> }.

Error: Linked models with ids [...] of type 'InsuranceCarrierV1' not found

WhyOne or more insurance carrier IDs do not exist.
FixConfirm carrier IDs belong to your organization.

Address fields (address1, city, state, postalCode)

Error: Validation errors when required address fields are nulled or emptied.

WhyAddress fields cannot all be cleared — at least address1, city, state, and postalCode must remain valid.
FixProvide valid address values within length and enum constraints.

color

Error: Invalid hex color value.

Whycolor is not a valid 3- or 6-character hex string.
FixUse formats like "fff" or "ffffff".

location (write)

Warning: Property 'location' is read-only. Assignment is ignored.

Whylocation was included in a POST or PUT body.
FixOmit location from write requests. It appears on GET responses when the provider is assigned to a location.

isNonPersonEntity (write)

Warning: Property 'isNonPersonEntity' is read-only. Assignment is ignored.

WhyisNonPersonEntity was included in a POST or PUT body.
FixOmit this field from write requests. It is returned on GET responses.