ProofDraw · AsyncAPI Specification
Proofdraw Webhooks
Version
View Spec
View on GitHub
RandomnessProvably Fairdrandverifiable-randomnessCryptographyrafflegiveawaySweepstakesLotteryVerificationWebhookREST APIAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-11'
method: searched
source: https://proofdraw.com/api
spec_type: none
asyncapi_published: false
note: >-
ProofDraw documents a real webhook surface but publishes no AsyncAPI document and no event-payload
schemas. The OpenAPI carries no `webhooks:` object either (it is OpenAPI 3.0.3, which predates that
keyword). Event payload shapes are deferred to docs/api-spec.md, which returns 404 — so the catalog below
is the event NAMES and the delivery/signature contract as published, with payload bodies genuinely
unspecified. Nothing here is invented.
transport: HTTPS POST
subscription_model:
mechanism: per-draw callback_url
set_on:
- POST /v1/draws
- POST /v1/draws/instant
field: callback_url
constraints: URL, max 500 chars, optional
note: >-
There is no account-level webhook endpoint, no webhook management API, no endpoint list/update/delete,
and no event-subscription filter. Each draw carries its own callback URL, set at create time only.
security:
signature_header: X-ProofDraw-Signature
signature_format: 'sha256=<hex>'
algorithm: HMAC-SHA256
secret_field: callback_secret
secret_delivery: >-
Returned ONLY on the creating response (POST /v1/draws or POST /v1/draws/instant) when callback_url was
supplied. Not retrievable afterwards — subsequent reads of the draw omit it. There is no documented
rotation or re-issue path, so losing the secret means losing the ability to verify that draw's
deliveries.
signed_payload_definition: undocumented
timestamp_header: null
replay_protection: undocumented
events:
- name: draw.sealed
trigger: The entry list has been hashed, committed publicly, and bound to a future drand round.
payload_schema: undocumented
- name: draw.resolved
trigger: >-
The drand round published and the winning row was computed. Delivered whether resolution came from a
synchronous wait, an explicit POST /v1/draws/{id}/resolve, or the auto-resolver cron.
payload_schema: undocumented
- name: draw.cancelled
trigger: An open draw was cancelled via DELETE /v1/draws/{id}.
payload_schema: undocumented
delivery:
latency: >-
The auto-resolver cron runs every minute, so a webhook can arrive up to ~60s (≈30s average) after the
drand round publishes. Callers needing the result sooner are told to run their own timer and call
POST /v1/draws/{id}/resolve.
retries: undocumented
ordering: undocumented
timeouts: undocumented
why_it_matters: >-
The docs make the webhook the durable contract rather than an optional extra: the synchronous `wait: true`
path is hard-capped at 60 seconds, so any draw with round_offset_seconds over ~45s WILL return `sealed`
rather than `resolved` and the result arrives only by webhook or by polling. For an agent, the webhook is
the primary completion signal for scheduled draws.
gaps:
- No AsyncAPI (or OpenAPI 3.1 webhooks) document — event payloads cannot be typed by a consumer.
- No published retry policy, delivery timeout, or ordering guarantee.
- No replay protection documented (no timestamp header, no nonce) alongside the HMAC signature.
- callback_secret cannot be rotated or re-read; no account-level webhook endpoint management.