recovery.operation_failed

A recovery failed before changing anything; the allowance it spent is given back.

When this fires

The recovery was opened in the ledger and then could not be carried out: the connector refused the new bot's credentials, the replacement chat could not be bound, the new account could not be linked. Nothing changed, so the operation is marked failed and its use of the rolling allowance is given back. The creator sees the refusal on the page that ran it; this event tells your systems.

Required ability

project-recovery:view — token must carry this at mint time to subscribe an endpoint to this event.

Payload

{
  "id": "evt_01HX...",
  "type": "recovery.operation_failed",
  "created_at": "2026-09-12T09:41:07Z",
  "api_version": "2026-05-01",
  "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
  "data": {
    "operation_id": "c2e8f1a9-6d47-4b3e-9f05-1a8d7c2e4b60",
    "kind": "bot",
    "connector": "telegram",
    "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
    "automatic": false,
    "on_demand": false,
    "started_at": "2026-09-12T09:41:05Z",
    "failure_reason": "The platform refused the token."
  }
}

Field reference

FieldTypeNotes
idstring ULIDUnique event id, prefixed evt_. Use for idempotent processing.
typestringAlways recovery.operation_failed for this event.
created_atISO 8601 timestampServer-side emission time.
api_versionstringWebhook API contract version.
project_idstring UUID | nullProject this event belongs to; null for an account recovery.
data.operation_idstring UUIDThe failed operation.
data.kindstringaccount, bot or resources.
data.connectorstring | nullThe connector the recovery acted on.
data.project_idstring UUID | nullThe project, or null for an account recovery.
data.automaticbooleanTrue when the platform ran it without the creator.
data.on_demandbooleanTrue for a Swap & Grant of a healthy resource.
data.started_atISO 8601 timestampWhen it began.
data.failure_reasonstring | nullWhat went wrong, as the ledger recorded it.

Caveats

  • A swap that fails while a channel recovery is already absorbing swaps leaves that recovery standing: failing it would erase a swap that did happen. Only a recovery that failed on its first swap fires this.

How is this guide?

On this page

Subscriby is a product designed by you — for you.

No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request