Event schemas

Relay only accepts events that match a schema you selected. Each schema is a fixed list of events and fields, and nothing outside it is stored.

The event envelope

The SDK wraps every event in the same envelope. You only supply the type and payload.

FieldDescription
eventIdUUID, generated by the SDK. Used for deduplication.
typeEvent type in area.action form, for example edit.undo.
occurredAtISO 8601 timestamp with offset.
sessionIdOptional UUID, set by startSession().
sequenceOptional position within the session, set by session.track().
payloadThe event's fields. At most 32 keys.
example event
{
  "eventId": "6f1c2a0e-6c1d-4a49-9a3b-0f1f5d0f6b21",
  "type": "edit.adjustment_changed",
  "occurredAt": "2026-10-08T03:00:00Z",
  "sessionId": "b0d1c7c4-3f0e-4d4a-8e8e-2f1d1c9a7e10",
  "sequence": 3,
  "payload": { "control": "contrast", "from": 0, "to": 18, "inputMethod": "slider" }
}

Strict validation

  • Unknown fields are stripped before storage and the event is quarantined for review.
  • Invalid values are rejected and not kept.
  • Batches are limited to 50 events and 64 KB.
Never send

Media, file names, free text, keystrokes, screenshots, cookies, passwords or device fingerprints. The schemas have no place for them.

Available schemas

These are the schemas available today. When you set up your app you select a schema and which of its optional fields to include; required fields are always included. Need something different? Tell us what your app does and we can add one.

Photo editing activity photo_edit v1

Editing actions, parameter changes and the final selection made in a photo editor. No images or media.

edit.session_started An editing session began on an image.
FieldRequiredDescription
aspectRatioNoImage aspect ratio, rounded to two decimals (no pixels or dimensions)
initialYesStarting brightness, contrast and saturation values (−100 to 100)
edit.adjustment_changed A single control was changed.
FieldRequiredDescription
controlYesWhich control changed: brightness, contrast or saturation
fromYesValue before the change (−100 to 100)
inputMethodNoWhether the change came from the slider, a step button or a reset
msSinceStartNoMilliseconds since the editing session began
toYesValue after the change (−100 to 100)
edit.preset_applied A named preset was applied.
FieldRequiredDescription
msSinceStartNoMilliseconds since the editing session began
presetYesPreset name from a fixed list
resultingYesBrightness, contrast and saturation after applying the preset
edit.undo The previous action was undone.
FieldRequiredDescription
resultingYesBrightness, contrast and saturation after the undo
revertedYesWhich kind of action was undone
edit.final_selected The user explicitly confirmed a final edit.
FieldRequiredDescription
actionCountYesNumber of edit actions in the session
durationMsNoSession duration in milliseconds
finalYesConfirmed brightness, contrast and saturation
presetYesLast preset applied, if any

Audio mixing activity audio_mix v1

Track adjustments, effects, A/B comparisons between mix versions and the final mix chosen. No audio.

mix.session_started A mixing session began.
FieldRequiredDescription
tempoBpmNoProject tempo in beats per minute
trackCountYesNumber of tracks in the project
mix.track_adjusted A control on one track was changed.
FieldRequiredDescription
controlYesWhich control: gain, pan, EQ band or reverb
fromYesValue before the change (−100 to 100)
msSinceStartNoMilliseconds since the session began
toYesValue after the change (−100 to 100)
trackYesTrack number (not its name)
mix.effect_toggled An effect was switched on or off.
FieldRequiredDescription
effectYesEffect from a fixed list
enabledYesWhether the effect is now on
trackYesTrack number (not its name)
mix.versions_compared Two mix versions were compared and one preferred.
FieldRequiredDescription
preferredYesWhich version was preferred: a or b
versionAYesFirst version number
versionBYesSecond version number
mix.final_selected A final mix version was chosen.
FieldRequiredDescription
actionCountYesNumber of actions in the session
durationMsNoSession duration in milliseconds
versionYesChosen version number

Assistant suggestion feedback suggestion_feedback v1

Which kinds of AI suggestion people accept, reject or edit, and how quickly. No text or content.

suggestion.shown The assistant showed a suggestion.
FieldRequiredDescription
kindYesKind of suggestion from a fixed list
lengthBucketNoRough size: short, medium or long
surfaceYesWhere it appeared: editor, sidebar or inline
suggestion.resolved The person responded to the suggestion.
FieldRequiredDescription
editMagnitudeNoIf edited: light or heavy changes
msToDecideYesMilliseconds between showing and responding
outcomeYesAccepted, rejected, edited or ignored

Photo selection photo_cull v1

Picks, rejects and head-to-head choices when narrowing a set of photos, with reason codes. No images.

cull.set_opened A set of photos was opened for selection.
FieldRequiredDescription
burstNoWhether the set came from a burst
setSizeYesNumber of photos in the set
cull.photo_rated A photo was marked as a pick, reject or maybe.
FieldRequiredDescription
positionYesPosition in the set (not the photo)
ratingYesPick, reject or maybe
reasonNoReason from a fixed list
cull.compared Two photos were compared and one preferred.
FieldRequiredDescription
positionAYesPosition of the first photo
positionBYesPosition of the second photo
preferredYesWhich was preferred: a or b
cull.final_selected The selection was confirmed.
FieldRequiredDescription
durationMsNoTime spent selecting, in milliseconds
picksYesNumber of photos kept
rejectsYesNumber of photos rejected