MedTrainer Public API (1.0.0)
The MedTrainer Public API allows external integrations to search and manage core directory resources such as locations, divisions, and practitioners.
This specification describes the available endpoints, request parameters, payloads, authentication requirements, and expected responses for clients integrating with the platform.
Most resource endpoints return FHIR-aligned JSON with content type
application/fhir+json. Protected endpoints accept authentication through
either the X-API-Key header or Authorization: Bearer <token>.
This guide walks you through how to generate an API Key from the platform. This key will allow you to authenticate and interact with the available APIs.
Before you begin, make sure you have:
A valid account and access to the platform
Proper permissions to generate an API Key (Super Admin)
Logged into the platform
1. Log in to the platform
Sign in to the MedTrainer platform using your credentials.
2. Open Organization settings
Once you're in:
On the left-side menu
Click on Organization
3. Expand “Organization Management” and find the “API keys manager”
Inside Organization Settings:
Expand “Organization Management” menu
Here you’ll find all options to configure the organization
Look for “API keys manager” option and click on it
4. Create a new API Key group
In the “API keys manager” page:
Click on “Create API key group”
Fill the following fields:
name
description
Confirm the action by clicking the “Create” button.
5. Activate the API Key “Default”
After generating the API key group:
On the “API Keys Manager” page, you will see the newly created API key group, along with a “Default” API key in an “Inactive” status.
To activate the “Default” API key:
Click on the status to expand the available options.
Once the list is expanded, select the “Active” status
Search locations
Returns a FHIR Bundle with location resources.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/locations?_count=2&_page=2&_elements=id%2Cname"
}, - {
- "relation": "first",
- "url": "/api/v1/locations?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "previous",
- "url": "/api/v1/locations?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "last",
- "url": "/api/v1/locations?_count=2&_page=2&_elements=id%2Cname"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Location",
- "id": "LOC-003",
- "name": "Location test",
- "state": "State",
- "division": {
- "id": "DIV-003",
- "name": "East Division"
}, - "city": "City",
- "addressLine": "Address 1",
- "zipCode": "33101",
- "phoneNumber": "0987654321",
- "fax": "1234567890",
- "email": "test@example.com",
- "sendEmail": false,
- "enabledCredentialing": false
}
}
]
}Create a location
Authorizations:
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Required location name. Cannot be blank or whitespace-only. |
| state required | string non-empty ^\S+.*$ Required state value. Cannot be blank or whitespace-only. |
| addressLine | string Location address line. |
| city | string Location city. If provided, it cannot be blank or whitespace-only. |
| zipCode | string Location ZIP or postal code. |
| phoneNumber | string <= 10 characters ^[0-9]+$ Location phone number. Must contain only digits up to 10 characters. |
| fax | string <= 10 characters ^[0-9]+$ Location fax number. Must contain only digits up to 10 characters. |
string <email> Location email address. | |
| sendEmail | boolean Default: false Whether to send email for this location. |
| enabledCredentialing | boolean Default: false Whether credentialing is enabled for this location. |
object Optional division reference wrapper. |
Responses
Request samples
- Payload
{- "name": "North Campus",
- "state": "State",
- "city": "City",
- "addressLine": "Address 1",
- "zipCode": "33101",
- "phoneNumber": "0987654321",
- "fax": "1234567890",
- "email": "first@test.com",
- "sendEmail": false,
- "enabledCredentialing": false,
- "division": {
- "reference": "DIV-001"
}
}Response samples
- 200
- 201
- 400
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Location created successfully.",
- "id": "LOC-001"
}
}
]
}Get a location by public ID
Resolves the public location identifier before fetching the resource.
When _elements is provided, only the requested fields are returned.
Authorizations:
path Parameters
| publicId required | string Example: LOC-001 Public location identifier. |
query Parameters
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 401
- 404
- 429
- 500
- 502
{- "resourceType": "Location",
- "id": "LOC-001",
- "name": "North Campus",
- "addressLine": "Address 1",
- "city": "City",
- "state": "State",
- "division": {
- "id": "DIV-001",
- "name": "North Division"
}, - "zipCode": "33101",
- "phoneNumber": "0987654321",
- "fax": "1234567890",
- "email": "first@test.com",
- "sendEmail": false,
- "enabledCredentialing": true
}Update a location
Resolves the public location identifier before updating the resource.
Authorizations:
path Parameters
| publicId required | string Example: LOC-001 Public location identifier. |
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Required location name. Cannot be blank or whitespace-only. |
| state | string non-empty ^\S+.*$ Optional state value. If provided, it cannot be null, blank, or whitespace-only. Omit the field completely if you do not wish to update this field. |
| addressLine | string Location address line. |
| city | string Location city. If provided, it cannot be blank or whitespace-only. |
| zipCode | string Location ZIP or postal code. |
| phoneNumber | string <= 10 characters ^[0-9]+$ Location phone number. Must contain only digits up to 10 characters. |
| fax | string <= 10 characters ^[0-9]+$ Location fax number. Must contain only digits up to 10 characters. |
string <email> Location email address. | |
| sendEmail | boolean Default: false Whether to send email for this location. |
| enabledCredentialing | boolean Default: false Whether credentialing is enabled for this location. |
object Optional division reference wrapper. |
Responses
Request samples
- Payload
{- "name": "North Campus",
- "state": "State",
- "city": "City",
- "addressLine": "Address 1",
- "zipCode": "33101",
- "phoneNumber": "0987654321",
- "fax": "1234567890",
- "email": "first@test.com",
- "sendEmail": false,
- "enabledCredentialing": false,
- "division": {
- "reference": "DIV-001"
}
}Response samples
- 200
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Location updated successfully.",
- "id": "LOC-001"
}
}
]
}Update a location with PATCH
Resolves the public location identifier before updating the resource
with the same request body and validation rules as PUT.
Authorizations:
path Parameters
| publicId required | string Example: LOC-001 Public location identifier. |
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Required location name. Cannot be blank or whitespace-only. |
| state | string non-empty ^\S+.*$ Optional state value. If provided, it cannot be null, blank, or whitespace-only. Omit the field completely if you do not wish to update this field. |
| addressLine | string Location address line. |
| city | string Location city. If provided, it cannot be blank or whitespace-only. |
| zipCode | string Location ZIP or postal code. |
| phoneNumber | string <= 10 characters ^[0-9]+$ Location phone number. Must contain only digits up to 10 characters. |
| fax | string <= 10 characters ^[0-9]+$ Location fax number. Must contain only digits up to 10 characters. |
string <email> Location email address. | |
| sendEmail | boolean Default: false Whether to send email for this location. |
| enabledCredentialing | boolean Default: false Whether credentialing is enabled for this location. |
object Optional division reference wrapper. |
Responses
Request samples
- Payload
{- "name": "North Campus",
- "state": "State",
- "city": "City",
- "addressLine": "Address 1",
- "zipCode": "33101",
- "phoneNumber": "0987654321",
- "fax": "1234567890",
- "email": "first@test.com",
- "sendEmail": false,
- "enabledCredentialing": false,
- "division": {
- "reference": "DIV-001"
}
}Response samples
- 200
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Location updated successfully.",
- "id": "LOC-001"
}
}
]
}Search divisions
Returns a FHIR Bundle with division resources.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/divisions?_count=2&_page=2"
}, - {
- "relation": "first",
- "url": "/api/v1/divisions?_count=2&_page=1"
}, - {
- "relation": "previous",
- "url": "/api/v1/divisions?_count=2&_page=1"
}, - {
- "relation": "last",
- "url": "/api/v1/divisions?_count=2&_page=2"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Division",
- "id": "DIV-003",
- "name": "East Division",
- "locations": [
- {
- "reference": "LOC-010"
}, - {
- "reference": "LOC-011"
}
]
}
}
]
}Create a division
Creates a division with a non-blank name and at least one linked location ID.
Authorizations:
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Required division name. Cannot be blank or whitespace-only. |
| locations required | Array of strings non-empty [ items non-empty ] Required list of location IDs. At least one value must be provided, and each value cannot be blank or whitespace-only. |
Responses
Request samples
- Payload
{- "name": "North Division",
- "locations": [
- "LOC-001"
]
}Response samples
- 200
- 201
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Division created successfully.",
- "id": "DIV-001"
}
}
]
}Get a division by ID
Resolves the public division identifier before fetching the resource.
Authorizations:
path Parameters
| divisionId required | string Example: DIV-001 Division identifier. |
Responses
Response samples
- 200
- 401
- 404
- 429
- 500
- 502
{- "resourceType": "Division",
- "id": "DIV-123",
- "name": "Clinical Division",
- "locations": [
- {
- "reference": "LOC-001"
}, - {
- "reference": "LOC-002"
}
]
}Update a division
Accepts partial updates. Send at least one of name or locations.
Resolves the public division identifier before updating the resource.
A 422 response also covers duplicate division names, locations that
do not exist or belong to another company, and locations that are
assigned to another non-default division.
Authorizations:
path Parameters
| divisionId required | string Example: DIV-001 Division identifier. |
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Conditionally required division name. Send |
| locations | Array of strings[ items non-empty ] Conditionally required list of location IDs. Send |
Responses
Request samples
- Payload
{- "name": "Updated Division"
}Response samples
- 200
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Division updated successfully.",
- "id": "DIV-001"
}
}
]
}Update a division with PATCH
Resolves the public division identifier before updating the resource
with the same payload as PUT and is routed to the same update handler.
It returns the same validation and downstream business-rule errors as
PUT.
Authorizations:
path Parameters
| divisionId required | string Example: DIV-001 Division identifier. |
Request Body schema: application/jsonrequired
| name required | string [ 1 .. 100 ] characters Conditionally required division name. Send |
| locations | Array of strings[ items non-empty ] Conditionally required list of location IDs. Send |
Responses
Request samples
- Payload
{- "name": "Updated Division"
}Response samples
- 200
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Division updated successfully.",
- "id": "DIV-001"
}
}
]
}Search positions
Returns a FHIR Bundle with position resources.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 401
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/position?_count=2&_page=2&_elements=id%2Cname%2Cclinical"
}, - {
- "relation": "first",
- "url": "/api/v1/position?_count=2&_page=1&_elements=id%2Cname%2Cclinical"
}, - {
- "relation": "previous",
- "url": "/api/v1/position?_count=2&_page=1&_elements=id%2Cname%2Cclinical"
}, - {
- "relation": "last",
- "url": "/api/v1/position?_count=2&_page=2&_elements=id%2Cname%2Cclinical"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Position",
- "id": "POS-003",
- "name": "Supervisor",
- "clinical": true
}
}
]
}Get a position by public ID
Resolves the public position identifier before fetching the resource.
Authorizations:
path Parameters
| publicId required | string Example: POS-001 Public position identifier. |
Responses
Response samples
- 200
- 401
- 404
- 429
- 500
- 502
{- "resourceType": "Position",
- "id": "POS-001",
- "name": "Analyst",
- "clinical": true
}Search departments
Returns a FHIR Bundle with department resources.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/departments?_count=2&_page=2&_elements=id%2Cname"
}, - {
- "relation": "first",
- "url": "/api/v1/departments?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "previous",
- "url": "/api/v1/departments?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "last",
- "url": "/api/v1/departments?_count=2&_page=2&_elements=id%2Cname"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Department",
- "id": "DEPT-003",
- "name": "Laboratory"
}
}
]
}Get a department by public ID
Resolves the public department identifier before fetching the resource.
Authorizations:
path Parameters
| publicId required | string Example: DEPT-001 Public department identifier. |
Responses
Response samples
- 200
- 401
- 404
- 429
- 500
- 502
{- "resourceType": "Department",
- "id": "DEPT-001",
- "name": "Compliance/HIPAA"
}Search practitioner categories
Returns a FHIR Bundle with practitioner category resources.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector for practitioner category search. The only implemented selectors for this endpoint are Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. |
Responses
Response samples
- 200
- 401
- 422
- 429
- 500
- 502
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/practitioner-categories?_count=2&_page=2&_elements=id%2Cname"
}, - {
- "relation": "first",
- "url": "/api/v1/practitioner-categories?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "previous",
- "url": "/api/v1/practitioner-categories?_count=2&_page=1&_elements=id%2Cname"
}, - {
- "relation": "last",
- "url": "/api/v1/practitioner-categories?_count=2&_page=2&_elements=id%2Cname"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "PractitionerCategory",
- "id": "PCAT-003",
- "name": "Operations"
}
}
]
}Get a practitioner category by public ID
Resolves the public practitioner category identifier before fetching the resource.
Authorizations:
path Parameters
| publicId required | string Example: PCAT-001 Public practitioner category identifier. |
Responses
Response samples
- 200
- 401
- 404
- 429
- 500
- 502
{- "resourceType": "PractitionerCategory",
- "id": "PCAT-001",
- "name": "Nursing"
}Create a practitioner
Creates a practitioner/provider profile for the authenticated company context.
A 422 response indicates either request-body validation failures,
unresolved related public IDs such as
extension.employment.positionId,
extension.employment.departmentId, or
extension.user.location, or a validation error returned by the
upstream provider-profile API.
Authorizations:
Request Body schema: application/jsonrequired
| resourceType | string^\s*Practitioner\s*$ Optional resource type discriminator. When present it must equal |
required | object (PractitionerWriteName) Practitioner name payload.
Every string field below is constrained to letters, numbers, spaces,
apostrophes, periods, and hyphens. The character allowlist regex
enforced server-side is |
| birthDate | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Date string in The value must represent a real calendar date accepted by server-side
validation, not just a string that matches the pattern. For example,
|
| gender | string [ 1 .. 100 ] characters ^[A-Za-z0-9 .'\-]+$ Only letters, numbers, spaces, apostrophes, periods, and hyphens are allowed. Maximum 100 characters. |
required | object (PractitionerWriteTelecom) Practitioner telecom payload.
|
object (PractitionerWriteHomeAddress) Optional home address payload. | |
object (PractitionerWriteMailingAddress) Optional mailing address payload. The server enforces:
| |
required | object (PractitionerWriteExtension) Practitioner extension payload. |
Responses
Request samples
- Payload
{- "resourceType": "Practitioner",
- "name": {
- "given": "John",
- "family": "Doe",
- "middle": "Allen",
- "other": {
- "given": "Jonathan",
- "middle": "Alpha",
- "family": "Public",
- "suffix": "III",
- "usageStartDate": "02/14/2001",
- "usageEndDate": "02/14/2005"
}
}, - "birthDate": "01/01/1990",
- "gender": "male",
- "telecom": {
- "email": "john.payload1@example.com",
- "primaryEmail": "john.primary@example.com",
- "personalEmail": "john.personal@example.com",
- "ccEmail1": "john.cc1@example.com",
- "ccEmail2": "john.cc2@example.com",
- "cellPhone": "3055550111",
- "homePhone": "3055550103",
- "workPhone": "3055550104",
- "fax": "3055550105"
}, - "address": {
- "line": [
- "Main Street 1",
- "Suite 10"
], - "city": "Miami",
- "state": "FL",
- "postalCode": "33101",
- "country": "United States",
- "county": "Miami-Dade"
}, - "mailingAddress": {
- "line": [
- "Billing Street 9",
- "Floor 4"
], - "city": "Orlando",
- "state": "FL",
- "postalCode": "32801",
- "country": "United States",
- "county": "Orange",
- "province": "N/A"
}, - "extension": {
- "employment": {
- "positionId": "pos770",
- "departmentId": "dep1",
- "hireDate": "06/15/2020",
- "terminationDate": "06/15/2025"
}, - "user": {
- "location": "loc4857",
- "userType": "admin",
- "password": "<set-at-request-time>",
- "status": "Active",
- "statusReason": "Contracted",
- "ssn": "123456789",
- "birthPlace": {
- "country": "United States",
- "stateOther": "Nuevo Leon",
- "city": "Monterrey"
}, - "citizenship": "United States",
- "raceEthnicity": "Hispanic or Latino",
- "languages": [
- "Spanish",
- "French",
- "German"
], - "fnin": {
- "number": "FNIN12",
- "countryIssue": "United States"
}
}, - "provider": {
- "npiNumber": "1234567890",
- "caqhId": "1234567890",
- "caqhUsername": "caqh_user",
- "caqhPassword": "<set-at-request-time>",
- "caqhLastReattestationDate": "03/01/2026",
- "caqhEmail": "caqh.provider@example.com",
- "treatsGender": "Both",
- "patientAgeMinimum": 18,
- "patientAgeMaximum": 65,
- "upin": "UPIN12"
}
}
}Response samples
- 200
- 201
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Practitioner created successfully.",
- "id": "EMP-PUB-002"
}
}
]
}Search practitioners
Returns a FHIR Bundle of practitioner resources. _elements supports
comma-separated selectors and may include nested paths such as
telecom.email, telecom.homePhone, address.city,
extension.user.status, extension.user.statusReason,
extension.user.userType, or extension.provider.npiNumber.
_elements values are normalized by trimming surrounding whitespace.
Unknown selectors are preserved in pagination links but ignored when
building each practitioner resource.
Authorizations:
query Parameters
| _count | integer >= 1 Default: 20 Number of resources to return. Must be a positive integer. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 3,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/practitioner?_count=2&_page=2&_elements=name%2Ctelecom.email%2Ctelecom.homePhone"
}, - {
- "relation": "first",
- "url": "/api/v1/practitioner?_count=2&_page=1&_elements=name%2Ctelecom.email%2Ctelecom.homePhone"
}, - {
- "relation": "previous",
- "url": "/api/v1/practitioner?_count=2&_page=1&_elements=name%2Ctelecom.email%2Ctelecom.homePhone"
}, - {
- "relation": "last",
- "url": "/api/v1/practitioner?_count=2&_page=2&_elements=name%2Ctelecom.email%2Ctelecom.homePhone"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Practitioner",
- "name": {
- "given": "Katherine",
- "family": "Johnson"
}, - "telecom": {
- "email": "katherine@example.test",
- "homePhone": "3055550103"
}
}
}
]
}Get a practitioner by public ID
Returns a single practitioner resource. If _elements is omitted, the
full public practitioner resource is returned.
_elements accepts the same nested selector syntax as practitioner
search and trims surrounding whitespace before filtering.
A 404 response indicates the practitioner public ID could not be
resolved. A 422 response indicates validation failed while reading or
normalizing the upstream practitioner data.
Authorizations:
path Parameters
| publicId required | string Example: PRAC-001 Public practitioner identifier. |
query Parameters
| _elements | string Example: _elements=id,name Comma-separated field selector. For location, division, position, department, and practitioner category
searches, the implemented selectors are For practitioners, nested selectors are allowed, including values such
as Whitespace around values is trimmed. Unknown selectors are preserved in pagination links but ignored when each resource is built. Documentation examples use relative pagination paths so they work across local, staging, and production environments. |
Responses
Response samples
- 200
- 400
- 401
- 404
- 422
- 429
- 500
- 502
{- "resourceType": "Practitioner",
- "name": {
- "given": "Ada",
- "family": "Lovelace"
}, - "telecom": {
- "email": "ada@example.test",
- "homePhone": "3055550103"
}
}Update a practitioner
Updates a practitioner/provider profile identified by publicId.
The request body is a partial update: every top-level field is optional. Omitted fields retain their existing values. Any field that is present is validated with the same format/length/pattern rules as the create payload.
A 422 response indicates either request-body validation failures,
unresolved related public IDs such as
extension.employment.positionId,
extension.employment.departmentId, or
extension.user.location, or a validation error returned by the
upstream provider-profile API.
Authorizations:
path Parameters
| publicId required | string Example: PRAC-001 Public practitioner identifier. |
Request Body schema: application/jsonrequired
| resourceType | string^\s*Practitioner\s*$ Optional resource type discriminator. When present it must equal |
object (PractitionerUpdateName) Practitioner name payload for partial updates. All fields are optional — send only the fields you want to change. Every string field below is constrained to letters, numbers, spaces,
apostrophes, periods, and hyphens. The character allowlist regex
enforced server-side is | |
| birthDate | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Date string in The value must represent a real calendar date accepted by server-side
validation, not just a string that matches the pattern. For example,
|
| gender | string [ 1 .. 100 ] characters ^[A-Za-z0-9 .'\-]+$ Only letters, numbers, spaces, apostrophes, periods, and hyphens are allowed. Maximum 100 characters. |
object (PractitionerUpdateTelecom) Practitioner telecom payload for partial updates. All fields are optional — send only the fields you want to change. Any provided string must contain at least one non-whitespace character. | |
object (PractitionerWriteHomeAddress) Optional home address payload. | |
object (PractitionerWriteMailingAddress) Optional mailing address payload. The server enforces:
| |
object (PractitionerUpdateExtension) Practitioner extension payload for partial updates. All nested objects and their fields are optional — send only the pieces you want to change. The practitioner user status fields are nested under |
Responses
Request samples
- Payload
{- "resourceType": "Practitioner",
- "name": {
- "given": "John",
- "family": "Doe",
- "middle": "Allen",
- "other": {
- "given": "Jonathan",
- "middle": "Alpha",
- "family": "Public",
- "suffix": "III",
- "usageStartDate": "02/14/2001",
- "usageEndDate": "02/14/2005"
}
}, - "birthDate": "01/01/1990",
- "gender": "male",
- "telecom": {
- "email": "john.payload1@example.com",
- "primaryEmail": "john.primary@example.com",
- "personalEmail": "john.personal@example.com",
- "ccEmail1": "john.cc1@example.com",
- "ccEmail2": "john.cc2@example.com",
- "cellPhone": "3055550111",
- "homePhone": "3055550103",
- "workPhone": "3055550104",
- "fax": "3055550105"
}, - "address": {
- "line": [
- "Main Street 1",
- "Suite 10"
], - "city": "Miami",
- "state": "FL",
- "postalCode": "33101",
- "country": "United States",
- "county": "Miami-Dade"
}, - "mailingAddress": {
- "line": [
- "Billing Street 9",
- "Floor 4"
], - "city": "Orlando",
- "state": "FL",
- "postalCode": "32801",
- "country": "United States",
- "county": "Orange",
- "province": "N/A"
}, - "extension": {
- "employment": {
- "positionId": "pos770",
- "departmentId": "dep1",
- "hireDate": "06/15/2020",
- "terminationDate": "06/15/2025"
}, - "user": {
- "location": "loc4857",
- "userType": "admin",
- "password": "<set-at-request-time>",
- "status": "Active",
- "statusReason": "Contracted",
- "ssn": "123456789",
- "birthPlace": {
- "country": "United States",
- "stateOther": "Nuevo Leon",
- "city": "Monterrey"
}, - "citizenship": "United States",
- "raceEthnicity": "Hispanic or Latino",
- "languages": [
- "Spanish",
- "French",
- "German"
], - "fnin": {
- "number": "FNIN12",
- "countryIssue": "United States"
}
}, - "provider": {
- "npiNumber": "1234567890",
- "caqhId": "1234567890",
- "caqhUsername": "caqh_user",
- "caqhPassword": "<set-at-request-time>",
- "caqhLastReattestationDate": "03/01/2026",
- "caqhEmail": "caqh.provider@example.com",
- "treatsGender": "Both",
- "patientAgeMinimum": 18,
- "patientAgeMaximum": 65,
- "upin": "UPIN12"
}
}
}Response samples
- 200
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Practitioner updated successfully.",
- "id": "EMP-PUB-002"
}
}
]
}Update a practitioner with PATCH
Accepts the same payload as PUT and is routed to the same update
handler. Both verbs behave as partial updates: send only the fields
you want to change.
A 422 response indicates either request-body validation failures,
unresolved related public IDs such as
extension.employment.positionId,
extension.employment.departmentId, or
extension.user.location, or a validation error returned by the
upstream provider-profile API.
Authorizations:
path Parameters
| publicId required | string Example: PRAC-001 Public practitioner identifier. |
Request Body schema: application/jsonrequired
| resourceType | string^\s*Practitioner\s*$ Optional resource type discriminator. When present it must equal |
object (PractitionerUpdateName) Practitioner name payload for partial updates. All fields are optional — send only the fields you want to change. Every string field below is constrained to letters, numbers, spaces,
apostrophes, periods, and hyphens. The character allowlist regex
enforced server-side is | |
| birthDate | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Date string in The value must represent a real calendar date accepted by server-side
validation, not just a string that matches the pattern. For example,
|
| gender | string [ 1 .. 100 ] characters ^[A-Za-z0-9 .'\-]+$ Only letters, numbers, spaces, apostrophes, periods, and hyphens are allowed. Maximum 100 characters. |
object (PractitionerUpdateTelecom) Practitioner telecom payload for partial updates. All fields are optional — send only the fields you want to change. Any provided string must contain at least one non-whitespace character. | |
object (PractitionerWriteHomeAddress) Optional home address payload. | |
object (PractitionerWriteMailingAddress) Optional mailing address payload. The server enforces:
| |
object (PractitionerUpdateExtension) Practitioner extension payload for partial updates. All nested objects and their fields are optional — send only the pieces you want to change. The practitioner user status fields are nested under |
Responses
Request samples
- Payload
{- "resourceType": "Practitioner",
- "name": {
- "given": "John",
- "family": "Doe",
- "middle": "Allen",
- "other": {
- "given": "Jonathan",
- "middle": "Alpha",
- "family": "Public",
- "suffix": "III",
- "usageStartDate": "02/14/2001",
- "usageEndDate": "02/14/2005"
}
}, - "birthDate": "01/01/1990",
- "gender": "male",
- "telecom": {
- "email": "john.payload1@example.com",
- "primaryEmail": "john.primary@example.com",
- "personalEmail": "john.personal@example.com",
- "ccEmail1": "john.cc1@example.com",
- "ccEmail2": "john.cc2@example.com",
- "cellPhone": "3055550111",
- "homePhone": "3055550103",
- "workPhone": "3055550104",
- "fax": "3055550105"
}, - "address": {
- "line": [
- "Main Street 1",
- "Suite 10"
], - "city": "Miami",
- "state": "FL",
- "postalCode": "33101",
- "country": "United States",
- "county": "Miami-Dade"
}, - "mailingAddress": {
- "line": [
- "Billing Street 9",
- "Floor 4"
], - "city": "Orlando",
- "state": "FL",
- "postalCode": "32801",
- "country": "United States",
- "county": "Orange",
- "province": "N/A"
}, - "extension": {
- "employment": {
- "positionId": "pos770",
- "departmentId": "dep1",
- "hireDate": "06/15/2020",
- "terminationDate": "06/15/2025"
}, - "user": {
- "location": "loc4857",
- "userType": "admin",
- "password": "<set-at-request-time>",
- "status": "Active",
- "statusReason": "Contracted",
- "ssn": "123456789",
- "birthPlace": {
- "country": "United States",
- "stateOther": "Nuevo Leon",
- "city": "Monterrey"
}, - "citizenship": "United States",
- "raceEthnicity": "Hispanic or Latino",
- "languages": [
- "Spanish",
- "French",
- "German"
], - "fnin": {
- "number": "FNIN12",
- "countryIssue": "United States"
}
}, - "provider": {
- "npiNumber": "1234567890",
- "caqhId": "1234567890",
- "caqhUsername": "caqh_user",
- "caqhPassword": "<set-at-request-time>",
- "caqhLastReattestationDate": "03/01/2026",
- "caqhEmail": "caqh.provider@example.com",
- "treatsGender": "Both",
- "patientAgeMinimum": 18,
- "patientAgeMaximum": 65,
- "upin": "UPIN12"
}
}
}Response samples
- 200
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Practitioner updated successfully.",
- "id": "EMP-PUB-002"
}
}
]
}Search the company course catalog
Authorizations:
query Parameters
| _count | integer [ 1 .. 200 ] Default: 20 Number of courses or assignments to return. Must be between 1 and 200. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,title,description Comma-separated ActivityDefinition selectors. Supported selectors
include id, title, description, purpose, date, effectivePeriod,
effectivePeriod.end, extension, extension.duration,
extension.chapters, or extension.certificateApprovals. |
Responses
Response samples
- 200
- 400
- 401
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 1,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/learning/courses?_count=20&_page=1"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "ActivityDefinition",
- "id": "CRS-01HZX5V9X8YQ",
- "title": "Infection Prevention",
- "description": "Infection prevention fundamentals",
- "purpose": "Reduce preventable infections",
- "date": "09/01/2026",
- "effectivePeriod": {
- "end": "09/01/2028"
}, - "extension": [
- {
- "duration": 45
}, - {
- "chapters": 6
}, - {
- "certificateApprovals": null
}
]
}
}
]
}Retrieve a course from the company catalog
Authorizations:
path Parameters
| publicId required | string Example: CRS-01HZX5V9X8YQ |
query Parameters
| _elements | string Example: _elements=id,title,extension Comma-separated ActivityDefinition selectors. The same selectors
supported by course search are accepted. |
Responses
Response samples
- 200
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "ActivityDefinition",
- "id": "CRS-01HZX5V9X8YQ",
- "title": "Infection Prevention",
- "description": "Infection prevention fundamentals",
- "purpose": "Reduce preventable infections",
- "date": "09/01/2026",
- "effectivePeriod": {
- "end": "09/01/2028"
}, - "extension": [
- {
- "duration": 45
}, - {
- "chapters": 6
}, - {
- "certificateApprovals": null
}
]
}Create course assignments
Authorizations:
Request Body schema: application/jsonrequired
| resourceType required | string Value: "Task" |
| idCourse required | string non-empty .*\\S.* Course public ID from the authenticated company catalog. |
| idEmployee required | Array of strings non-empty unique [ items non-empty .*\\S.* ] One or more employee public IDs from the authenticated company. |
| assignmentDate required | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Assignment date. Date ordering and minimum-date rules are enforced by the downstream assignment service. |
| dueDate required | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Due date. Must be equal to or later than assignmentDate when accepted by the downstream service. |
| expirationDate required | string (MmDdYyyyDateString) ^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/[0-... Expiration date. Must be equal to or later than dueDate when accepted by the downstream service. |
| assignmentBy | string non-empty .*\\S.* Optional employee public ID. If omitted, the API-key owner's employee is used. |
| idManager | string non-empty .*\\S.* Optional manager employee public ID in the API-key company. |
| note | string <= 500 characters Optional note, limited to 500 characters. |
object Optional recurrence and notification settings. If supplied, recurrence is required. If extension is omitted, recurrence defaults to Does not recur and sendMail defaults to false. Recurrence is rejected for ProTraining courses, and hire-date recurrence requires a hire date for every target employee. |
Responses
Request samples
- Payload
{- "resourceType": "Task",
- "idCourse": "CRS-01HZX5V9X8YQ",
- "idEmployee": [
- "EMP-001",
- "EMP-002"
], - "assignmentDate": "09/25/2026",
- "dueDate": "10/25/2026",
- "expirationDate": "10/01/2027",
- "assignmentBy": "EMP-ADMIN",
- "idManager": "EMP-MANAGER",
- "note": "Complete this recurring assignment before the expiration date.",
- "extension": {
- "recurrence": "Custom",
- "frequency": 2,
- "period": "Months",
- "startOn": "10/01/2026",
- "dueDateMonths": 1,
- "expirationDateMonths": 12,
- "ends": "After",
- "occurrences": 4,
- "sendMail": true,
- "carbonCopy": [
- "training-admin@example.com"
]
}
}Response samples
- 202
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "information",
- "code": "informational",
- "details": {
- "text": "Course assignment accepted for creation."
}
}
]
}Search course assignments for an employee
Authorizations:
query Parameters
| _practitionerId required | string non-empty Example: _practitionerId=EMP-001 Public employee identifier whose assignments are returned. |
| _count | integer [ 1 .. 200 ] Default: 20 Number of courses or assignments to return. Must be between 1 and 200. |
| _page | integer >= 1 Default: 1 1-based page number. Must be a positive integer. |
| _elements | string Example: _elements=id,practitionerId,idCourse,dueStatus Comma-separated assignment field selector. Supported values are
|
Responses
Response samples
- 200
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "Bundle",
- "type": "searchset",
- "total": 1,
- "link": [
- {
- "relation": "self",
- "url": "/api/v1/learning/course-assignments?_practitionerId=EMP-001&_count=20&_page=1"
}
], - "entry": [
- {
- "resource": {
- "resourceType": "Task",
- "id": "ASN-01HZX5V9X8YQ",
- "practitionerId": "EMP-001",
- "practitionerName": "Jane Doe",
- "idCourse": "CRS-01HZX5V9X8YQ",
- "courseTitle": "Infection Prevention",
- "assignmentStatus": "Pending",
- "assignmentDate": "09/15/2026",
- "assignedBy": "EMP-ADMIN",
- "dueDate": "10/15/2026",
- "dueStatus": "On time",
- "percentageProgress": 0,
- "completionDate": null
}
}
]
}Remove a course assignment
Authorizations:
path Parameters
| assignmentPublicId required | string Example: ASN-01HZX5V9X8YQ |
Request Body schema: application/jsonoptional
Optional deletion settings. If omitted, sendMail defaults to false. If supplied, the extension must contain exactly one object with a boolean sendMail field.
| resourceType required | string Value: "Task" |
required | Array of objects = 1 items |
Responses
Request samples
- Payload
{- "resourceType": "Task",
- "extension": [
- {
- "sendMail": false
}
]
}Response samples
- 400
- 401
- 404
- 422
- 429
- 500
{- "resourceType": "OperationOutcome",
- "issue": [
- {
- "severity": "error",
- "code": "invalid",
- "details": {
- "text": "Malformed JSON request body."
}
}
]
}