Skip to main content

Webhooks

Webhooks let you receive real-time HTTP notifications when records are created, updated, or deleted in any entity. Subscribe once, get notified automatically.

Event types​

EventWhen it fires
record.createdA new record is created in the entity
record.updatedA record is updated
record.deletedA record is deleted

Creating a subscription​

MCP Tool: create_webhook (Profile: advanced)

create_webhook({
entity_name: "orders",
event_types: ["record.created", "record.updated"],
url: "https://your-server.com/webhooks/fyso",
secret: "your-signing-secret",
description: "Sync orders to ERP"
})

REST API:

curl -X POST https://api.fyso.dev/api/webhooks/subscriptions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"entity_name": "orders",
"event_types": ["record.created", "record.updated"],
"url": "https://your-server.com/webhooks/fyso",
"secret": "your-signing-secret",
"description": "Sync orders to ERP"
}'

Duplicate subscriptions (same entity + URL + events) return 409.

Payload​

Every delivery POSTs a JSON body to your URL:

{
"id": "evt_01HXYZ...",
"event": "record.created",
"entity": "orders",
"record_id": "rec_01HABC...",
"data": {
"id": "rec_01HABC...",
"customer_name": "Acme Corp",
"total": 1500,
"status": "pending"
},
"timestamp": "2026-02-23T14:32:00.000Z",
"tenant_id": "tenant_01HXY..."
}

Your endpoint must return a 2xx status within 30 seconds.

Verifying signatures​

When you set a secret, each request includes an X-Fyso-Signature header containing the HMAC-SHA256 hex digest of the raw JSON body.

import { createHmac } from "crypto";

function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = createHmac("sha256", secret).update(body).digest("hex");
return expected === signature;
}

Always verify signatures before processing payloads.

Listing subscriptions​

MCP Tool: list_webhooks (Profile: advanced)

list_webhooks()                         // all subscriptions
list_webhooks({ entity_name: "orders" }) // filter by entity

REST API:

GET /api/webhooks/subscriptions
GET /api/webhooks/subscriptions?entity=orders

Updating a subscription​

curl -X PUT https://api.fyso.dev/api/webhooks/subscriptions/<id> \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'

Pass only the fields you want to change: url, event_types, secret, is_active, description.

Deleting a subscription​

MCP Tool: delete_webhook (Profile: advanced)

delete_webhook({ webhook_id: "sub_01HXYZ..." })

REST API:

DELETE /api/webhooks/subscriptions/<id>

Delivery history​

Check the status of past deliveries for a subscription:

GET /api/webhooks/subscriptions/<id>/deliveries?limit=20

Each delivery shows:

{
"id": "...",
"status": "delivered",
"http_status": 200,
"attempt_count": 1,
"created_at": "2026-02-23T14:32:00Z",
"completed_at": "2026-02-23T14:32:01Z"
}

Status values: pending, delivered, failed.

Retries​

Failed deliveries (non-2xx or timeout) are retried up to 5 times with exponential backoff. After all retries are exhausted the delivery is marked failed.

Admin dashboard​

From the admin panel, go to Settings → Webhooks to manage subscriptions visually:

  • Create subscriptions with entity selector, event checkboxes, URL input, and optional secret
  • Toggle active/inactive per subscription
  • View delivery history per subscription
  • Delete subscriptions with confirmation