Bouw met Praxium.

Composable opgezet

Plug je favoriete tools in Praxium. REST-API's, een typed TypeScript-SDK en gesignde webhooks voor zorgworkflows.

Aan de slag in 5 minuten

Kies je route. Beide leiden tot een werkende API-integratie in dezelfde sessie.

Nieuw bij Praxium

Self-service proefperiode

  1. Aanmelden

    Start een organisatie in minder dan 5 minuten. Geen creditcard nodig.

  2. Voorbeelddata, direct beschikbaar

    Trial-tenants worden vooraf gevuld met voorbeeldmedewerkers, -cliënten en -afspraken. Met een reseed-actie ga je op elk moment terug naar een schone basis.

  3. Maak een API-profiel + sleutel aan

    Beheer → API-profielen. Elk profiel krijgt zijn eigen HMAC-sleutel en bepaalt welke entiteitstypen en custom velden worden blootgesteld.

  4. Roep de API's aan

    Gebruik @praxium/sdk of curl tegen https://{jouw-slug}.admin.praxium.nl.

Start gratis proefperiode
Al klant?

Vraag het je beheerder

  1. Vraag het je beheerder

    Een beheerder in je tenant kan een API-profiel aanmaken en de sleutel delen — het profiel bepaalt welke velden je kunt zien.

  2. Roep de API's aan

    Gebruik @praxium/sdk of curl met de sleutel die je beheerder deelt.

REST API's

  • Routing — tenant-gescopete REST op /api/{tenant-slug}/...
  • Auth — HMAC API-key in Authorization: Bearer, nooit in URL's
  • Rechten — elke sleutel hoort bij een API-profiel dat bepaalt welke entiteitstypen en velden uitleesbaar zijn
  • Talen — gebruik Accept-Language: nl, en of ro; niet-ondersteunde voorkeuren gebruiken de standaardtaal van de tenant.
  • Documentatie — OpenAPI-beschreven, te bekijken in de Scalar-UI
  • Logging — elke API-call gelogd met status, latency, profiel en IP (90 dagen bewaartermijn, zichtbaar in de admin)
bash
curl -H "Authorization: Bearer $PRAXIUM_API_KEY" \  https://demo.admin.praxium.nl/api/demo/team
Hoe authenticatie werkt

API-keys worden bij creatie HMAC-getekend: de sleutel zelf bevat zijn eigen integriteitsbewijs in het formaat praxium_v1_<tenant>_<profile>_<timestamp>_<signature>, waarbij de signature HMAC-SHA256 wordt afgeleid op de server vanuit een per-profiel signing secret dat versleuteld in de database staat — het secret komt nooit op de wire, alleen de signature die het produceert. De tenant-slug is cryptografisch in de signature gebonden, dus een key uitgegeven voor tenant A kan niet worden hergebruikt op tenant B zonder de verificatie te breken. Bij binnenkomst verifieert de server de integriteit van de key end-to-end voordat er data wordt teruggegeven, en vervalste of hergerichte keys worden geweigerd met 403.

Requests authenticeren via de standaard Authorization: Bearer <key> over HTTPS — hetzelfde patroon dat GitHub, OpenAI, Slack en Notion gebruiken.

Daarbovenop is elke sleutel gescoped naar één API-profiel dat precies definieert welke entiteitstypen en velden uitleesbaar zijn. Elke integratie communiceert alleen met de data die strikt nodig is — het principe van least privilege, afgedwongen op veldniveau in plaats van op endpoint-niveau. Intrekken of roteren kan per profiel via de admin-portal.

Hoe gelokaliseerde content werkt

Stuur Accept-Language: nl, Accept-Language: en of Accept-Language: ro wanneer je site één taal rendert. Tenant-API's gebruiken de gevraagde taal alleen wanneer die voor de tenant is ingeschakeld; anders gebruiken ze de standaardtaal van de tenant.

Elk endpoint houdt één gedocumenteerde response-vorm. Velden die als taalspecifiek zijn gedocumenteerd—zoals FAQ-categorienamen, vragen en antwoorden, en labels en waarden van custom fields voor teamleden—komen terug als strings. Velden die in OpenAPI als locale-maps zijn gedocumenteerd, houden die vaste vorm.

Voor taalspecifieke velden valt een ontbrekende vertaling terug op de beste beschikbare gepubliceerde tekst in plaats van een lege string.

Open je interactieve API-referentie op /api-docs

Vervang {tenant} door je eigen tenant-slug.

Probeer het uit

@praxium/sdk

npm install @praxium/sdk
  • Types — TypeScript-client met autocomplete voor elk endpoint
  • Auth — HMAC-afgeleide API-keys automatisch ondertekend, geen boilerplate
  • Talen — zet locale op nl, en of ro; elke methode houdt één TypeScript-responsetype
  • Runtime — Node.js 20+, Edge-runtimes, elke fetch-capabele omgeving
ts
import { createPraxiumClient } from '@praxium/sdk'
const client = createPraxiumClient({  baseUrl: process.env.PRAXIUM_API_URL!,  apiKey: process.env.PRAXIUM_API_KEY!,  locale: 'nl',  // 'nl' | 'en' | 'ro'})
const location = client.location('amsterdam')const hours = await location.getOpeningHours()const team = await location.getTeamMembers()const faq = await location.getFaq()

Aan de slag met de SDK: @praxium/sdk of ga direct naar de beschikbare methods

Hoe de SDK authenticeert

De SDK gebruikt hetzelfde auth-model als de REST-API hierboven — dezelfde praxium_v1_…-keys, dezelfde server-side HMAC-verificatie, dezelfde 403 bij gemanipuleerde of hergerichte keys. Wat de SDK daar bovenop toevoegt: hij leidt de tenant-slug automatisch af uit de key (geen aparte configuratie), zet Authorization: Bearer <PRAXIUM_API_KEY> bij elk request, en biedt typed locatie-methods (await client.location('amsterdam').getTeamMembers(), await client.location('amsterdam').getOpeningHours(), …) zodat je geen fetch-boilerplate hoeft te schrijven.

Key-opslag blijft jouw verantwoordelijkheid: laad hem op runtime uit een secrets manager of env var (PRAXIUM_API_KEY is de conventie, maar de naam kies je zelf), commit hem nooit in source control, en roteer via de admin-portal bij personeelsverloop of als de key mogelijk is gelekt. Gegenereerde keys worden één keer getoond bij aanmaak — alleen hun SHA-256 hash wordt opgeslagen, dus een verloren key is niet meer ophaalbaar (genereer een nieuwe en trek de oude in).

Hoe gelokaliseerde content werkt in de SDK

Zet locale op nl, en of ro. De SDK stuurt die waarde als Accept-Language mee bij elk request; een taal die voor de tenant is uitgeschakeld valt terug op de standaardtaal van de tenant.

Elke methode heeft één TypeScript-responsetype. getFaq() geeft taalspecifieke categorienamen, vragen en antwoorden terug; labels en waarden van custom fields voor teamleden worden op dezelfde manier opgelost. Velden die als locale-maps zijn gegenereerd, houden die gedocumenteerde vorm en kunnen met de i18n-hulpmiddelen van je applicatie worden gerenderd.

Bekijk op npm

Webhooks

Abonneer je op één resourcetype en één of meer lifecycle-acties, met een optionele resourcespecifieke voorwaarde, bijvoorbeeld: resourcetype = service, lifecycle-actie = updated, voorwaarde = Locatie bevat IJFysio.

  • CloudEvents — een gebeurtenis-ID voor deduplicatie van retries en het gewijzigde resourcetype en -ID in subject en data
  • Duurzame bezorging — tijdgebonden HMAC-SHA256-handtekeningen, automatische retries en bezorglogs met 90 dagen bewaartermijn
http
POST /your-endpoint
X-Praxium-Signature: t=1784023200,sha256=<64-character-hex-digest>Content-Type: application/cloudevents+json
{  "specversion": "1.0",  "id": "019f60d2-3c47-7bb1-816f-458b53f520b5",  "type": "service.updated",  "source": "urn:praxium:tenant:019f5b62-21fa-7b40-88ee-9be2d71da2a1",  "subject": "service/019f5c7e-87f6-7449-9138-b0bc38d5bc65",  "time": "2026-07-14T12:00:00.000Z",  "data": {    "resource": {      "type": "service",      "id": "019f5c7e-87f6-7449-9138-b0bc38d5bc65"    }  }}

Alle webhook-helpers en event-types → @praxium/sdk webhooks-referentie

Hoe signatures werken en hoe je ze verifieert

Elke bezorging bevat één header X-Praxium-Signature: t=<unix_ts>,sha256=<hmac_hex>, waarbij de HMAC-SHA256 op de server wordt berekend over ${timestamp}.${rawBody} met het per-webhook secret. Het gedeelde secret komt nooit op de wire — alleen de HMAC-output gaat over de lijn. De signature bewijst twee dingen tegelijk: de body is niet gemanipuleerd onderweg (integriteit), en de aanroep komt daadwerkelijk van Praxium en niet van een aanvaller die jouw endpoint-URL heeft geraden (authenticiteit). Alle bezorgingen gaan over HTTPS — Praxium accepteert geen webhook-URL's zonder HTTPS in deployed-omgevingen.

Als webhook-ontvanger ben je verantwoordelijk voor het verifiëren van elke bezorging — Praxium tekent en bezorgt, maar de handhaving gebeurt in jouw handler. Gebruik je @praxium/sdk, dan hoef je hier niets van met de hand te schrijven: processWebhook() (framework-agnostic) en createRevalidationHandler() (Next.js ISR) bakken alle vier stappen plus replay-protection in. Hand-implementeren in een andere runtime? De vier stappen zijn: (1) parse timestamp en signature uit de header, (2) wijs bezorgingen ouder dan je replay-window af — 5 minuten is de standaard, (3) bereken de HMAC opnieuw over ${timestamp}.${rawBody} met je eigen secret, (4) vergelijk met constant-time comparison (bijv. crypto.timingSafeEqual op Node).

Dit is hetzelfde schema dat Stripe gebruikt voor webhook-signatures. Per-webhook secrets worden precies één keer teruggegeven — in de response bij het aanmaken van de webhook en in de response bij elke rotatie — en verschijnen daarna nergens meer. Dat eenmalige tonen betekent dat het secret aan onze kant geen langdurig aanvalsoppervlak is: zelfs een gecompromitteerde admin-sessie kan het niet meer ophalen. Nieuwe nodig? Roteer vanuit de admin-portal — het nieuwe secret komt in de rotatie-response, het vorige wordt direct ongeldig, en andere subscriptions blijven ongemoeid.

Integratiepatronen.

Pull data wanneer je site het nodig heeft. Reageer op wijzigingen op het moment dat ze gebeuren.

Toon Praxium-data op je eigen site

Je site haalt medewerkers, diensten, locaties en FAQ op via de SDK. Abonneer je op hun expliciete lifecycle-events en invalideer de locale-layout zodra een gesigneerd event aankomt — geen paginalijst en geen verouderde inhoud.

Resource-event + SDK-data-pull

Reageer op entiteit-wijzigingen in je eigen tools

Jouw webhook-endpoint ontvangt een gesigneerd CloudEvent met het gebeurtenis-ID en het gewijzigde resource-ID. Stuur het door naar Slack, je CRM, een datalake of een andere pipeline — Praxium signeert en probeert het bronevent opnieuw, jij kiest de reactie.

Outbound webhooks