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 praktijk 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 of en voor gelokaliseerde tekst, of * voor ondersteunde vertalingen als object (één call, alle ondersteunde talen)
  • 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 meertalige content werkt

Gebruik Accept-Language om de response-vorm te kiezen.

1. Taalspecifieke mode: stuur Accept-Language: nl of Accept-Language: en wanneer je site één taal rendert. Gelokaliseerde tekstvelden komen terug als gewone strings. FAQ-categorienamen, vragen en antwoorden komen bijvoorbeeld terug als strings in de gevraagde taal.

2. Meertalige mode: stuur Accept-Language: * wanneer je alle vertalingen in één response nodig hebt. Velden die deze mode ondersteunen komen terug als vertaalobjecten zoals { nl, en }. Kies de zichtbare waarde met text[locale], de SDK-helper localizeText(text, locale), of je eigen i18n-laag.

Niet-talige velden: ID's, datums, booleans, prijzen, volgorde houden dezelfde vorm in beide modes.

Fallback is ingebouwd waar Praxium een veld naar één string oplost: als de gevraagde vertaling ontbreekt, geeft de API de beste beschikbare gepubliceerde tekst terug in plaats van een lege string. Wanneer je vertaalobjecten ontvangt, bepaal je de display-fallback zelf in je UI.

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 *, afhankelijk van de vertaalvorm die je nodig hebt
  • 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' | '*' (see Multilingual Mode)})
const hours = await client.getOpeningHours()const team = await client.getTeamMembers()const faq = await client.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 methods (await client.getTeamMembers(), await client.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 meertalige content werkt in de SDK

Zet locale om de response-vorm te kiezen. De SDK stuurt die waarde als Accept-Language mee bij elk request.

1. Taalspecifieke mode: zet locale: 'nl' of locale: 'en' wanneer je app één taal rendert. Gelokaliseerde velden komen terug als gewone strings. getFaq() geeft bijvoorbeeld categorienamen, vragen en antwoorden terug als strings in de gevraagde taal.

2. Meertalige mode: zet locale: '*' wanneer je alle vertalingen in één response nodig hebt. Ondersteunde velden komen terug als vertaalobjecten zoals { nl, en }; render die met localizeText(text, locale) of je eigen i18n-helper. FAQ-teksten zijn bijvoorbeeld meertalig in deze mode, en team custom fields gebruiken MultilingualTeamMember[].

localizeText() gebruikt een developer-vriendelijke fallback-keten: gevraagde locale, daarna Engels, daarna de eerste beschikbare waarde, daarna een lege string. Zo blijft render-code klein zonder platform-internals te tonen.

Bekijk op npm

Webhooks

Eén keer abonneren. Wij signen en bezorgen elke entiteit-wijziging.

  • Handtekeningen — HMAC-SHA256, gebonden aan de request-timestamp, geen gedeeld geheim op de wire
  • Secrets — per-webhook roteerbaar, elke subscription heeft zijn eigen signing-key
  • Logging — elke bezorging gelogd met status, latency en consecutive-failure-teller (90 dagen bewaartermijn, zichtbaar op de webhook-detailpagina in admin)
http
POST /your-endpoint
X-Praxium-Signature: t=1742889600,sha256=4f3c8a7b9e2d1c5f6a0b8e7d9c2a5f3b1c8e9a3d2b6f4c7d8e1a3b9f6c2d4e7aContent-Type: application/json
{  "entity": "team"}

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, tarieven en FAQ op via de SDK. Een revalidatie-webhook ververst de pagina zodra er iets verandert in Praxium — geen handmatige updates, geen verouderde inhoud.

Revalidatie-webhook trigger + SDK-data-pull

Reageer op entiteit-wijzigingen in je eigen tools

Jouw webhook-endpoint ontvangt het gesignde wijzigingsevent van Praxium. Vandaaruit stuur je het door naar Slack, je CRM, een datalake of welke pipeline je ook draait — Praxium tekent de bron, jij kiest de bestemmingen.

Outbound webhooks