Skip to main content
POST
Create new events

Authorizations

Authorization
string
header
required

Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.

Body

application/json
sessionID
string
required

Session ID for the events (UUID format)

Example:

"550e8400-e29b-41d4-a716-446655440000"

events
object[]
required

Array of events to create. The combined number of events and lows must be at least 1 and at most 2000.

deliveryAck
boolean

Request synchronous durable ingestion. Only a committed request returns X-Corbado-Observe-Accepted=1; temporary persistence failures return 503. Legacy delivery is unchanged.

lows
object[]

Array of low-level events to create. The combined number of events and lows must be at least 1 and at most 2000.

telemetry
object[]

Diagnostic telemetry entries (SDK/integration-side messages, not auth-flow events). They ride along with the normal event batch, are tied to the same session, and never participate in flow classification. A batch may carry telemetry only (no events/lows). Capped at 2000 per batch.

meta
object
sdk
object

Identity of the SDK that produced the batch. Clients have always sent this; it is declared here so the backend can branch on it (e.g. serve the app-specific reliability config to native SDKs). Optional for backwards compatibility.

Response

SDK reliability configuration (returned only when the X-Corbado-Observe-Config header is set). The shape depends on the requesting SDK: web SDKs receive observeEventCreateRes, native app SDKs (request sdk.name observe-android/observe-ios) receive the app-specific observeSdkConfigApp.

SDK reliability configuration. Returned from the event ingestion endpoints only when the client opts in by sending the X-Corbado-Observe-Config request header carrying the config version the client is currently running (or 1 when it has none cached). When the sent version matches the current one the endpoints return 204 No Content (nothing new); without the header they always return 204, so this is a fully backwards-compatible addition. The SDK applies a received config on its next page load (boot-snapshot model) and stamps the version it ran under into each batch's meta.configVersion.

version
string
required

Content-derived version (hash) of this configuration. Changes whenever any value changes. The SDK caches it, echoes it in the X-Corbado-Observe-Config request header, and stamps it into meta.configVersion of every event batch so analyses can segment by the config actually in effect.

Example:

"3f2a1b9c0d4e"

flushIntervalMs
integer<int32>
required

How often the SDK should flush its event queue, in milliseconds.

Example:

500

durableLowOutbox
boolean
required

Persist lows in a separate bounded outbox and require durable server acknowledgement. Default false.

durableOutbox
boolean
required

Whether the SDK should persist queued events to a durable outbox so they survive reloads, redirects and browser-context switches.

beaconKeepalive
boolean
required

Whether the SDK should use keepalive/sendBeacon transport for flushes triggered during page unload.

sessionContinuity
boolean
required

Whether the SDK should maintain session continuity across browser-context switches (e.g. in-app browser to system browser).

sessionInactivityMs
integer<int32>
required

Inactivity threshold for continuity sessions, in milliseconds. When more time than this has passed since the last tracked activity, the SDK rotates to a new session id on the next load. Only relevant when sessionContinuity is enabled.

Example:

1800000

seqLockTimeoutMs
integer<int32>
required

Maximum time to wait for the cross-tab sequence Web Lock before allocating without it, in milliseconds. Clamped to 0–100ms. 0 is a sentinel that disables the lock: the SDK then allocates the sequence counter without requesting a lock at all, giving up cross-tab atomicity (two tabs can allocate the same seq) to save a lock round-trip per event.

Example:

5

tvc
boolean
required

Flush-trigger switch: flush pending events when the document becomes hidden (visibilitychange). Default true; the SDK treats a missing value as true, so delivery can never be disabled by accident.

tph
boolean
required

Flush-trigger switch: flush pending events on pagehide (navigation/close). Default true.

td
boolean
required

Flush-trigger switch: flush pending events when the integrator calls destroy(). Default true.

rawErrors
boolean
default:true
required

Enables serialization of explicitly supplied raw error diagnostics into stepData.rawError. Server default is true; an explicit false disables diagnostics. Normalized errors are always reported independently. SDK built-in defaults may differ (Android defaults off). SDKs apply this using their normal config lifecycle; disabling affects newly captured diagnostics, not events already queued.

telemetry
boolean
required

Master switch for the diagnostic telemetry stream. When true the SDK sends buffered telemetry entries (observeTelemetry) piggybacked on normal event requests; when false it collects nothing and sends nothing. Lets telemetry be turned off server-side without a customer redeploy.

flushOnTelemetry
boolean
required

When true (and telemetry is enabled), enqueuing a telemetry entry triggers an immediate client flush so diagnostics go out promptly (e.g. before a crash/navigation). Default false: a telemetry entry alone never triggers a flush, it only rides the next flush caused by anything else.

flushOnEventNames
string[]
required

Superseded by flushOnFlowTypeFinished; served only for SDK versions that predate it (they ignore the new field, newer SDKs ignore this one). Event names that trigger an immediate client-side flush when enqueued (e.g. flow_finished, conversion), so high-value events go out while the page is still alive instead of relying on unload delivery. Empty = no priority events. Capped at 20 names (both sides).

Example:
flushOnFlowTypeFinished
string[]
required

Flow types whose completion triggers an immediate client-side flush when enqueued, so the highest-value events go out while the page is still alive instead of relying on unload delivery. Both completion events count — flow_finished and flow_auto_finished — matched on their flowName; no other event name ever flushes early. Empty = no priority flows. Capped at 20 entries (both sides). Replaces flushOnEventNames, which SDKs from the version that introduced this field on no longer read.

Example:
deviceInfoCollectorTimeoutMs
integer<int32>
required

Per-field timeout for the SDK's device info collection, in milliseconds. A browser API that does not answer within this budget is recorded as a timeout in the event's device info collection errors and the field stays empty; the other fields are unaffected. Clamped to 10–10000ms. The SDK reads it per collection run, so a new value takes effect from the next device info refresh; the first collection of a load without a cached config runs on the built-in default.

Example:

1000

deviceInfoTiming
boolean
required

When true (and telemetry is enabled), every device info collection emits an info telemetry entry carrying the total duration and each field's duration in milliseconds. Default false — a diagnostic stream to switch on while investigating slow collection, not for permanent use. Durations of fields that hit deviceInfoCollectorTimeoutMs are censored at that value.

aap
string
required

Capability policy token for Corbado frontend SDKs and adapters. Values are assigned by Corbado per project and select how a capability behaves for that project; an SDK that does not implement the token it receives ignores it and keeps its standard behavior. Empty (the default) always means standard behavior. Capped at 16 characters — a longer value is served as empty.

Example:

"c1"

sourcePathQuery
string
required

Which query values the SDK includes in the page URL it reports as meta.trackingSourcePath: allowlist (the default) or all. allowlist keeps every query key and its position but replaces each value with * unless its key is listed in sourcePathQueryAllow (empty by default, so every value is masked); empty values and keys without a value stay as they are. all sends the query unchanged. The path itself is never changed. Any value other than all (including unset or empty) is served as allowlist. Server-side email/phone redaction still applies to whatever is sent.

Example:

"allowlist"

sourcePathQueryAllow
string[]
required

Query keys whose values are kept when sourcePathQuery is allowlist. Matched case-insensitively and exactly; a trailing * matches a key prefix (utm_*). Empty or oversized entries (more than 64 characters) are dropped and the list is capped at 50 entries (both sides). Empty by default. Ignored in all mode.

Example:
retry
object
required

Client-side retry configuration (exponential backoff) for failed event flushes.