How to use this doc
Use this in a blame discussion. Classify the layer first. Then quote the row.
Shared request shape
All HTTP calls share one shape. Host and JWT signing secret come from the selected client in src/config/clients.ts.
JWT is signed on the device with the active client’s secretKey via getSecretKeyFromClientId / getActiveSecretKey(). Xporience uses a different secret from ADNEC / DMG / Terrapinn. Do not paste secrets into tickets or this site.
Contract: userLogin
Mobile sends (JWT claims): username, password, device_id
Backend is expected to return
Mobile does not own: whether the password is correct.
Do not log: username+password JWT payload, raw password, raw secret.
Contract: getSpaceList
Mobile sends (JWT claims): event_id, device_id
No pagination found in mobile.
Contract: generateLead
Mobile sends (JWT claims): badge_number, event_id, badge_type (Visitor | Conference), visited_date, sync_date, user_id, space_id, device_id
Success body mobile reads: data.sync_status — only 1 counts as valid. Missing field = restricted on Home path.
If backend returns 503 and mobile Home path does not recognize it, Home may fall through to “other 5xx → save offline”. Camera may not save. That is a contract bug, not “mobile being random.”
Ownership matrix (behaviors, not endpoints)
Sentence: A 500 with “Saving offline” is mobile doing its job. A 404 “Invalid badge” is backend doing its job. A 200 with no sync_status showing Restricted is the contract (decideSuccessValidity).
Decision log (why this way)
Add a row when a behavior is chosen on purpose. Do not argue undocumented history.
When you add DEC-017+, write the reason in one sentence. “Because backend said so” needs a meeting note or ticket id in the incident log.
Meeting decisions (living)
Dependencies that affect ownership
Diagnostics (recommended, not built yet)
Internal screen, not for operators: environment, app version, API base URL, selected client, user_id, space_id, online flag, last operation, last HTTP status, last message, last sync_status, duration, timestamp, copy/export.
Never log: passwords, EPTOKEN, Authorization, excel password, JWT secrets, full personal fields beyond badge number if policy forbids it.
Until that screen exists: screenshot FlashMessage + Charles status line, then file an incident.