Fusio · AsyncAPI Specification

Fusio Webhooks

Version

View Spec View on GitHub API ManagementOpen-SourceREST APIAPI GatewayDeveloper PortalOpenAPISelf-HostedMCPAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-29'
method: searched
source: >-
  https://docs.fusio-project.org/docs/backend/api/event,
  https://docs.fusio-project.org/docs/backend/consumer/webhook,
  https://docs.fusio-project.org/docs/backend/api/trigger,
  derived from openapi/fusio-backend.json and openapi/fusio-consumer.json
provider: Fusio
providerId: fusio
type: webhooks
asyncapi_published: false
asyncapi_note: >-
  Fusio publishes no AsyncAPI document, and there is a structural reason rather than an oversight:
  the event catalog is not Fusio's, it is the operator's. Fusio ships the webhook MACHINERY -
  event registry, subscription API, delivery with retries, per-subscription delivery log - and each
  instance defines its own events with its own TypeSchema payloads. A vendor-published AsyncAPI
  would have nothing to describe. What CAN be published, and is not, is an AsyncAPI generator
  alongside the existing spec-openapi / spec-typeapi / spec-openrpc generators, which would give
  every instance a machine-readable event contract the same way it already gets a machine-readable
  REST contract. That is a concrete, well-shaped gap worth raising with the provider.
description: >-
  Fusio's event system is a first-class, consumer-subscribable webhook surface. An operator
  registers named events with a payload schema; a consumer POSTs a subscription to /consumer/webhook
  naming the event and their endpoint; an action dispatches the event and Fusio delivers it.
model:
  event_registry:
    docs: https://docs.fusio-project.org/docs/backend/api/event
    fields: [name, description, schema]
    schema_language: TypeSchema
    note: The schema field describes the payload the event will carry, per event.
  subscription:
    docs: https://docs.fusio-project.org/docs/backend/consumer/webhook
    endpoint: POST /consumer/webhook
    payload: '{"event": "my_event", "endpoint": "http://my-app.com/callback"}'
    fields: [name, event, user, endpoint]
  dispatch:
    from_action: '$this->dispatcher->dispatch(''my_event'', [''foo'' => ''bar''])'
    from_builtin_action: Util-Dispatch-Event
    docs: https://docs.fusio-project.org/docs/backend/api/action/util-dispatch-event
  delivery:
    method: POST
    content_type: application/json
    user_agent: 'Fusio/<version>@<commit>'
    example_request: |
      POST /callback HTTP/1.1
      Host: my-app.com
      Content-Type: application/json
      User-Agent: Fusio/4.0.2@916a81045349cc0e149873b5b794777bb5f29a30

      {"foo": "bar"}
    retries: 3
    retry_rule: >-
      If the subscriber endpoint returns a non-successful status code, Fusio retries the message up
      to 3 times.
    signing: none
    signing_note: >-
      No HMAC signature, no timestamp header and no shared secret is documented on the callback.
      A subscriber cannot verify that a delivery actually came from the Fusio instance. This is the
      most significant gap in the webhook surface.
    delivery_log:
      schema: Consumer_WebhookResponse
      fields: [status, code, attempts, executeDate]
      note: >-
        Delivery outcomes are readable per subscription through consumer.webhook.get - a subscriber
        can see the HTTP code, attempt count and execution date of past deliveries, which is better
        observability than most webhook providers expose to the subscriber.
  triggers:
    docs: https://docs.fusio-project.org/docs/backend/api/trigger
    note: >-
      The inbound counterpart, added in 6.1.0 (#359): a trigger invokes an ACTION when an event
      fires, so events drive internal work as well as outbound webhooks.
operations:
  backend:
    - backend.event.getAll
    - backend.event.create
    - backend.event.get
    - backend.event.update
    - backend.event.delete
    - backend.webhook.getAll
    - backend.webhook.create
    - backend.webhook.get
    - backend.webhook.update
    - backend.webhook.delete
    - backend.trigger.getAll
    - backend.trigger.create
    - backend.trigger.get
    - backend.trigger.update
    - backend.trigger.delete
  consumer:
    - consumer.event.getAll
    - consumer.event.get
    - consumer.webhook.getAll
    - consumer.webhook.create
    - consumer.webhook.get
    - consumer.webhook.update
    - consumer.webhook.delete
inbound_webhooks:
  - name: Payment provider callback
    operationId: system.payment.webhook
    http: POST /system/payment/{provider}/webhook
    note: >-
      The one event catalog Fusio does define itself - the callback a payment provider (Stripe)
      posts after a consumer purchases a plan.
events_catalog:
  vendor_defined: []
  note: >-
    Fusio ships no vendor-defined outbound events. The catalog on any given instance is whatever
    the operator registered, readable at GET /backend/event or GET /consumer/event. The reference
    instance's catalog requires authentication and was not read.
gaps:
  - No AsyncAPI document and no spec-asyncapi generator.
  - No signature, timestamp or shared secret on webhook deliveries.
  - Retry policy is a fixed count of 3 with no documented backoff schedule.
maintainers:
  - FN: Kin Lane
    email: kin@apievangelist.com

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/fusio-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.