Publish an event
Maximum 256 KiB envelope; exactly type and data. Same key/exact bytes within 24 hours returns the original receipt without fan-out again. Different bytes return 409 idempotency_conflict. Keys remain project-wide regardless of dev/live label; use only agreed test data.
Maximum 256 KiB envelope; exactly type and data. Same key/exact bytes within 24 hours returns the original receipt without fan-out again. Different bytes return 409 idempotency_conflict. Keys remain project-wide regardless of dev/live label; use only agreed test data.
projectAPIKeyAuthorizationBearer <ch_dev_ or ch_live_ project API key>Read CASCADEHOOK_API_KEY from the local environment. Never print keys or headers. Scope is the project selected when the key was created.
Idempotency-Key*stringOne key per logical event. Reuse with the EXACT serialized bytes on retry, within 24 hours. Whitespace changes also cause idempotency_conflict.
^[!-~]+$1 <= length <= 255application/json- body
Exactly type and data; duplicate envelope keys are rejected. Entire serialized body maximum 262144 bytes. Retries must preserve exact bytes and Idempotency-Key.
type*EventType^[a-z0-9][a-z0-9_.-]{2,127}$3 <= length <= 128data*unknownAny JSON value, including null.
Acceptance only, not confirmed delivery. Zero delivery_count means no matching ready endpoint. Publish a NEW event after fixing setup.
application/json- response
id*stringuuidtype*EventType^[a-z0-9][a-z0-9_.-]{2,127}$3 <= length <= 128created_at*stringdate-timedelivery_count*integer0 <= valuecurl -X POST 'https://api.cascadehook.com/v1/events' \ -H 'Idempotency-Key: string' \ -H 'Content-Type: application/json' \ -d '{ "type": "invoice.paid", "data": { "invoice_id": "inv_test_1024" }}'{ "id": "01900000-0000-7000-8000-000000000002", "type": "invoice.paid", "created_at": "2026-01-01T00:00:00Z", "delivery_count": 1}List event summaries GET
Returns newest-first retained data. Unknown or repeated query parameters are rejected. Follow next_cursor until null; preserve filters. Omit cursor on the first page.
Read current delivery state GET
succeeded confirms receiver acknowledgement, not downstream business completion. pending/leased are not terminal. Inspect attempts and terminal_reason for failures.