Gegevensbron
Exact Online-verbinding
Eenmalig, door een beheerder met een Exact-login die bij de administratie mag. Het token blijft daarna op de server en wordt automatisch ververst; medewerkers hoeven nooit in te loggen bij Exact.
Geavanceerd
Standaard /api: de Functions van dezelfde Cloudflare Pages-site. Alleen wijzigen als de API elders draait.
Exact Online heeft een REST-API voor abonnementen. Dit loket leest alleen; er wordt niets in Exact gewijzigd. De pagina draait op Cloudflare Pages; de bijbehorende Pages Functions doen de OAuth-uitwisseling met Exact en bewaren het token op de server. TravelSpirit blijft ongewijzigd.
Zo zet je het live
- Exact App Center (apps.exactonline.com → Manage my apps → Register app): een eigen app voor dit loket. Redirect-URI:
https://<jouw-domein>/api/auth/callback. Scope: Sales contracts. Noteer client-ID en client-secret.
- Cloudflare Pages: deploy
public/ met functions/; bind een KV-namespace als EXACT_TOKENS; zet de secrets EXACT_CLIENT_ID, EXACT_CLIENT_SECRET en KEEPALIVE_TOKEN; variabele EXACT_REGION (nl).
- Cloudflare Access: policy op het domein (bijv. alleen e-mailadressen van het bedrijf). Zonder Access kan iedereen met de URL de abonnementen lezen.
- Eenmalig autoriseren: Bron & verbinding → Autoriseren bij Exact Online; log in met een Exact-gebruiker die bij de administratie mag.
- Keepalive: deploy de meegeleverde cron-worker (
keepalive-worker/), die wekelijks /api/keepalive aanroept.
Hoe het token geldig blijft
De Functions bewaren één gedeelde verbinding in KV (sleutel exact:connection): access-token (10 minuten geldig), refresh-token, vervaltijd en wie heeft geautoriseerd. Bij elk gebruik wordt het access-token zo nodig ververst en het nieuwe refresh-token opgeslagen, precies zoals TravelSpirit dat doet voor de boekhoudexport. Zo blijft de verbinding onbeperkt geldig zolang het loket gebruikt wordt. Exact laat een refresh-token vervallen na 30 dagen zonder gebruik; daarom ververst de keepalive-cron wekelijks. De browser krijgt de tokens nooit te zien.
Endpoints die de Functions aanroepen
| Resource | Gebruik |
subscription/Subscriptions | Kop van het abonnement: klant, looptijd, opzegging, facturatie |
subscription/SubscriptionLines | Regels: artikel, aantal, prijs, korting, btw, periode |
subscription/SubscriptionTypes | Condities: factuurperiode, looptijd, verlenging, opzegtermijn |
current/Me, system/Divisions | Naam van de geautoriseerde gebruiker en de beschikbare administraties |
De abonnementen-endpoints vallen in Exact onder de scope Sales contracts.
API van deze site
GET /api/status → { connected, region, me, authorizedAt, redirectUri }
GET /api/auth/start → stuurt door naar de Exact-login (OAuth2 authorization code)
GET /api/auth/callback → wisselt de code om en bewaart het token in KV
POST /api/auth/disconnect → verwijdert het token uit KV
GET /api/keepalive?token=… → ververst als de laatste verversing ouder is dan 7 dagen
GET /api/divisions → { divisions: [{ Code, Description, Current }] }
GET /api/subscriptions?division=1234567&fresh=1
→ { subscriptions: [...], types: [...], fetchedAt, cached }
GET /api/subscription?division=1234567&id=<EntryID>
→ { subscription: {...}, lines: [...] }
Niet geautoriseerd → 401 { "error": "not_authorized", "message": "…" }
Veldnamen en datumnotatie (/Date(…)/) komen onveranderd uit Exact; het loket vertaalt ze zelf.
Grenzen van Exact
- Maximaal 60 aanroepen per minuut en 5.000 per dag per administratie. De Functions cachen de abonnementenlijst 5 minuten; Vernieuwen haalt vers op.
- Toegangstokens zijn 10 minuten geldig; de Functions vernieuwen pas als het nodig is.