The SDK wraps every event in the same envelope. You only supply the type and payload.
{
"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" }
}
Never send
Media, file names, free text, keystrokes, screenshots, cookies, passwords or device fingerprints. The schemas have no place for them.
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.
| Field | Required | Description |
|---|
| aspectRatio | No | Image aspect ratio, rounded to two decimals (no pixels or dimensions) |
| initial | Yes | Starting brightness, contrast and saturation values (−100 to 100) |
edit.adjustment_changed A single control was changed.
| Field | Required | Description |
|---|
| control | Yes | Which control changed: brightness, contrast or saturation |
| from | Yes | Value before the change (−100 to 100) |
| inputMethod | No | Whether the change came from the slider, a step button or a reset |
| msSinceStart | No | Milliseconds since the editing session began |
| to | Yes | Value after the change (−100 to 100) |
edit.preset_applied A named preset was applied.
| Field | Required | Description |
|---|
| msSinceStart | No | Milliseconds since the editing session began |
| preset | Yes | Preset name from a fixed list |
| resulting | Yes | Brightness, contrast and saturation after applying the preset |
edit.undo The previous action was undone.
| Field | Required | Description |
|---|
| resulting | Yes | Brightness, contrast and saturation after the undo |
| reverted | Yes | Which kind of action was undone |
edit.final_selected The user explicitly confirmed a final edit.
| Field | Required | Description |
|---|
| actionCount | Yes | Number of edit actions in the session |
| durationMs | No | Session duration in milliseconds |
| final | Yes | Confirmed brightness, contrast and saturation |
| preset | Yes | Last 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.
| Field | Required | Description |
|---|
| tempoBpm | No | Project tempo in beats per minute |
| trackCount | Yes | Number of tracks in the project |
mix.track_adjusted A control on one track was changed.
| Field | Required | Description |
|---|
| control | Yes | Which control: gain, pan, EQ band or reverb |
| from | Yes | Value before the change (−100 to 100) |
| msSinceStart | No | Milliseconds since the session began |
| to | Yes | Value after the change (−100 to 100) |
| track | Yes | Track number (not its name) |
mix.effect_toggled An effect was switched on or off.
| Field | Required | Description |
|---|
| effect | Yes | Effect from a fixed list |
| enabled | Yes | Whether the effect is now on |
| track | Yes | Track number (not its name) |
mix.versions_compared Two mix versions were compared and one preferred.
| Field | Required | Description |
|---|
| preferred | Yes | Which version was preferred: a or b |
| versionA | Yes | First version number |
| versionB | Yes | Second version number |
mix.final_selected A final mix version was chosen.
| Field | Required | Description |
|---|
| actionCount | Yes | Number of actions in the session |
| durationMs | No | Session duration in milliseconds |
| version | Yes | Chosen version number |
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.
| Field | Required | Description |
|---|
| burst | No | Whether the set came from a burst |
| setSize | Yes | Number of photos in the set |
cull.photo_rated A photo was marked as a pick, reject or maybe.
| Field | Required | Description |
|---|
| position | Yes | Position in the set (not the photo) |
| rating | Yes | Pick, reject or maybe |
| reason | No | Reason from a fixed list |
cull.compared Two photos were compared and one preferred.
| Field | Required | Description |
|---|
| positionA | Yes | Position of the first photo |
| positionB | Yes | Position of the second photo |
| preferred | Yes | Which was preferred: a or b |
cull.final_selected The selection was confirmed.
| Field | Required | Description |
|---|
| durationMs | No | Time spent selecting, in milliseconds |
| picks | Yes | Number of photos kept |
| rejects | Yes | Number of photos rejected |