Unreleased documentation. These pages follow the main branch and can change before the next release. For supported guidance, use v0.43.0.
Start a workflow from an authenticated product event
const url = 'https://example.com/v1/events/example/example';const options = { method: 'POST', headers: { 'ce-specversion': '1.0', 'ce-id': '2489E9AD-2EE2-8E00-8EC9-32D5F69181C0', 'ce-source': 'example', 'ce-type': 'example', 'ce-time': '2026-04-15T12:00:00Z', 'ce-dataschema': 'example', 'X-Registry-Event-Generation': 'example', 'X-Registry-Delivery-Attempt': 'example', 'X-Registry-Delivery-Time': '2026-04-15T12:00:00Z', 'Idempotency-Key': 'example', 'X-Registry-Signature': '<X-Registry-Signature>', 'Content-Type': 'application/json' }, body: '{"causation":{"hop":1,"parent":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","root":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"},"data":"example","dataschema":"example","id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","source":"example","subject":{"recordReference":"example","recordRevision":1},"time":"2026-04-15T12:00:00Z","type":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/events/example/example \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --header 'X-Registry-Delivery-Attempt: example' \ --header 'X-Registry-Delivery-Time: 2026-04-15T12:00:00Z' \ --header 'X-Registry-Event-Generation: example' \ --header 'X-Registry-Signature: <X-Registry-Signature>' \ --header 'ce-dataschema: example' \ --header 'ce-id: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0' \ --header 'ce-source: example' \ --header 'ce-specversion: 1.0' \ --header 'ce-time: 2026-04-15T12:00:00Z' \ --header 'ce-type: example' \ --data '{ "causation": { "hop": 1, "parent": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "root": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }, "data": "example", "dataschema": "example", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "source": "example", "subject": { "recordReference": "example", "recordRevision": 1 }, "time": "2026-04-15T12:00:00Z", "type": "example" }'Accept at most 1048576 canonical JSON bytes, the v1 signable bound, using the platform HookEnvelope and v1 delivery signature; the admitted event value is then held to the 131072-byte structured value profile. Envelope headers must match the body and the authored source, event type and data schema. Delivery time must be within 30 seconds; an older event may be redelivered. The exact source, event identity and trigger bind admission across retries. Every downstream call uses its own product authorization.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”The hook envelope, one shape for every product and every destination kind.
object
The chain this event belongs to.
object
0 for a root event, parent hop + 1 otherwise.
The id of the event whose handler proposed the change that produced
this one. Absent for a root event, never spelled null on the wire:
the decoder refuses bytes a re-encode cannot reproduce. A UUID when
present.
The id of the first event in the chain; equals id for a root event.
A later orchestrator correlates on this field. A UUID, like every
event identity on the envelope.
The product projection. Integers that are not exactly representable as binary64 must be strings; canonical JSON refuses them otherwise.
The product data contract id for data.
Event identity, unique per triggering change. The idempotency key a remote handler must honor across retries.
A UUID: the delivery store keys an envelope by a UUID event id, so an id that is not one could never be stored. Refused on both encode and decode.
The producing product and deployment identity.
The product record reference and revision.
object
The record reference, as the product addresses it.
The revision the triggering change produced. Revisions start at one, so a revision of zero or below is refused on both encode and decode, the same bound the delivery store enforces on a stored envelope.
Commit time of the triggering change, RFC 3339.
Normalized on every serialization: converted to UTC and truncated to whole milliseconds, so two equal instants written at different offsets or at finer precision produce identical canonical bytes. The in-memory value keeps whatever the product gave it; the wire form is the normalized one. Decoding requires that wire form and refuses any other spelling, so a decoded envelope re-encodes to the bytes it arrived as.
The hook’s stable contract id.
Example generated
{ "causation": { "hop": 1, "parent": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "root": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }, "data": "example", "dataschema": "example", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "source": "example", "subject": { "recordReference": "example", "recordRevision": 1 }, "time": "2026-04-15T12:00:00Z", "type": "example"}Responses
Section titled “Responses”Run admission is committed, or the exact event was already admitted. Empty Hook response proposes no source mutation.
Headers
Section titled “Headers”A problem: event.invalid, input.invalid, request.invalid.
object
Example
{ "code": "event.invalid", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}A problem: event.unauthenticated.
object
Example
{ "code": "event.unauthenticated", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}Headers
Section titled “Headers”Authenticate the exact canonical event and delivery attempt with the configured source key.
A problem: request.method-not-allowed.
object
Example
{ "code": "request.method-not-allowed", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}A problem: admission.held, admission.recovery-only, binding.conflict, binding.live-conflict, definition.refused, deployment.activation-changed, deployment.refused, execution.held, idempotency.key-reused.
object
Example
{ "code": "admission.held", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}A problem: event.too-large, request.body-too-large.
object
Example
{ "code": "event.too-large", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}A problem: runtime.failure.
object
Example
{ "code": "runtime.failure", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}A problem: audit.response-unavailable, event.source-unavailable, service.unavailable.
object
Example
{ "code": "audit.response-unavailable", "type": "https://id.registrystack.org/problems/registry-coordinator/admission/held"}Headers
Section titled “Headers”Whole seconds to wait before trying again.