Skip to content

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. Webhook Management

Webhook Samples

Trio VMS API Webhook Management

Managment of webhooks can also be done through the /api/v3/webhooks endpoint.

List existing webhook registrations

GET https://api.triovms.com/ahsa/api/v3/Webhooks
X-API-KEY: myApiKeyValue

List available webhook events

GET https://api.triovms.com/ahsa/api/v3/Webhooks/Events
X-API-KEY: myApiKeyValue

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"
}