Formboost · AsyncAPI Specification

Formboost Webhooks

Version

View Spec View on GitHub formsform-backendhtml-formsserverlessstatic-sitesreactnextjsvuewebhooksno-codedeveloper-toolsspam-filteringAsyncAPIEvents

AsyncAPI Specification

formboost-webhooks.yml Raw ↑
generated: '2026-09-02'
method: searched
source: https://formboost.app/docs/http-webhook
asyncapi_published: false
asyncapi_note: >-
  Formboost publishes no AsyncAPI document. It does publish a fully specified webhook envelope,
  captured below verbatim from the docs. Nothing here is generated — no AsyncAPI file is written,
  because fabricating one would assert a machine-readable event contract the provider does not ship.
transport: http
direction: outbound (Formboost -> customer endpoint)
configuration:
  location: dashboard -> form -> Integrations tab -> Webhook
  methods: [POST, GET, PUT, PATCH]
  custom_headers: >-
    Arbitrary headers supplied as a JSON object, used for authenticating the delivery to the
    customer's own endpoint (e.g. Authorization, X-API-Key).
  destination_constraints: >-
    Destinations must be public HTTPS URLs. Private and loopback addresses (localhost,
    127.0.0.1) are rejected — an explicit SSRF control, stated at https://formboost.app/security.
  content_type: application/json (for POST, PUT, PATCH); query parameters for GET
events:
  - name: form.submission
    description: A form received a submission and it passed spam screening and was stored.
    payload_fields:
      - field: event
        type: string
        description: 'Literal `form.submission`.'
      - field: eventId
        type: string
        description: >-
          `sub_<submission id>`. STABLE ACROSS RETRIES — the docs name it explicitly as an
          idempotency key for dropping duplicates on the consumer side.
      - field: sentAt
        type: string (ISO 8601)
        description: When this delivery attempt left Formboost. Changes on every attempt.
      - field: form.name
        type: string
        description: The form's display name.
      - field: form.alias
        type: string
        description: The form's endpoint alias.
      - field: submission.submittedAt
        type: string (ISO 8601)
        description: >-
          When the form was actually filled in. Unchanged by retries, so it can be much earlier
          than sentAt.
      - field: submission.*
        type: object
        description: >-
          The customer's own form fields, exactly as submitted — not renamed or reordered.
    example: |
      {
        "event": "form.submission",
        "eventId": "sub_3b241101-e2bb-4255-8caf-4136c566a962",
        "sentAt": "2026-08-24T12:00:00.120Z",
        "form": { "name": "Contact Form", "alias": "contact" },
        "submission": {
          "name": "John Doe",
          "email": "john@example.com",
          "message": "Hello, I'd like to learn more.",
          "submittedAt": "2026-08-24T12:00:00.000Z"
        }
      }
  - name: form.submission.test
    description: >-
      A test delivery fired from the Integrations tab's "Send Test" button. Same envelope,
      but eventId is `test_<uuid>` instead of `sub_<submission id>`.
    payload_fields:
      - field: event
        type: string
        description: 'Literal `form.submission.test`.'
      - field: eventId
        type: string
        description: '`test_<uuid>`.'
reserved_keys:
  - key: submittedAt
    scope: inside `submission`
    behaviour: >-
      A form field named `submittedAt` is dropped in favour of the real timestamp, because
      consumers rely on it being a date. It is the ONLY reserved key — everything Formboost adds
      lives under `event`, `eventId`, `sentAt` and `form`, so a customer field called `name`,
      `id` or `event` cannot collide.
delivery_semantics:
  guarantee: at-most-once
  retries: false
  retry_detail: >-
    Formboost delivers each submission exactly ONCE. A non-2xx status or a timeout is NOT
    retried; the failure is recorded with its status code under Integrations -> Delivery Logs.
    This is the single most important operational fact about the surface: a consumer that needs
    at-least-once must queue the payload the moment it arrives.
  consumer_timeout: 10 seconds
  timeout_detail: The consuming endpoint must respond within 10 seconds.
  delivery_logs: dashboard -> Integrations -> Delivery Logs
  ordering: not specified
  signing: false
  signing_note: >-
    Formboost does NOT sign webhook deliveries. There is no HMAC signature header and no shared
    secret. The documented authentication story is the reverse direction — the consumer adds its
    own custom headers so Formboost can authenticate TO the consumer. A consumer cannot
    cryptographically verify that a delivery originated from Formboost; treat the payload as
    unauthenticated input and rely on a hard-to-guess destination URL plus its own header check.
shared_envelope:
  destinations: [http-webhook, zapier, n8n]
  note: >-
    The docs state the Zapier and n8n destinations send the SAME envelope as the raw HTTP
    webhook — "a consumer written against one works against all three." Zapier is wired via a
    Webhooks by Zapier catch-hook URL and n8n via a Webhook node URL; Formboost publishes no app
    in either catalogue.
other_destinations:
  - name: Email notifications
    docs: https://formboost.app/integrations/email
  - name: Slack
    docs: https://formboost.app/docs/slack
  - name: Discord
    docs: https://formboost.app/docs/discord
  - name: Telegram
    docs: https://formboost.app/docs/telegram
  - name: Google Sheets
    docs: https://formboost.app/docs/google-sheets
    note: >-
      The one native OAuth connection. Formboost requests only the Google `drive.file` scope, so
      it can reach the spreadsheets it created and nothing else in the user's Drive.
breaking_changes:
  - date: '2026-08'
    summary: >-
      The webhook body was flattened-to-nested. Customer fields used to sit at the top level
      alongside `fb_formId`, `fb_formName` and `fb_dashboardUrl`; those keys are gone and fields
      now live under `submission`. A consumer reading `req.body.email` must now read
      `req.body.submission.email`. `fb_dashboardUrl` has no replacement — use `form.alias` plus
      `eventId`.
    breaking: true
    migration_documented: true
    source: https://formboost.app/docs/http-webhook
    note: >-
      Shipped as a breaking change with migration guidance in the docs, but with no versioning,
      no deprecation window and no Sunset header. See lifecycle/formboost-lifecycle.yml.
testing:
  guidance: >-
    The docs recommend webhook.site to inspect the exact payload before wiring a production
    endpoint, and the Integrations tab has a "Send Test" button that fires a form.submission.test
    delivery.
  docs: https://formboost.app/docs/http-webhook

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/formboost-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 email required.

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