Bluma · AsyncAPI Specification

Bluma Webhooks

Version

View Spec View on GitHub CompanyAIVideoVideo GenerationAdvertisingMarketingContent CreationShort-Form VideoSocial MediaGenerative AICreative ToolsText To SpeechMediaAutomationWebhooksAsyncAPIWebhooksEvents

AsyncAPI Specification

bluma-webhooks.yml Raw ↑
generated: '2026-08-12'
method: searched
source: >-
  https://docs.getbluma.com/concepts/webhooks , https://docs.getbluma.com/guides/webhooks-setup ,
  https://docs.getbluma.com/errors
docs: https://docs.getbluma.com/concepts/webhooks
note: >-
  Bluma documents a complete webhook surface — seven event types, a stable envelope,
  HMAC signing, a published retry ladder, automatic disabling, and a delivery-log
  endpoint — but ships NO AsyncAPI document. Nothing at /asyncapi.yaml, no event catalog
  file, and no public GitHub organization (github.com/bluma returns 404). This artifact
  captures the webhook catalog as published; no AsyncAPI has been authored on Bluma's
  behalf.
asyncapi_published: false
asyncapi_probed:
- url: https://api.getbluma.com/asyncapi.yaml
  status: 401
- url: https://docs.getbluma.com/asyncapi.yaml
  status: 404
- url: https://api.github.com/orgs/bluma
  status: 404
transport: HTTPS POST
delivery: at-least-once
envelope:
  fields:
  - name: id
    description: Event id
    prefix: evt_
  - name: type
    description: Event type string
  - name: created_at
    description: ISO 8601 timestamp
  - name: data
    description: Event-type-specific payload object
headers:
- name: X-Bluma-Signature
  description: 'HMAC-SHA256 of the raw body, formatted sha256=<hex>'
- name: X-Bluma-Event-Id
  description: Event id, mirrors body.id — the documented dedupe key
- name: X-Bluma-Event-Type
  description: Event type, mirrors body.type
- name: User-Agent
  description: Bluma-Webhooks/1.0
- name: Content-Type
  description: application/json
security:
  scheme: HMAC-SHA256
  secret_prefix: whsec_
  secret_issuance: returned once from POST /api/v1/webhooks
  signed_payload: raw request body (not re-serialized JSON)
  sdk_helper: Bluma.webhooks.verify(payload, signature, secret)
events:
- name: video.queued
  category: video
  description: Video generation started
  fired_when: Immediately after creation
- name: video.processing
  category: video
  description: Video is being generated
  fired_when: When rendering begins
- name: video.completed
  category: video
  description: Video is ready
  fired_when: Generation successful
  payload_fields:
  - id
  - status
  - template_id
  - url
  - thumbnail_url
  - duration
  - size_bytes
  - credits_consumed
- name: video.failed
  category: video
  description: Video generation failed
  fired_when: If an error occurs during rendering
  payload_fields:
  - id
  - status
  - template_id
  - error.type
  - error.detail
- name: video.deleted
  category: video
  description: Video was deleted
  fired_when: When a user deletes a video
- name: credits.low
  category: credits
  description: Credit balance running low
  fired_when: Balance drops below 10
- name: credits.exhausted
  category: credits
  description: No credits remaining
  fired_when: Balance reaches 0
subscription:
  register:
    operation: POST /api/v1/webhooks
    body:
    - url
    - events[]
    response_fields:
    - id
    - url
    - events
    - secret
    - is_active
    - created_at
  list:
    operation: GET /api/v1/webhooks
  delete:
    operation: DELETE /api/v1/webhooks/{id}
  deliveries:
    operation: GET /api/v1/webhooks/{id}/deliveries
    response_fields:
    - id
    - event_id
    - event_type
    - attempt_number
    - status_code
    - duration_ms
    - error_message
    - created_at
delivery_policy:
  success_criteria: 2xx response from the consumer endpoint
  retries:
  - attempt: 1
    after: 3 seconds
  - attempt: 2
    after: 30 seconds
  - attempt: 3
    after: 5 minutes
  - attempt: 4
    after: 1 hour
  max_attempts: 4
  auto_disable_after_consecutive_failures: 10
  rate_limited: false
  rate_limit_note: Webhook deliveries are exempt from API rate limits (server-initiated).
consumer_idempotency:
  required: true
  key: event_id (body.id / X-Bluma-Event-Id)
  guidance_published: true
  note: >-
    Bluma instructs consumers to dedupe on event_id and publishes a Redis-based example.
    This is CONSUMER-side idempotency for duplicate webhook deliveries — it is NOT
    request idempotency on the REST API, which Bluma does not support (no
    Idempotency-Key header is documented anywhere).
testing:
  tools_suggested:
  - webhook.site
  - ngrok
  test_mode: Webhooks are fully functional with bluma_test_ keys.
event_count: 7
gaps:
- No AsyncAPI (or any machine-readable event schema) is published, so the seven event
  payloads exist only as prose plus examples.
- No documented webhook signature timestamp or replay window — the signature covers the
  body only, so a captured delivery can be replayed indefinitely unless the consumer
  dedupes on event_id.
- No streaming or WebSocket surface; the rate-limits page states outright that Bluma
  does not support WebSockets.