Facilities Management
You built the CMMS a whole portfolio runs on. At 9:23 the chiller in Building C fails, a tenant SLA clock starts, and your only CFC-certified engineer is deep in planned maintenance across the campus.
You may never walk that plant room — but your code decides whether the tenant on floor 14 spends the afternoon at 30°C. Re-planning engineers by trade and SLA across twelve buildings is the code you don’t want to own. Your app flags the failure priority: "p0"; Crisphive re-plans engineers against trade certs, SLA windows, parts and building travel; your app confirms and updates the tenant portal.
Try it in your language
Pick a scenario, switch the server SDK. Every snippet is the actual call the API reference generates — with facilities values filled in.
import { Configuration, JobRequestBusinessApi } from "@crisphive/sdk"; const config = new Configuration({ accessToken: "chsk_test_4eC8xQ9mZ2pL7Ka0rT" }); const api = new JobRequestBusinessApi(config); const res = await api.createJobRequest({ jobRequestCreateRequest: { "customer_id": "a1b2c3d4-0000-4a01-8c01-000000000001", "description": "PM: AHU-3 filter + coil — routine", "job_dates": [ { "date": "2026-07-24", "periods": [ { "business_view": [], "period": "morning" } ] } ], "job_type_id": "b2c3d4e5-0000-4a02-8c02-000000000002", "priority": "p3", "skill_ids": [ "c3d4e5f6-0000-4a03-8c03-000000000003" ], "sla_deadline": "2026-07-30T17:00:00" }, }); const { error_code, message, data } = res.data;
Switch to Go, Ruby, PHP, Java or .NET — the class names, model types and method casing all follow that SDK’s generated conventions. Swap chsk_test_ for chsk_live_ and the same code runs against production.
▼Three ways this bites
These are the days PM week goes sideways — each a tenant SLA, a wasted trip across the portfolio, or a compliance date at risk. Every one maps to a field the API already carries.
The pain ·A critical failure pulls the team off PM; a fixed compliance date or tenant SLA gets sacrificed to absorb the chaos — and the SLA credit lands on next month’s invoice.
Crisphive ·Flag priority: "p0"; the emergency re-plan preview reflows the portfolio while protecting each tenant sla_deadline.
The pain ·A tech is routed to a floor with no escort window; the door’s locked, so it’s a wasted trip across the portfolio — travel and mobilisation for nothing.
Crisphive ·Model the escort meet in dependencies with real time; a plan that arrives when the door is locked never comes back.
The pain ·Building-to-building travel isn’t modelled, so the day is over-booked and the last tenant tickets slip off the board — lost billable capacity.
Crisphive ·Multi-building travel is modelled per leg, so the plan reflects real windshield time, not wishful adjacency.
▼Reading the re-plan call
The An asset just failed scenario above is the re-plan itself — it previews the moves so nothing is committed until you confirm. Its fields map to the story like this:
| Field | What it is |
|---|---|
emergency_job_id | The failure driving the re-plan — the chiller job that has to be honoured. |
technician_id | The engineer in play for that job — here, the CFC-certified one. |
start_at | When the disruption lands — 09:23 in the story. |
mode | How hard the solver may push to fit the response (here, allow overtime). |
displacement_mode | What may happen to the planned maintenance it moves (here, reschedule it rather than drop it). |
The urgency flag from the intro — priority: "p0" — is set when you book or update the job on POST /job-requests (the PM: AHU-3 scenario shows a routine p3). The full priority ladder and the allowed values for mode and displacement_mode live in each endpoint’s Full reference.
▼Hard constraints, not suggestions
A CMMS that ignores these isn’t planning — it’s sending a plumber to a refrigerant leak. Each one is a first-class field in the API.
| The rule | What the API enforces |
|---|---|
| Trade & CFC certs | A chiller needs a CFC-certified HVAC engineer. Only engineers whose skill_ids cover the work get assigned. |
| Tenant SLA windows | A tenant SLA is a hard sla_deadline. The solver protects SLA-bound work before planned maintenance. |
| Parts & refrigerant | No plan promises a repair whose parts aren’t on the van. A parts grab is modelled in dependencies with real time. |
| Building & access | An escort or access window is modelled in dependencies, and multi-building travel per leg — no plan assumes an engineer teleports across the portfolio. |
| Isolate-before-work | Isolate before service; permit before hot work. Order is first-class dependencies. |
▼What you ship
You ship a CMMS that re-plans itself.
- No hand-rolled scheduling engine — trade certs, SLA windows, parts and building travel are API fields.
- Deterministic means auditable: replay the exact hour for a client SLA review.
- Tenant comms come back with the plan, ready for the tenant portal.
▼What their day feels like
One failure stops derailing PM week.
- The help desk stops re-planning engineers by hand.
- Tenant SLAs are protected; the right trade gets the right asset.
- Building C is cooling again inside the SLA — PM work slides, not the tenant promise.
▼Every job has stakeholders
A chiller failure touches far more than the engineer who fixes it. Every ticket is a web of stakeholders who feel it when PM week drifts — and a tighter operation quietly serves all of them.
Their SLA is honoured and, ideally, they never notice the failure at all.
Confirms a portfolio re-plan in one click instead of re-juggling engineers by hand.
More coverage per engineer-hour across the portfolio with fewer SLA credits owed.
Replayable plans mean a client SLA review reconciles to the exact hour — granular proof of every commitment kept.
Compliance dates never quietly slip, so the building’s standing with tenants and owners holds.
Realistic inter-building travel and honoured access windows stop the day from over-booking the team into burnout.
▼What you get back, and what gets pushed
The An asset just failed preview returns the whole plan in data: moves and reassignments (which job shifts, from and to which engineer and time), a total_moves count, and warnings such as TECH_NOT_FEASIBLE — so you can show dispatch the re-plan before you commit it.
To keep the tenant portal live as tickets move, register a webhook endpoint and Crisphive POSTs each event to your URL with a Crisphive-Signature header. Verify it against your whsec_… secret over the raw body before you trust the payload — Webhooks has the event shape and copy-paste verify snippets.
Start building
The snippet above imports @crisphive/sdk — grab the package for your language, drop in a key, and the same call runs. Every response comes back in one { error_code, message, data } envelope.