Get a procedure
Required scope: `bots.read`.
/bot-procedures/{procedureId}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
uuidResponse Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/bot-procedures/497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "data": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "botId": "58ed41f0-04bf-402f-9853-7143ef7dd5ce", "name": "string", "type": "FREE_FORM", "trigger": "string", "content": null, "position": 0, "enabled": true, "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }}Soft-delete a procedure DELETE
Deleting the bot’s ENTRY procedure is REFUSED (409 `BOT_PROCEDURE_ENTRY_IN_USE`) — it is the call flow, so clear `entryProcedureId` on the bot config first. Note this differs from workflows, where deleting the active one is allowed: a bot without a workflow falls back to prompt-only, a bot without its entry procedure does not. To stop a procedure immediately without deleting it, PATCH `enabled: false`. Required scope: `bots.write`.
List a bot’s procedures GET
A procedure is one of two things. FREE_FORM is a playbook the model reaches for MID-CALL when its `trigger` matches what the caller raised — the trigger is the only part the model ever sees, and the body is injected as a framed tool result; it steers behaviour and grants no new capability. DETERMINISTIC is an ordered flow compiled into the call itself at publish, reachable only as the bot’s entry flow or via `sub_procedure`. `content` ships in full here, so one call reads the whole set. Required scope: `bots.read`.