OpenMercantil · AsyncAPI Specification

Openmercantil Webhooks

Version

View Spec View on GitHub BDNSBORMEBusiness RegistryCIFCNAECNMVCSVCompany DataCompany SearchCorporate RegistryDCAT-APDaily SummaryGeocodingJSONLegal DataMercantile LawOEPMOpen DataOpen Government DataOpenAPIOpenSanctionsPLACSPPublic ProcurementPublic RecordsPublic-Interest DataREST APIRegistry TimelineRisk SignalsSanctionsSpainSpanish CompaniesSpanish Open DataTendersTrust ScoreWebhookAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-14'
method: searched
source: >-
  openapi/_original/openmercantil-openapi-1.9.3.json (Webhooks-tagged
  operations and OutboundWebhook* component schemas)
docs: https://openmercantil.es/api/documentacion
provider: OpenMercantil
providerId: openmercantil
description: >-
  OpenMercantil ships an outbound webhook surface on the authenticated account
  plane: account holders register HTTPS endpoints, subscribe to a fixed
  allowlist of event types, and receive HMAC-signed deliveries. There is no
  AsyncAPI document — the event surface is declared entirely inside the
  OpenAPI 3.1 contract via the `OutboundWebhook*` schemas and an
  `x-webhook-event-contract-version` extension. This file captures that
  catalog; no AsyncAPI is fabricated.
asyncapi_published: false
asyncapi_note: >-
  No /asyncapi.yaml, no AsyncAPI document in the GitHub org and no event
  catalog page. The webhook contract is fully machine-readable, but expressed
  in OpenAPI extensions rather than AsyncAPI. Emitting `Webhooks`, not
  `AsyncAPI`.
webhooks:
  supported: true
  direction: outbound
  contract_version: '1.0'
  plane: account
  auth_required: session cookie (ob_sess) + X-CSRF-Token
  transport: HTTPS only
  url_constraint: '^https:// (enforced by schema pattern)'
  max_subscriptions_per_hook: 3
  signing:
    method: HMAC
    key_identifier: key_id (public identifier of the current signing key)
    secret_prefix: non-secret identification prefix, max 12 chars
    secret_format: '64 hex characters'
    secret_storage: encrypted
    secret_visibility: >-
      Returned exactly once, in the create/rotate response, plus identical
      Idempotency-Key replays within the 24-hour recovery window. Never
      returned by list.
    rotation_supported: true
  idempotency:
    required_on:
      - createUserWebhook
      - rotateUserWebhookSecret
    header: Idempotency-Key
    window_hours: 24
    conflict_status: 409
  delivery_health:
    field: last_success_at
    worker_health_schema: WebhookWorkerHealth
  fail_closed: >-
    Unknown event types, wildcard subscriptions and unsupported schema
    versions are rejected rather than silently accepted. Adding an event
    requires an explicit runtime, OpenAPI and contract-test change, so existing
    subscriptions can never implicitly gain future events.
subscribable_events:
  count: 3
  note: >-
    Events with a currently wired durable producer. An empty subscription input
    is normalised to alert.triggered.
  events:
    - name: alert.triggered
      description: A user-configured alert matched.
      subscribable: true
    - name: tender.matched
      description: A public procurement tender matched the account's criteria.
      subscribable: true
    - name: tender.deadline
      description: A tracked tender deadline is approaching.
      subscribable: true
contracted_events:
  count: 8
  note: >-
    Event names with a defined payload contract in this API version. Only the
    three above are currently subscribable; the rest are contracted-but-unwired
    and are rejected at subscription time. Recorded because it is an unusually
    honest forward declaration — the payload shape is fixed before the producer
    exists.
  events:
    - name: alert.triggered
      wired: true
    - name: tender.matched
      wired: true
    - name: tender.deadline
      wired: true
    - name: borme.daily
      wired: false
    - name: cartera.change
      wired: false
    - name: sanction.matched
      wired: false
    - name: segment.executed
      wired: false
    - name: webhook.test
      wired: false
management_operations:
  - operationId: listUserWebhooks
    method: GET
    path: /api/v1/user/webhooks
    summary: List outbound webhook metadata
  - operationId: createUserWebhook
    method: POST
    path: /api/v1/user/webhooks
    summary: Create an outbound webhook
    idempotency_key_required: true
  - operationId: updateUserWebhook
    method: PATCH
    path: /api/v1/user/webhooks/{id}
    summary: Update an outbound webhook
  - operationId: deleteUserWebhook
    method: DELETE
    path: /api/v1/user/webhooks/{id}
    summary: Delete an outbound webhook
  - operationId: rotateUserWebhookSecret
    method: POST
    path: /api/v1/user/webhooks/{id}/rotate
    summary: Rotate an outbound webhook signing secret
    idempotency_key_required: true
inbound_callbacks:
  - operationId: receiveStripeWebhook
    method: POST
    path: /api/v1/stripe-webhook
    direction: inbound
    provider: Stripe
    verification: >-
      Signature verified against the exact signed raw bytes, not a
      reserialized object.
    idempotency_key: Stripe event.id (durable)
    max_body_bytes: 524288
    note: >-
      A provider callback, not a customer-facing event surface. Listed for
      completeness; it is excluded from the public MCP plane.
availability_note: >-
  The pricing page lists webhooks under the MAX tier as "en el roadmap · acceso
  anticipado incluido" (roadmap, early access included), while the 1.9.3
  contract already declares the full CRUD and rotation surface as live. The
  contract is ahead of the pricing copy; recorded as observed.