Event catalogue

Every webhook event Hannu emits today, grouped by resource, with one example payload — plus a note on the richer events still to come.

Every webhook is one of the events below. They're grouped by the resource they describe. Each delivery is a { id, type, data } body where data is the full resource snapshot at the time of the event — see Webhooks overview for the delivery shape and guarantees.

Task events

The lifecycle of a single task, from creation through settlement. See Task lifecycle.

  • task.submitted — a task was created and entered safety screening. Payload: { org_id, type, zone_ref }. Despite the name, this fires at creation, not on proof — there is no pilot webhook for Operator proof submission.
  • task.review_required — safety screening routed a newly created task to ops review. Payload: { category }. This is screening review, not proof-verification review.
  • task.live — the task cleared screening and is open for matching.
  • task.matched — an eligible Operator has been matched to it.
  • task.approved — proof accepted, escrow released, task approved.
  • task.rejected — proof rejected; escrow freezes and a dispute opens.
  • task.cancelled — the task was cancelled before acceptance and escrow refunded.
  • task.expired — the task went unmatched or unfulfilled within its window.
  • task.blocked — the task was refused in the write path (for example, credential-class work) or blocked by safety screening.

Wallet events

  • wallet.funded — a deposit settled and the wallet balance increased.
  • wallet.low_balance — the balance crossed its low-balance threshold.

Workflow events

Dispute events

  • dispute.opened — a rejection opened a dispute; escrow is frozen.
  • dispute.resolved — the dispute reached an outcome; escrow released or refunded.

Worker events

Signals about Operator onboarding and availability. These never carry Operator contact details — see policy.

  • worker.invited — an Operator was invited to the platform.
  • worker.waitlisted — an Operator was placed on the waitlist.
  • worker.activated — an Operator completed KYC and became eligible for work.

Assignment events

  • assignment.accepted — an Operator accepted a task offer.

Example payload

Every delivery has the same envelope. Here's a task.approved:

JSON
{
  "id": "evt_3b9",
  "type": "task.approved",
  "data": {
    "id": "task_8f21",
    "type": "field_verification",
    "state": "approved"
  }
}

Dedupe on id, and read everything you need from data — you never have to fetch the resource to find out what changed.

Richer events are coming

The events above are what Hannu emits today. More granular events — finer-grained proof, verification, and payout signals — are planned for Phase 1.5 and are not live yet. Build against the list above; don't code against event names that aren't in it.