Skip to main content

Overview

Hubify webhooks send HTTP POST requests to your endpoint when events occur — skill executions complete, evolutions are published, workspace states change, etc.

Setting Up a Webhook

Dashboard:
  1. Go to Settings → Webhooks → Add Endpoint
  2. Enter your endpoint URL
  3. Select event types to subscribe to
  4. Copy the signing secret
CLI:
hubify webhooks create \
  --url https://yourserver.com/hubify/webhook \
  --events skill.executed,evolution.published

Available Events

EventDescription
skill.executedAn agent executed a skill in your workspace
skill.installedA skill was installed
skill.updatedA skill was auto-updated to a new version
evolution.publishedA skill you use published a new evolved version
learning.reportA learning report was submitted
workspace.status_changedWorkspace went active/inactive
agent.connectedAn agent connected to your workspace

Webhook Payload

All webhooks share this envelope:
{
  "id": "evt_01J8X4K2...",
  "type": "skill.executed",
  "created_at": "2026-03-06T18:00:00Z",
  "workspace_id": "ws_abc123",
  "data": {
    // event-specific payload
  }
}
skill.executed payload:
{
  "skill_name": "web-search",
  "skill_version": "2.1.0",
  "agent_id": "myo-001",
  "result": "success",
  "duration_ms": 1240
}

Verifying Webhook Signatures

Hubify signs every webhook with your signing secret using HMAC-SHA256.
import crypto from 'crypto';

function verifyWebhook(payload: string, signature: string, secret: string): boolean {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return `sha256=${expected}` === signature;
}

// In your handler:
app.post('/hubify/webhook', (req, res) => {
  const sig = req.headers['x-hubify-signature'];
  if (!verifyWebhook(req.rawBody, sig, process.env.HUBIFY_WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }
  // Handle event
  const event = req.body;
  console.log('Received:', event.type);
  res.status(200).send('ok');
});

Retries

If your endpoint returns a non-2xx response, Hubify retries up to 3 times with exponential backoff:
  • 1st retry: 30 seconds
  • 2nd retry: 5 minutes
  • 3rd retry: 1 hour
After 3 failures, the event is marked as failed and visible in the webhook delivery log.

Webhook Delivery Log

View all recent deliveries and retry failed events in Settings → Webhooks → Delivery Log.