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.
testTimeandemailSentDateTimepreserve the offset they were recorded with (matching the underlyingdatetimeoffsetstorage) and may carry any offset — e.g.2026-05-08T11:25:33+02:00.birthdayis emitted at midnight UTC (1972-11-04T00:00:00Z). - Integer codes (
leftTestResult,rightTestResult,stimulusType) and thenoiseLevelstring codes are documented in Screening completed — test results. - "Nullable" means the field may be
nullon the JSON payload. Fields marked nullable are not alwaysnull; 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
.v1without notice in this table being a breaking change. Consumers must ignore unknown fields — see Versioning & compatibility.
Top-level fields
Identifiers
| Field | JSON type | Nullable | Notes | Example |
|---|---|---|---|---|
id | integer | no | Listo database ID for the session. Stable across redeliveries and the Sessions API. Use as application idempotency key. | 1138291 |
tenantId | string (UUID) | no | Tenant 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
| Field | JSON type | Nullable | Notes | Example |
|---|---|---|---|---|
firstname | string | yes | ≤100 chars. | "Avery" |
lastname | string | yes | ≤100 chars. | "Larsen" |
title | string | yes | ≤50 chars. Free-form. | "Ms." |
email | string | yes | ≤100 chars. Not RFC-validated. | "avery.larsen@example.org" |
phone | string | yes | ≤50 chars. Free-form. | "+45 12 34 56 78" |
birthday | string (RFC 3339 date-time) | yes | Patient 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
| Field | JSON type | Nullable | Notes | Example |
|---|---|---|---|---|
officeId | integer | no | Listo internal office ID. | 9412 |
officeName | string | yes | ≤200 chars. | "Hearing & Co. Copenhagen Central" |
officeExternalId | string | yes | ≤100 chars. Tenant's own ID for the office. | "HC-CPH-CENTRAL" |
officeExternalAltId | string | yes | ≤100 chars. Alternate external ID. | null |
Device, transducer, test flow
| Field | JSON type | Nullable | Notes | Example |
|---|---|---|---|---|
deviceType | string | yes | Free-form device type. | "iPad" |
deviceName | string | yes | ≤100 chars. | "Listo-iPad-04" |
transducerName | string | yes | ≤50 chars. | "Sennheiser HDA 280" |
testFlowName | string | yes | ≤250 chars. | "Standard adult — 7 frequency" |
Test results
| Field | JSON type | Nullable | Notes | Example |
|---|---|---|---|---|
leftTestResult | integer | no | Coded outcome for left ear. See Test result codes. | 1 |
rightTestResult | integer | no | Coded outcome for right ear. See Test result codes. | 2 |
stimulusType | integer | no | Coded stimulus. See Stimulus type codes. | 0 |
noiseLevel | string | yes | Coded 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.
| Field | JSON type | Nullable | Notes |
|---|---|---|---|
leftAudiogram | object | no | Measured thresholds, left ear. |
rightAudiogram | object | no | Measured thresholds, right ear. |
noiseCorrection | object | no | Ambient-noise baseline. |
Each object has the same shape, with seven nullable integers in dB:
| Field | JSON type | Nullable | Frequency (Hz) |
|---|---|---|---|
f250 | integer | yes | 250 |
f500 | integer | yes | 500 |
f1000 | integer | yes | 1000 |
f2000 | integer | yes | 2000 |
f4000 | integer | yes | 4000 |
f6000 | integer | yes | 6000 |
f8000 | integer | yes | 8000 |
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).
Consent flags
All consent fields are integers or null. See
Screening completed — consent flags
for the encoding (0 refused, 1 granted, null not asked).
| Field | JSON type | Nullable | Notes |
|---|---|---|---|
consentAgreeWithTermsConditions | integer | yes | Agreed to terms and conditions. |
consentContactEmail | integer | yes | Consents to email contact. |
consentContactPhone | integer | yes | Consents to phone contact. |
consentCustom1 | integer | yes | Tenant-defined slot 1. Meaning configured per tenant. |
consentCustom2 | integer | yes | Tenant-defined slot 2. |
consentCustom3 | integer | yes | Tenant-defined slot 3. |
Status and timestamps
| Field | JSON type | Nullable | Notes |
|---|---|---|---|
testTime | string (RFC 3339) | no | When 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. |
emailSentDateTime | string (RFC 3339) | yes | When 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. |
emailStatus | string | yes | One 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
- Screening completed — narrative payload reference.