Release a hold
Idempotent: releasing an already-expired hold succeeds, because the caller's goal is satisfied either way. Pass the same `X-Mediflo-Scheduling-Session` value you held the slot with — a hold is released only by its own owner, and without the header this request is a different owner, so the hold stays until it expires. Required scope: `scheduling.book`.
/scheduling/holds/{holdId}Authorization
ApiKeyAuth An external API key, sent as Authorization: Bearer mflo_…. Scopes are checked per route; see each operation’s description.
In: header
Path Parameters
Query Parameters
uuidHeader Parameters
Your own id for ONE booking flow (letters, digits and ._:-, 1–128 chars). REQUIRED to use a hold: send the SAME value on POST /scheduling/holds, on the POST /scheduling/appointments that consumes the hold, and on DELETE /scheduling/holds/{holdId}. Without this header every request is its own owner and cannot touch another request’s hold — booking a holdId then answers SLOT_TAKEN and the hold can only expire. Booking straight from a slotToken needs no hold and no header.
^[A-Za-z0-9._:-]{1,128}$Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/scheduling/holds/string?specialistId=497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "data": { "released": true, "holdId": "string" }}Create a procedure POST
FREE_FORM REQUIRES a `trigger`; DETERMINISTIC must have none (the model can never choose to run one). Procedures are part of the configuration snapshot: this reaches no call until POST /bots/{botId}/config/publish. To make a deterministic procedure the call flow, set `entryProcedureId` via PATCH /bots/{botId}/config afterwards. Required scope: `bots.write`.
List bookable visit types GET
Only types the clinic opened to online booking. `price` is present only for privately paid visits that have one. Required scope: `scheduling.read`.