You scan
An opaque text like FINNS1:…. You don’t decode it; you send it to core verbatim.
At the Beach Club entrance, a member opens Check in in the FINNS app and shows a QR code. The gate scans it and asks core. Core answers granted or denied. The gate needs no member data and makes no network calls other than one. Gates are physical hardware supplied by a vendor; this section is the contract that hardware must meet.
flowchart LR
classDef ours fill:#13686C,stroke:#0B4A4D,color:#ffffff
classDef ext fill:#F3ECDF,stroke:#B9A88B,color:#12191B
classDef person fill:#E9724C,stroke:#C55A37,color:#ffffff
m(["Member"]):::person
app["FINNS app<br/>one-time QR"]:::ours
gate["<b>Gate</b><br/>QR scanner"]:::ext
core["Trident core"]:::ours
m --> app
app -- "1 · get QR" --> core
app -. "2 · shown on screen" .-> gate
gate -- "3 · POST /check-ins {gateId, qr}" --> core
core -- "4 · granted / denied (reason)" --> gate
You scan
An opaque text like FINNS1:…. You don’t decode it; you send it to core verbatim.
You send
One call per scan: {gateId, qr}, with the gate token.
You act
Open only on granted. Denied, errors and timeouts all keep the gate closed.
You hold
A gate token from FINNS, and your gate’s id ([a-z0-9-]{1,64}).
Internal and confidential. Share partner sections only as partner builds (pnpm build:partner).