Skip to main content
Murph can propose durable writes while helping operate a storefront, such as filing a report, updating operating instructions, publishing storefront setup state, or changing other persistent configuration. For protected writes, Murph returns a structured confirmation request instead of executing the write immediately. Clients should render the confirmation as an explicit approve/cancel control. A plain chat reply like “yes” is not enough for these writes.

Confirmation lifecycle

  1. Send a normal Murph chat request.
  2. If the response includes pendingConfirmations (or pendingConfirmation), show the proposed action and an approve/cancel control for each entry.
  3. POST each user decision to the confirmation decision endpoint.
  4. If the user confirms, the response is a normal Murph chat response for the turn that executed the approved write.
  5. If the user cancels, the response only records the cancelled confirmation.
Prefer pendingConfirmations (plural). Murph can propose multiple gated writes in a single turn (e.g. queue N delete_campaign calls). Older clients that only read pendingConfirmation (singular) render just the first widget and silently drop the rest. New clients should iterate pendingConfirmations and render one approve/cancel control per entry; each entry has its own confirmationUid and is decided independently.
confirmationUid is short-lived, single-use, and bound to the authenticated actor, conversation, tool, and resolved parameters. Do not persist it as a long-term approval record.

Chat response fields

POST /api/v2/murph/chat and POST /api/v2/murph/chat/stream can return two related fields on a turn where one or more protected writes were proposed but did not run:
  • pendingConfirmations (array, new) — every pending confirmation issued this turn, in tool-call order. Render one approve/cancel control per entry. Empty (or omitted) when nothing gated this turn. New callers should prefer this field.
  • pendingConfirmation (object, retained) — the first entry from pendingConfirmations, or null. Kept for back-compat with clients that render at most one confirmation per turn (Slack, older SDKs). A client that reads only this field will silently drop the remaining N-1 controls when Murph gates multiple writes in one turn.
Each entry (in either field) uses this shape:
FieldTypeNotes
confirmationUidUUIDPass this to the decision endpoint. Each pending confirmation gets its own UID; a multi-write turn yields N distinct UIDs.
toolNamestringInternal Murph tool that requested the write.
toolKeystringStable key for the gated action.
summarystringHuman-readable action summary for the confirmation UI.
policy"always" or "tainted"Why the confirmation gate applied.
resolvedParamsobjectParameters the user is approving.
writeExecutedfalseThe write did not run on this turn.
plainAffirmativeAcceptedfalseThe user must use the confirmation control.
expiresAtdatetimeConfirmation expiry time.

Confirm or cancel

POST /api/v2/murph/confirmations/{confirmationUid}/decision

Request body

FieldTypeRequiredNotes
decision"confirm" or "cancel"YesConfirms or cancels the pending write.

Confirm response

When decision is confirm, the endpoint returns the same shape as a Murph chat response. The approved write may appear in toolsUsed, and fields such as escalated or customerSwitch reflect the write that actually ran.

Cancel response

When decision is cancel, no write runs and the response only records the cancelled confirmation.

Errors

  • 400 VALIDATION_ERROR - the path or request body is malformed.
  • 404 NOT_FOUND - the confirmation is unknown, expired, cancelled, or already used.
  • 403 FORBIDDEN - the confirmation belongs to another actor or account.
  • 503 SERVICE_UNAVAILABLE - Murph is not available to process a confirmed write.
See Errors for the full error contract.

Ask Murph

Use Murph to operate and troubleshoot your storefront.

Authentication

Authenticate Murph API requests.