Trio Agency Webhooks
In addition to traditional API endpoints for data retrieve, Trio VMS also offers webhooks that are triggered in different scenarios and can be configured to POST payloads to URLs for each event fired.
This allows for a simplified data capture process where updates are pushed from Trio VMS vs constantly pulling data to determine what has updated.
Trio webhooks do NOT currently support authentication when posting content.
Registering for Webhook Events
As an Agency admin, you can register and manage webhook events through the Trio VMS web application or the API.
Trio VMS Application Webhook Mangement
Managing Trio VMS webhooks is easiest through the web application, when you can see and edit existing registered webhooks, example payloads, and register new webhooks. You must have Agency admin permission and can access webhooks through the Manage -> Webhooks
menu option.
Trio VMS API Webhook Management
Managment of webhooks can also be done through the /api/v3/webhooks
endpoint.
List existing webhook registrations
List available webhook events
Create a new webhook registration.
POST https://api.triovms.com/ahsa/api/v3/Webhooks
X-API-KEY: myApiKeyValue
Content-Type: application/json
{
"Name": "My Job Update Listener",
"Url": "https://mydomain.com/trio-webhooks/job-update",
"Events": [
"Job Update"
],
"IsActive": true
}
Update an existing webhook
POST https://api.triovms.com/ahsa/api/v3/Webhooks
X-API-KEY: myApiKeyValue
Content-Type: application/json
{
"Id": "IdOfWebhookToUpdate",
"Name": "My Disabled Job Update Listener",
"Url": "https://mydomain.com/trio-webhooks/job-update",
"Events": [
"Job Update"
],
"IsActive": false
}
Webhook Events
Job Update
When a job is opened, updated in an Open status, or transitioning to Closed status, the Job Update webhook event will POST a JSON payload that matches the /api/v3/Job/{number} endpoint result.
interface JobNotification {
Number: int;
Title: string;
JobStatus: string;
JobStatusReason: string | null;
StartDate: datetime | null;
NumberOfPositions: int;
NumberOfOpenPositions: int;
ClientNumber: int;
ClientName: string;
UnitName: string | null;
FacilityName: string | null;
FacilityDescription: string | null;
JobType: string;
PrimaryAddress: string;
AltAddress: string | null;
City: string;
State: string;
StateAbbreviation: string;
ZipCode: string;
PrimaryPhone: string | null;
AltPhone: string | null;
Profession: string;
InternalRate: string | null;
Description: string | null;
DurationDescription: string | null;
RateDescription: string | null;
OnCallDescription: string | null;
WeekendDescription: string | null;
LicenseDescription: string | null;
RequirementDescription: string | null;
AllowsCompactLicense: bool;
RelationshipManager: string | null;
RelationshipManagerEmail: string | null;
RelationshipManagerPhone: string | null;
PlacementCoordinator: string | null;
PlacementCoordinatorEmail: string | null;
PlacementCoordinatorPhone: string | null;
IsLocums: boolean;
Specialties: string[];
Segments: string[];
Certifications: Certification[];
StateLicenses: StateLicense[];
Shift: JobShift | null;
JobType: int;
OrientationDates: string | null;
ModifiedDateUtc: datetime | null;
}
interface Certification {
Code: int;
Name: string;
Description: string | null;
}
interface StateLicense {
Name: string;
Abbreviation: string;
IsCompat: boolen;
}
interface JobShift {
ShiftDescription: string;
ShiftIdentifier: string;
ShiftStart: string;
ShiftEnd: string;
ShiftHours: int | null;
}
Submission Update
When a candidate submission's status changes, the Submission Update webhook event will POST a SubmissionNotification JSON payload.
interface SubmissionNotification {
Number: int;
Status: string;
StatusCode: int;
StatusReason: string | null;
JobNumber: int;
CandidateNumber: int;
BestContactDescription: string | null;
BillRateAmount: decimal | null;
StartDate: datetime: null;
AvailabilityDescription: string | null;
DaysOffDescription: string | null;
ExperienceDescription: string | null;
ModifiedDateUTC: datetime;
}
Non Locums Confirmation Signed
Documentation coming soon.
Per Diem Shift Events
Webhook events are produced for actions related to Per Diem Shifts for shifts that your agency is able to see.
Important - Start and End datetimes for shifts are in the local time for the Staffing Pool they are associated with.
Per Diem Shift Opened
When one or more Per Diem Shifts are opened/posted for qualified clinicians to claim, the Per Diem Shift Opened event will POST a PerDiemShiftOpenedNotification JSON payload.
interface PerDiemShiftOpenedNotification {
Action: "Per Diem Shift Opened";
Items: PerDiemShiftOpened[];
}
interface PerDiemShiftOpened {
Id: string;
Number: int;
StaffingPool: NamedIdentifier;
StaffingPoolClient: NamedIdentifier;
Facility: NamedIdentifier;
Unit: NamedIdentifier;
Profession: string;
Specialty: string;
Start: datetime;
End: datetime;
PeriodOfWork: string | null;
Duration: decimal | null;
Status: string;
RateType: string;
ShiftType: string;
Notes: string | null;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Opened",
"Items": [
{
"Id": "2d695a02-b173-4334-de53-08dd33e08259",
"Number": 50000388,
"StaffingPool": {
"Id": "34E4DDE5-7CD2-436E-FD22-08DD05BC7E8A",
"Name": "Kron ER and MS"
},
"StaffingPoolClient": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital"
},
"Facility": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital"
},
"Unit": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital - Emergency Room"
},
"Profession": "RN",
"Specialty": "Emergency Room",
"Start": "2025-01-13T07:00:00",
"End": "2025-01-13T19:00:00",
"PeriodOfWork": null,
"Duration": 12,
"Status": "Open",
"RateType": "Hourly - Regular",
"ShiftType": "Regular",
"Notes": "Here are notes",
"Timestamp": "2025-01-13T14:42:30.6093825Z"
},
{
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"Number": 50000389,
"StaffingPool": {
"Id": "34E4DDE5-7CD2-436E-FD22-08DD05BC7E8A",
"Name": "Kron ER and MS"
},
"StaffingPoolClient": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital"
},
"Facility": {
"Id": null,
"Name": null
},
"Unit": {
"Id": null,
"Name": null
},
"Profession": "RN",
"Specialty": "Emergency Room",
"Start": "2025-01-13T07:00:00",
"End": "2025-01-13T19:00:00",
"PeriodOfWork": null,
"Duration": 12,
"Status": "Open",
"RateType": "Hourly - Regular",
"ShiftType": "Regular",
"Notes": "Here is a shift note",
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}
]
}
Per Diem Shift Assigned
When a Per Diem Shift is assigned to a clinician working through your agency, the Per Diem Shift Assigned event will POST a PerDiemShiftAssignedNotification JSON payload.
interface PerDiemShiftAssignedNotification {
Action:"Per Diem Shift Assigned";
Id: string;
Candidate: NamedIdentifier;
Status: string;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Assigned",
"Id": "ff3ad04a-c7e4-4d6d-de55-08dd33e08259",
"Candidate": {
"Id": "ed2ff3f1-72db-49a4-a2ac-652fa7645604",
"Name": "Max Kron, M.D."
},
"Status": "Assigned",
"Timestamp": "2025-01-13T15:21:26.8478744Z"
}
Per Diem Shift Confirmed
When a Per Diem Shift assigned to a clinician working through your agency is confirmed, the Per Diem Shift Confirmed event will POST a PerDiemShiftConfirmedNotification JSON payload.
interface PerDiemShiftConfirmedNotification {
Action: "Per Diem Shift Confirmed";
Id: string;
Candidate: NamedIdentifier;
Status: string;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Confirmed",
"Id": "ff3ad04a-c7e4-4d6d-de55-08dd33e08259",
"Candidate": {
"Id": "ed2ff3f1-72db-49a4-a2ac-652fa7645604",
"Name": "Max Kron, M.D."
},
"Status": "Confirmed",
"Timestamp": "2025-01-13T15:40:51.2345632Z"
}
Per Diem Shift Cancelled
When one or more Per Diem Shifts assigned to a clinician working through your agency are cancelled, the Per Diem Shift Cancelled event will POST a PerDiemShiftCancelledNotification JSON payload.
interface PerDiemShiftCancelledNotification {
Action: "Per Diem Shift Cancelled";
Items: PerDiemShiftCancelled[];
}
interface PerDiemShiftCancelled {
Id: string;
Status: string;
Timestamp: datetime;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Cancelled",
"Items": [
{
"Id": "2d695a02-b173-4334-de53-08dd33e08259",
"Status": "Cancelled",
"Timestamp": "2025-01-13T17:09:47.4007062Z"
}
]
}
Per Diem Shift Removed
When a Per Diem Shift is no longer available for qualified clinicians working through your agency to claim, the Per Diem Shift Removed event will POST a PerDiemShiftRemovedNotification JSON payload.
interface PerDiemShiftRemovedNotificaton {
Id: string;
Timestamp: datetime;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Removed",
"Items": [
{
"Id": "2d695a02-b173-4334-de53-08dd33e08259",
"Timestamp": "2025-01-13T17:09:47.4007062Z"
}
]
}
Per Diem Shift Released
When a Per Diem Shift claimed by a clinician working through your agency releases a shift they had, the Per Diem Shift Released event will POST a PerDiemShiftReleasedNotification JSON payload.
interface PerDiemShiftReleasedNotificaton {
Action: "Per Diem Shift Released";
Id: string;
Candidate: NamedIdentifier;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Released",
"Id": "ff3ad04a-c7e4-4d6d-de55-08dd33e08259",
"Candidate": {
"Id": "ed2ff3f1-72db-49a4-a2ac-652fa7645604",
"Name": "Max Kron, M.D."
},
"Timestamp": "2025-01-13T15:40:51.2345632Z"
}
Per Diem Shift Declined
When a Per Diem Shift assigned to a clinician working through your agency declines a shift that was assigned to them, the Per Diem Shift Declined event will POST a PerDiemShiftDeclinedNotification JSON payload.
interface PerDiemShiftDeclinedNotificaton {
Action: "Per Diem Shift Declined";
Id: string;
Candidate: NamedIdentifier;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Declined",
"Id": "ff3ad04a-c7e4-4d6d-de55-08dd33e08259",
"Candidate": {
"Id": "ed2ff3f1-72db-49a4-a2ac-652fa7645604",
"Name": "Max Kron, M.D."
},
"Timestamp": "2025-01-13T15:40:51.2345632Z"
}
Per Diem Shift Staffing Pool Changed
When the staffing pool for a Per Diem Shift is changed, the Per Diem Shift Staffing Pool Changed event will POST a PerDiemShiftStaffingPoolChangedNotification JSON payload.
interface PerDiemShiftStaffingPoolChangedNotification {
Action: "Per Diem Shift Staffing Pool Changed";
Id: string;
StaffingPool: NamedIdentifier;
StaffingPoolClient: NamedIdentifier;
Profession: string;
Specialty: string;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Staffing Pool Changed",
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"StaffingPool": {
"Id": "34E4DDE5-7CD2-436E-FD22-08DD05BC7E8A",
"Name": "Kron ER and MS"
},
"StaffingPoolClient": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital"
},
"Profession": "RN",
"Specialty": "Emergency Room",
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}
Per Diem Shift Location Changed
When the facility or unit for a Per Diem Shift is changed, the Per Diem Shift Location Changed event will POST a PerDiemShiftLocationChangedNotification JSON payload.
interface PerDiemShiftLocationChangedNotification {
Action: "Per Diem Shift Location Changed";
Id: string;
Facility: NamedIdentifier;
Unit: NamedIdentifier;
Timestamp: datetime;
}
interface NamedIdentifier {
Id: string;
Name: string;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Location Changed",
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"Facility": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital"
},
"Unit": {
"Id": "BC5BD6D3-3003-440F-AF3C-64E6FAA19096",
"Name": "Alexa Hospital - Emergency Room"
},
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}
Per Diem Shift Time Changed
When the start or end time for a Per Diem Shift is changed, the Per Diem Shift Time Changed event will POST a PerDiemShiftTimeChangedNotification JSON payload.
interface PerDiemShiftTimeChangedNotification {
Action: "Per Diem Shift Time Changed";
Id: string;
Start: datetime;
End: datetime;
Timestamp: datetime;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Time Changed",
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"Start": "2025-01-13T07:00:00",
"End": "2025-01-13T19:00:00",
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}
Per Diem Shift Rate Changed
When the rate type for a Per Diem Shift is changed, the Per Diem Shift Rate Changed event will POST a PerDiemShiftRateChangedNotification JSON payload.
interface PerDiemShiftRateChangedNotification {
Action: "Per Diem Shift Rate Changed";
Id: string;
RateType: string;
Timestamp: datetime;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Rate Changed",
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"RateType": "Hourly - Regular",
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}
Per Diem Shift Note Changed
When the rate type for a Per Diem Note is changed, the Per Diem Shift Note Changed event will POST a PerDiemShiftNoteChangedNotification JSON payload.
interface PerDiemShiftNoteChangedNotification {
Action: "Per Diem Shift Note Changed";
Id: string;
Notes: string | null;
Timestamp: datetime;
}
// Example payload
const payload =
{
"Action": "Per Diem Shift Note Changed",
"Id": "18039d8b-0ea0-4244-de54-08dd33e08259",
"Notes": "Here is a new shift note",
"Timestamp": "2025-01-13T14:51:13.0594729Z"
}