Submit an externally signed source event
const url = 'https://api.katara.com/katara/v1/orgs/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/environments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/event-sources/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/events';const options = { method: 'POST', headers: {'X-Katara-Event-Signature': 'example', 'Content-Type': 'application/json'}, body: '{"org_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","environment_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","schema_version":1,"source_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","source_version":{"id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","version":1,"integrity":"example"},"activation_generation":1,"mode":"test","reset_generation":1,"event_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","occurred_at":"2026-04-15T12:00:00Z","input_ref":{"org_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","environment_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","version":1,"integrity":"example","media_type":"application/json","size_bytes":1},"signed_at":"2026-04-15T12:00:00Z"}'};
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://api.katara.com/katara/v1/orgs/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/environments/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/event-sources/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/events \ --header 'Content-Type: application/json' \ --header 'X-Katara-Event-Signature: example' \ --data '{ "org_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "environment_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "schema_version": 1, "source_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "source_version": { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "version": 1, "integrity": "example" }, "activation_generation": 1, "mode": "test", "reset_generation": 1, "event_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "occurred_at": "2026-04-15T12:00:00Z", "input_ref": { "org_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "environment_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "version": 1, "integrity": "example", "media_type": "application/json", "size_bytes": 1 }, "signed_at": "2026-04-15T12:00:00Z" }'Server-to-server signed producer ingress. Body1–16384 raw bytes; exact application/json Content-Type. Authorization, Cookie, Origin, Idempotency-Key, Content-Encoding and query parameters are refused. Sign Ed25519 over UTF8(katara.synapse.event.v1), NUL, UTF8(enrolled signing key UUID), NUL, and ASCII(sha256: plus lowercase SHA256 hex of the exact transmitted body bytes). Send canonical padded base64 of the 64-byte signature. Keep the private key exclusively at the external source. Whole-second UTC signed_at must be newer than 5 minutes ago, at most 30 seconds in the future and no earlier than occurred_at. A fresh signature may repeat unchanged semantic event metadata, subject to current source authority. Altered semantic fields conflict with the existing receipt. Source existence, invalid signatures and revoked authority share HTTP403. A persisted receipt does not prove run execution. The portal never sends signed events.
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Header Parameters
Section titled “Header Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
object
Responses
Section titled “Responses”Persisted signed-event receipt. Admission and run execution remain separate.
object
object
object
object
Example
{ "event": { "schema_version": 1, "mode": "test", "input_ref": { "media_type": "application/json" } }, "state": "pending"}Headers
Section titled “Headers”default
Section titled “default”Request error
object
object
Stable; branch on it. Any operation can answer invalid_request, with param naming the refused field when there is one; human_session_required, when an API key, service account or workload calls an operation only a signed-in person may perform; reauthentication_required, when a person’s sign-in is too old for the operation; permission_denied; route_not_found and method_not_allowed, when no operation matches the path or method; and feature_unavailable, when the operation’s service is not enabled on this deployment.
The request field a refusal is about, such as the agent_id or run_id query parameter; null when the refusal is not about one field.
Example
{ "error": { "action": "sign_in" }}