API reference · updated 29 July 2026

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.

On idempotency. Every write endpoint accepts an 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.