Skip to main content

Data schema

Authoritative, exhaustive table of every field in the data payload of a com.auditdata.listo.screening.completed.v1 event. The grouped narrative lives at Screening completed; this page is the flat reference for engineers writing schemas, ORMs, and parsers.

Conventions

  • Field names are camelCase.
  • Timestamps are RFC 3339 date-times. testTime and emailSentDateTime preserve the offset they were recorded with (matching the underlying datetimeoffset storage) and may carry any offset — e.g. 2026-05-08T11:25:33+02:00. birthday is emitted at midnight UTC (1972-11-04T00:00:00Z).
  • Integer codes (leftTestResult, rightTestResult, stimulusType) and the noiseLevel string codes are documented in Screening completed — test results.
  • "Nullable" means the field may be null on the JSON payload. Fields marked nullable are not always null; they're permitted to be.
  • Field order in the JSON is not guaranteed. Treat the payload as an unordered map.
  • New optional fields may appear within .v1 without notice in this table being a breaking change. Consumers must ignore unknown fields — see Versioning & compatibility.

Top-level fields

Identifiers

FieldJSON typeNullableNotesExample
idintegernoListo database ID for the session. Stable across redeliveries and the Sessions API. Use as application idempotency key.1138291
tenantIdstring (UUID)noTenant that owns this session. Always equal to the {tenantId} in the request URL when fetched via the Sessions API; always equal to the tenant the queue was provisioned for when received via Service Bus."0d3e2b51-4e7a-44b6-8d5e-1c3a9b2f7c40"

Patient demographics

FieldJSON typeNullableNotesExample
firstnamestringyes≤100 chars."Avery"
lastnamestringyes≤100 chars."Larsen"
titlestringyes≤50 chars. Free-form."Ms."
emailstringyes≤100 chars. Not RFC-validated."avery.larsen@example.org"
phonestringyes≤50 chars. Free-form."+45 12 34 56 78"
birthdaystring (RFC 3339 date-time)yesPatient birth date. Emitted as an RFC 3339 date-time at midnight UTC; the time component is always 00:00:00Z."1972-11-04T00:00:00Z"

Office and location

FieldJSON typeNullableNotesExample
officeIdintegernoListo internal office ID.9412
officeNamestringyes≤200 chars."Hearing & Co. Copenhagen Central"
officeExternalIdstringyes≤100 chars. Tenant's own ID for the office."HC-CPH-CENTRAL"
officeExternalAltIdstringyes≤100 chars. Alternate external ID.null

Device, transducer, test flow

FieldJSON typeNullableNotesExample
deviceTypestringyesFree-form device type."iPad"
deviceNamestringyes≤100 chars."Listo-iPad-04"
transducerNamestringyes≤50 chars."Sennheiser HDA 280"
testFlowNamestringyes≤250 chars."Standard adult — 7 frequency"

Test results

FieldJSON typeNullableNotesExample
leftTestResultintegernoCoded outcome for left ear. See Test result codes.1
rightTestResultintegernoCoded outcome for right ear. See Test result codes.2
stimulusTypeintegernoCoded stimulus. See Stimulus type codes.0
noiseLevelstringyesCoded ambient-noise level. One of "1" (Silent), "2" (Some noise), "3" (A lot of noise). See Noise level codes."2"

Audiograms

Each audiogram object always exists; values inside are nullable. See Screening completed — audiograms.

FieldJSON typeNullableNotes
leftAudiogramobjectnoMeasured thresholds, left ear.
rightAudiogramobjectnoMeasured thresholds, right ear.
noiseCorrectionobjectnoAmbient-noise baseline.

Each object has the same shape, with seven nullable integers in dB:

FieldJSON typeNullableFrequency (Hz)
f250integeryes250
f500integeryes500
f1000integeryes1000
f2000integeryes2000
f4000integeryes4000
f6000integeryes6000
f8000integeryes8000

Example object:

{
"f250": 10,
"f500": 15,
"f1000": 20,
"f2000": 25,
"f4000": 30,
"f6000": null,
"f8000": 35
}

A null at a frequency means "no threshold available" (frequency not tested, no response, out of range).

All consent fields are integers or null. See Screening completed — consent flags for the encoding (0 refused, 1 granted, null not asked).

FieldJSON typeNullableNotes
consentAgreeWithTermsConditionsintegeryesAgreed to terms and conditions.
consentContactEmailintegeryesConsents to email contact.
consentContactPhoneintegeryesConsents to phone contact.
consentCustom1integeryesTenant-defined slot 1. Meaning configured per tenant.
consentCustom2integeryesTenant-defined slot 2.
consentCustom3integeryesTenant-defined slot 3.

Status and timestamps

FieldJSON typeNullableNotes
testTimestring (RFC 3339)noWhen the screening was performed on the iPad. The offset is preserved as recorded by the device (e.g. 2026-05-08T11:25:33+02:00); not normalized to UTC. The Sessions API filters on this field.
emailSentDateTimestring (RFC 3339)yesWhen the patient-facing results email was sent. The offset is preserved as recorded (e.g. 2026-05-08T11:30:14+02:00); not normalized to UTC. null on the Service Bus event — email sending is async and runs after the event is published. The Sessions API returns the accurate value once the email has been dispatched.
emailStatusstringyesOne of "Sent", "Failed", or null (not attempted). null on the Service Bus event for the same reason; the Sessions API returns the accurate value once the email has been dispatched.

Where to next