Recipes
Recipes
Copy-paste sequences for the common jobs. Everything below assumes an active connection and a bearer token:
All of these flows are implemented end-to-end in the public demo apps — github.com/Identa-io/demo is the reference integration.
Read everything the user granted
Serve-on-read means you always get the current version — if the user
updates their address in Geena, your next read has it. Do not cache what you
were not granted keep for.
Fill a pending slot from the vault
With the user present in your app (the tap is the consent):
Create a value the vault doesn’t hold yet
Supply the naming vocabulary yourself (“Personal”, “Work”, “Mobile”) so the user’s vault stays navigable:
Create is always-create: a fresh document, granted in the same act — it never overwrites anything.
Set a one-value-per-person field
Some schemas hold one value per person (PersonFullName, PersonTaxStatus,
…). Don’t make the user pick between instances — fill the value:
Prefill your form from the candidate’s data so the user corrects rather
than retypes. The write path needs the slot’s edit verb; the create path
fill.
Update data later (the manage-account pattern)
The user changed banks and tells you first. Push the update through the connection — their vault stays the source of truth:
Never PUT a partial object: read, merge, write. The user sees the new version in Geena, attributed to your app — and every other connection they granted that document to serves the update on its next read. Skip the write when nothing changed; a no-op version helps nobody.
List the user’s relatives
For manifests with subjects:
Consent to the manifest is what authorizes this enumeration — it exists only per subject of an active connection, filtered to the declared relation, and it is receipted like every listing.
Add a child and fill their details
Upload a file
Propose the label from the filename minus its extension and let the user edit
it. Reading it back: the slot’s record carries a downloadUrl; stream it
server-side — never hand your token to the browser.
Use the connection as a login
The second visit needs no consent screen: an active connection plus a live
login binding makes the ceremony skippable — the user clicks your button,
Geena bounces them straight back with a code, and the token response carries
the same request_id. That round-trip is your passwordless login: no
password, no email code, and revocation in Geena is session revocation with
you. Run the same authorize flow every time; keep
no local credential.
Handle revocation honestly
When the user revokes you in Geena, every serve answers 404/403 and
GET /status reports the state. Poll it (or react to the first refused call),
then:
- drop everything you were not granted
keepfor — the grant to hold it is gone; - flip your UI to its honest empty state (“access ended — reconnect to continue”), not an error page;
- offer the connect button again. A re-connect is a fresh consent, never a resurrection.
Build this state on day one. It is the demo every privacy-conscious customer runs first.