Skip to main content

Webhooks API

Hakona can send outbound webhook notifications to your own endpoints whenever workflow runs complete, fail, or change state.

Creating a webhook​

POST /v1/webhooks

Request body

{
"url": "https://your-server.com/hakona-events",
"events": ["run.succeeded", "run.failed"],
"workflow_id": "wf_abc123"
}

Omit workflow_id to receive events for all workflows.

Supported events​

EventFired when
run.startedA workflow run begins
run.succeededA run completes successfully
run.failedA run fails after all retries are exhausted
workflow.activatedA workflow is deployed
workflow.pausedA workflow is paused

Webhook payload​

{
"event": "run.failed",
"timestamp": "2026-04-29T09:05:00Z",
"data": {
"run_id": "run_def456",
"workflow_id": "wf_abc123",
"workflow_name": "Notify on GitHub issue",
"error": "Action 'Post to Slack' failed: channel_not_found"
}
}

Verifying webhook signatures​

Every request includes an X-Hakona-Signature header — an HMAC-SHA256 signature of the raw request body using your webhook's signing secret.

import hmac, hashlib

def verify(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature)

List webhooks​

GET /v1/webhooks

Delete a webhook​

DELETE /v1/webhooks/{id}