Sanntid, dypelenker og notifikasjoner
Når noe skjer i Utleggsappen, må riktig person ofte få beskjed og ledes til riktig sted. Denne siden dekker tre ting integrasjoner ofte trenger: lytte på hendelser i sanntid (SSE), bygge dypelenker tilbake til appen, og forstå hvordan notifikasjoner fungerer.
Server-Sent Events (SSE) — lytte på hendelser i sanntid
Bruk SSE når du vil reagere på hendelser i Utleggsappen uten å polle.
Admin-perspektiv: Hvis du er admin og bare vil at organisasjonen din skal kalle en URL når noe skjer (f.eks. når en rapport godkjennes), bruk HTTP-forespørsel-handlingen i Flyt og automatisering i stedet. SSE passer for utviklere som bygger backend som trenger en kontinuerlig hendelsesstrøm.
Endepunkt
GET https://api.utlegg.app/sse/events
Authorization: Bearer ua_... (PAT eller SAT)
Accept: text/event-stream
Response-stream er standard SSE — én linje med data: {...} per event, dobbel newline mellom events. Heartbeats sendes periodisk for å holde forbindelsen åpen.
Filter med scopes
Default får du alle hendelser brukeren/tokenen har tilgang til. Snevre inn med scopes-parameteren (JSON-array, URL-encodet):
SCOPES='[{"resourceType":"report","eventType":"approved"},{"resourceType":"report","eventType":"submitted"}]'
curl -N "https://api.utlegg.app/sse/events?scopes=$(jq -rn --arg s "$SCOPES" '$s|@uri')" \
-H "Authorization: Bearer ua_..." \
-H "Accept: text/event-stream"
Event-skjema
type ClientUiEvent = {
resourceType: 'report' | 'organization' | 'department'
| 'expense' | 'user' | 'account' | 'invoice';
eventType: 'created' | 'updated' | 'deleted'
| 'submitted' | 'approved' | 'rejected'
| 'reviewed' | 'published' | 'stale';
resourceId: string;
timestamp: number; // unix ms
id?: string; // for deduplisering / resume
};
Når du mottar et event, hent fullt objekt fra det relevante REST-endepunktet (GET /reports/{id} osv.) — selve event-payloaden er bevisst tynn.
Eksempel (JS / Node)
const es = new EventSource(
'https://api.utlegg.app/sse/events',
{ headers: { Authorization: `Bearer ${process.env.UA_TOKEN}` } }
);
es.onmessage = (msg) => {
const event = JSON.parse(msg.data);
if (event.resourceType === 'report' && event.eventType === 'approved') {
fetchAndProcessReport(event.resourceId);
}
};
Praktiske hensyn
- Forbindelsen er knyttet til ditt token. Ved token-utløp må klienten reconnecte med ny token.
- Klient bør implementere reconnect med eksponentielt backoff og bruke
event.idtil å droppe duplikater på reconnect. - Hendelser er filtrert per organisasjon og rolle på server-siden — du ser bare det tokenen din har tilgang til.
- For deterministisk levering ved tap av forbindelse, kombiner SSE med periodisk polling av
/reports?updatedAfter=...som backup.
Dypelenker
Bruk dypelenker når du sender brukeren fra ditt system tilbake til Utleggsappen.
Stabile ruter
https://app.utlegg.app/reports/{reportId}
https://app.utlegg.app/inbox/{itemId}
https://app.utlegg.app/{organization_handle}/godkjenning/{reportId}
Mobilappen åpner samme URLer via Universal Links (iOS) og App Links (Android).
Tips
- Bygg lenker rundt objekter og handlinger, ikke skjermnavn — UI-struktur kan endres.
- Samle ruter i én helper i koden din slik at samme format brukes i e-post, push og web.
Notifikasjoner
Brukerne får beskjed gjennom flere kanaler:
- Push (mobilapp) — primær kanal for action-required hendelser
- E-post — sendes som backup eller når brukeren ikke har appen
- Innboks — vedvarende oppgaveliste i appen
- Slack / Teams (organisasjonsnivå) — konfigureres av admin
Som integrator påvirker du ikke notifikasjonene direkte — de utløses av samme hendelser som SSE eksponerer. Vil du sende egne varsler, abonner på SSE og gjør utsendingen i ditt eget system.
Se også
- Flyt og automatisering — for admin-siden av samme behov
- Notifikasjoner og innboks
- API og autentisering