Event format
Every webhook delivery has the same envelope:Event types
| Event | Trigger |
|---|---|
intent.created | Intent created |
intent.pending | Transaction broadcast to chain |
intent.confirmed | Sufficient confirmations |
intent.finalized | Chain-level finality |
intent.failed | On-chain failure (revert, program error) |
intent.expired | TTL elapsed without fulfillment |
intent.cancelled | Explicitly cancelled |
intent.retry_required | Transaction dropped, fulfiller must re-sign |
intent.detected | Fulfiller acknowledged audio receipt |
Verifying signatures
Every delivery includes anX-PF-Signature header signed with your webhook secret using HMAC-SHA256 (same pattern as Stripe):
Delivery guarantees
- Retry policy: Exponential backoff, ~10 attempts over up to 72 hours
- Ordering: Best-effort. Events may arrive out of order — always confirm current state via
GET /v1/intents/:idbefore acting - Deduplication: Each event has a stable
eventId. The same event may be delivered more than once — deduplicate oneventId