Sviluppa con Praxium.

Componibile per progetto

Collega a Praxium gli strumenti che usi già. API REST, un SDK TypeScript tipizzato e webhook firmati per i flussi di lavoro sanitari.

Parti in 5 minuti

Scegli il tuo percorso. Entrambi portano a un’integrazione API funzionante nella stessa sessione.

Non conosci Praxium

Prova in autonomia

  1. Dati di esempio, già pronti

    Le prove partono con membri del team, clienti e appuntamenti di esempio. Un’azione di ripristino riporta tutto alla base pulita quando vuoi.

  2. Crea un profilo API e una chiave

    Amministrazione → Profili API. Ogni profilo ha la sua chiave HMAC e decide quali tipi di dati e campi personalizzati espone.

  3. Chiama le API

    Usa @praxium/sdk oppure curl verso https://{your-slug}.admin.praxium.nl.

Inizia la prova gratuita
Sei già cliente?

Collegati alla tua organizzazione

  1. Chiedi a chi amministra

    Chi amministra la tua organizzazione può creare un profilo API e condividerne la chiave. Il profilo decide quali campi puoi leggere.

  2. Chiama le API

    Usa @praxium/sdk oppure curl con la chiave che ti viene condivisa.

API REST

  • Percorsi — REST per organizzazione su /api/{tenant-slug}/...
  • Autenticazione — chiave API HMAC in Authorization: Bearer, mai nell’URL
  • Permessi — ogni chiave è legata a un profilo API che definisce quali tipi di dati e campi può leggere
  • Lingue — usa Accept-Language: nl, en oppure ro; una preferenza non supportata usa la lingua predefinita dell’organizzazione.
  • Esplorazione — descritte in OpenAPI, consultabili nell’interfaccia Scalar
  • Osservabilità — ogni chiamata registrata con stato, latenza, profilo e IP (90 giorni di conservazione, visibili in amministrazione)
bash
curl -H "Authorization: Bearer $PRAXIUM_API_KEY" \  https://demo.admin.praxium.nl/api/demo/team
Come funziona l’autenticazione

Le chiavi API sono firmate con HMAC alla creazione: la chiave contiene la propria prova di integrità nel formato praxium_v1_<tenant>_<profile>_<timestamp>_<signature>, dove la firma è derivata lato server con HMAC-SHA256 da un segreto di firma per profilo, conservato cifrato nel database — il segreto non viaggia mai in rete, viaggia solo la firma che produce. Il nome breve dell’organizzazione è legato crittograficamente alla firma, quindi una chiave emessa per l’organizzazione A non può essere riusata sull’organizzazione B senza invalidare la verifica. All’arrivo il server verifica l’integrità della chiave prima di restituire qualsiasi dato, e le chiavi falsificate o riusate ricevono un 403.

Le richieste si autenticano con il consueto Authorization: Bearer <key> su HTTPS — lo stesso schema usato da GitHub, OpenAI, Slack e Notion.

Inoltre ogni chiave appartiene a un solo profilo API, che definisce esattamente quali tipi di dati e campi può leggere. Ogni integrazione tocca solo i dati che le servono — il principio del privilegio minimo, applicato al singolo campo e non all’endpoint. La revoca e la rotazione avvengono per profilo dal portale di amministrazione.

Come funzionano i contenuti tradotti

Invia Accept-Language: nl, Accept-Language: en oppure Accept-Language: ro quando il tuo sito mostra una sola lingua. Le API usano la lingua richiesta solo se l’organizzazione l’ha attivata; altrimenti usano la sua lingua predefinita.

Ogni endpoint mantiene una sola forma di risposta documentata. I campi documentati come tradotti — nomi delle categorie FAQ, domande e risposte, etichette e valori dei campi personalizzati del team — tornano come stringhe. I campi documentati in OpenAPI come mappe di lingue mantengono quella forma.

Per i campi tradotti, una traduzione mancante ricade sul miglior testo pubblicato disponibile invece che su una stringa vuota.

Apri la documentazione API interattiva su /api-docs

Sostituisci {tenant} con il nome breve della tua organizzazione.

Provala

@praxium/sdk

npm install @praxium/sdk
  • Tipi — client TypeScript con completamento automatico per ogni endpoint
  • Autenticazione — chiavi API derivate con HMAC, firmate in automatico, senza codice ripetitivo
  • Lingue — imposta locale su nl, en oppure ro; ogni metodo mantiene un solo tipo di risposta TypeScript
  • Ambienti — Node.js 20+, ambienti Edge, qualsiasi runtime con fetch
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()

Inizia con l’SDK: @praxium/sdk oppure vai a metodi disponibili

Come si autentica l’SDK

L’SDK usa lo stesso modello di autenticazione dell’API REST qui sopra — le stesse chiavi praxium_v1_…, la stessa verifica HMAC lato server, lo stesso 403 per chiavi manomesse o riusate. Quello che l’SDK aggiunge: ricava da solo il nome breve dell’organizzazione dalla chiave (nessuna configurazione a parte), allega Authorization: Bearer <PRAXIUM_API_KEY> a ogni richiesta e offre metodi tipizzati per sede (await client.location('amsterdam').getTeamMembers(), await client.location('amsterdam').getOpeningHours(), …) così non scrivi codice fetch ripetitivo.

La custodia della chiave resta tua: caricala da un gestore di segreti o da una variabile d’ambiente (PRAXIUM_API_KEY è la convenzione, ma il nome lo scegli tu), non metterla mai nel codice sorgente e ruotala dal portale di amministrazione quando cambia il personale o sospetti che sia stata esposta. Le chiavi generate si vedono una volta sola alla creazione — viene conservato solo il loro hash SHA-256, quindi una chiave persa non si recupera (generane una nuova e revoca la vecchia).

Come funzionano i contenuti tradotti nell’SDK

Imposta locale su nl, en oppure ro. L’SDK invia quel valore come Accept-Language a ogni richiesta, e una lingua disattivata per l’organizzazione ricade sulla sua lingua predefinita.

Ogni metodo ha un solo tipo di risposta TypeScript. getFaq() restituisce nomi di categoria, domande e risposte già tradotti; etichette e valori dei campi personalizzati del team seguono la stessa regola. I campi generati come mappe di lingue mantengono la forma documentata e li puoi mostrare con gli strumenti di traduzione della tua applicazione.

Vedi su npm

Webhook

Iscriviti a un tipo di risorsa e a una o più azioni del suo ciclo di vita, con una condizione facoltativa — per esempio: tipo di risorsa = servizio, azione = aggiornato, condizione = la sede contiene Amsterdam.

  • CloudEvents — un ID di occorrenza per riconoscere i tentativi ripetuti, più il tipo e l’ID della risorsa cambiata nel soggetto e nei dati
  • Consegna affidabile — firme HMAC-SHA256 legate al momento dell’invio, tentativi automatici e 90 giorni di registro delle consegne
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"    }  }}

Tutti gli helper e i tipi di evento → documentazione webhook di @praxium/sdk

Come funzionano le firme e come verificarle

Ogni consegna porta una sola intestazione X-Praxium-Signature: t=<unix_ts>,sha256=<hmac_hex>, dove l’HMAC-SHA256 è calcolato lato server su ${timestamp}.${rawBody} con il segreto del singolo webhook. Il segreto condiviso non viaggia mai in rete — viaggia solo il risultato dell’HMAC. La firma prova due cose insieme: che il corpo non è stato alterato durante il trasporto (integrità) e che la chiamata arriva davvero da Praxium e non da chi ha indovinato l’indirizzo del tuo endpoint (autenticità). Tutte le consegne viaggiano su HTTPS — Praxium rifiuta di registrare indirizzi webhook non HTTPS negli ambienti pubblicati.

Chi riceve un webhook deve verificare ogni consegna — Praxium firma e invia, ma il controllo avviene nel tuo gestore. Con @praxium/sdk non scrivi niente di tutto questo a mano: processWebhook() (indipendente dal framework) e createRevalidationHandler() (ISR di Next.js) svolgono i quattro passaggi più la protezione dai rinvii. Devi implementarlo in un altro ambiente? I quattro passaggi sono: (1) leggi il momento e la firma dall’intestazione, (2) rifiuta le consegne più vecchie della tua finestra di rinvio — 5 minuti è lo standard, (3) ricalcola l’HMAC su ${timestamp}.${rawBody} con il tuo segreto condiviso, (4) confronta con un confronto a tempo costante (per esempio crypto.timingSafeEqual su Node).

È lo stesso schema che Stripe usa per le firme dei webhook. I segreti dei singoli webhook si vedono una volta sola — nella risposta che crea il webhook e in ogni risposta di rotazione — e poi non riappaiono. Questa esposizione singola significa che sulla piattaforma non resta una superficie d’attacco durevole per il segreto: nemmeno una sessione di amministrazione compromessa potrebbe rileggerlo. Ne serve uno nuovo? Ruotalo dal portale di amministrazione — il nuovo segreto arriva nella risposta, il precedente perde subito validità e le altre iscrizioni restano intatte.

Modi di integrarsi.

Leggi i dati quando il tuo sito ne ha bisogno. Reagisci ai cambiamenti nel momento in cui avvengono.

Mostra i dati di Praxium sul tuo sito

Il tuo sito legge team, servizi, sedi e FAQ tramite l’SDK. Iscriviti ai loro eventi di ciclo di vita e rigenera la pagina nella lingua giusta appena arriva un evento firmato: niente contenuti vecchi.

Evento sulla risorsa + lettura dati via SDK

Reagisci ai cambiamenti nei tuoi strumenti

Il tuo endpoint riceve un CloudEvent firmato con l’ID di occorrenza e l’ID della risorsa cambiata. Inoltralo a Slack, al tuo CRM, a un data lake o a qualsiasi flusso tu gestisca — Praxium firma e ritenta l’evento di partenza, la reazione la scegli tu.

Webhook in uscita