Hotelminder API reference — /hm_v1
The advisor-side REST layer that orchestrates Hotelminder modules on top of a boutique property's live SiteMinder connection. OAuth2, JSON, one-property-scoped tokens by default.
The Hotelminder API is served from https://api.mindermod.org/hm_v1. It is used by advisor-side dashboards, boutique-group orchestration tooling, and internal Hotelminder services. Third-party developers integrating a module of their own should also start here.
Authentication — OAuth2 with hm_client_id
Every integration receives an hm_client_id and an hm_client_secret at registration. The token flow is standard client credentials for machine-to-machine use, and standard authorization code with PKCE for interactive advisor tooling. Access tokens live for one hour; refresh tokens live for thirty days and rotate on every refresh.
POST /hm_v1/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&hm_client_id=hm_ci_01H9...
&hm_client_secret=hm_cs_01H9...
&scope=modules:activate modules:read basket:read Modules — activate, pause, inspect
The module endpoints are the beating heart of the API. Activation writes a module scope onto a property's SiteMinder connection; pause revokes the module scope without deleting the underlying connection.
POST /hm_v1/modules/activate
Authorization: Bearer <hm_access_token>
Content-Type: application/json
{
"property_id": "hm_p_01H9K...",
"module_id": "rate-reasoner",
"tier": "studio",
"pilot_pack": true
} The response returns the activation state, the SiteMinder scope written, and the pilot pack expiry timestamp. Activation is idempotent — re-activating a module already live returns 200 with the current state, not 409.
GET /hm_v1/modules
GET /hm_v1/modules/{module_id}
POST /hm_v1/modules/{module_id}/pause
POST /hm_v1/modules/{module_id}/resume Basket — the boutique-scoped shortlist
A basket is the shortlist of modules a property or group is considering before activation. It is not a shopping cart in the ordinary e-commerce sense — no checkout, no charge; the basket is an advisory artefact.
GET /hm_v1/properties/{property_id}/basket
POST /hm_v1/properties/{property_id}/basket/items
DELETE /hm_v1/properties/{property_id}/basket/items/{item_id} Baskets carry a note field for the advisor's rationale. When the property confirms a basket in the dashboard, each item becomes a pending activation and the advisor is paged for the scoping call.
Pilot packs
Every module launches into a pilot pack for the first month, included with onboarding. Pilot packs are represented as first-class objects so advisor tooling can list, extend, or convert them.
POST /hm_v1/pilot-packs
Authorization: Bearer <hm_access_token>
Content-Type: application/json
{
"property_id": "hm_p_01H9K...",
"modules": ["rate-reasoner", "direct-deal-widget"],
"duration_days": 30
} Extend a pilot pack when a boutique property has had an operational issue mid-pilot that ate into the pilot window. The extension is a manual advisor action, not an automatic entitlement.
GET /hm_v1/pilot-packs
GET /hm_v1/pilot-packs/{pack_id}
POST /hm_v1/pilot-packs/{pack_id}/extend Advisors — scoping and handover
Advisor endpoints record which Hotelminder advisor is assigned to a property and what has been scoped. This is used to route scoping-call requests and handover between advisors.
GET /hm_v1/advisors
POST /hm_v1/advisors/{advisor_id}/scope
GET /hm_v1/properties/{property_id}/advisor Every advisor scoping event emits an hm.advisor.scoped webhook — see the webhooks reference.
Idempotency-Key header. Duplicate submissions within twenty-four hours return the original response. This is the pattern the Hotelminder dashboard uses to guarantee that a distracted advisor cannot double-activate a module.