Desarrolla con Praxium.

Componible por diseño

Conecta a Praxium las herramientas que ya usas. API REST, un SDK de TypeScript tipado y webhooks firmados para flujos de trabajo sanitarios.

Empieza en 5 minutos

Elige tu camino. Los dos llevan a una integración con la API funcionando en la misma sesión.

Aún no conoces Praxium

Prueba por tu cuenta

  1. Datos de ejemplo, ya listos

    Las pruebas empiezan con miembros del equipo, clientes y citas de ejemplo. Una acción de restablecimiento te devuelve a un punto limpio cuando quieras.

  2. Crea un perfil de API y una clave

    Administración → Perfiles de API. Cada perfil tiene su propia clave HMAC y decide qué tipos de datos y campos personalizados expone.

  3. Llama a la API

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

Empieza la prueba gratuita
¿Ya eres cliente?

Conéctate a tu organización

  1. Habla con quien administra

    Quien administra tu organización puede crear un perfil de API y compartir su clave. El perfil decide qué campos puedes leer.

  2. Llama a la API

    Usa @praxium/sdk o curl con la clave que te compartan.

API REST

  • Rutas — REST por organización en /api/{tenant-slug}/...
  • Autenticación — clave de API HMAC en Authorization: Bearer, nunca en la URL
  • Permisos — cada clave va unida a un perfil de API que define qué tipos de datos y campos puede leer
  • Idiomas — usa Accept-Language: nl, en o ro; una preferencia no admitida usa el idioma predeterminado de la organización.
  • Exploración — descritas con OpenAPI, navegables en la interfaz de Scalar
  • Observabilidad — cada llamada se registra con estado, latencia, perfil e IP (90 días de conservación, visibles en administración)
bash
curl -H "Authorization: Bearer $PRAXIUM_API_KEY" \  https://demo.admin.praxium.nl/api/demo/team
Cómo funciona la autenticación

Las claves de API se firman con HMAC al crearlas: la clave lleva su propia prueba de integridad con el formato praxium_v1_<tenant>_<profile>_<timestamp>_<signature>, donde la firma se deriva en el servidor con HMAC-SHA256 a partir de un secreto de firma propio de cada perfil que se guarda cifrado en la base de datos — el secreto nunca viaja por la red, solo viaja la firma que produce. El nombre corto de la organización queda unido criptográficamente a la firma, así que una clave emitida para la organización A no se puede reutilizar en la organización B sin romper la verificación. Al llegar, el servidor comprueba la integridad de la clave antes de devolver ningún dato, y las claves falsificadas o reutilizadas reciben un 403.

Las peticiones se autentican con el habitual Authorization: Bearer <key> sobre HTTPS — el mismo patrón que usan GitHub, OpenAI, Slack y Notion.

Además, cada clave pertenece a un único perfil de API, que define exactamente qué tipos de datos y campos puede leer. Cada integración toca solo los datos que necesita — el principio de mínimo privilegio, aplicado campo a campo y no endpoint a endpoint. La revocación y la rotación se hacen por perfil desde el portal de administración.

Cómo funcionan los contenidos traducidos

Envía Accept-Language: nl, Accept-Language: en o Accept-Language: ro cuando tu sitio muestre un solo idioma. La API usa el idioma pedido solo si la organización lo tiene activado; si no, usa su idioma predeterminado.

Cada endpoint mantiene una sola forma de respuesta documentada. Los campos documentados como traducidos — nombres de categorías de las FAQ, preguntas y respuestas, etiquetas y valores de los campos personalizados del equipo — vuelven como cadenas. Los campos documentados en OpenAPI como mapas de idiomas conservan esa forma.

En los campos traducidos, una traducción que falta cae al mejor texto publicado disponible en lugar de a una cadena vacía.

Abre tu referencia interactiva de la API en /api-docs

Sustituye {tenant} por el nombre corto de tu organización.

Pruébala

@praxium/sdk

npm install @praxium/sdk
  • Tipos — cliente TypeScript con autocompletado para cada endpoint
  • Autenticación — claves de API derivadas con HMAC, firmadas solas, sin código repetido
  • Idiomas — pon locale en nl, en o ro; cada método mantiene un solo tipo de respuesta de TypeScript
  • Entornos — Node.js 20+, entornos Edge, cualquier 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()

Empieza con el SDK: @praxium/sdk o salta a métodos disponibles

Cómo se autentica el SDK

El SDK usa el mismo modelo de autenticación que la API REST de arriba — las mismas claves praxium_v1_…, la misma verificación HMAC en el servidor, el mismo 403 ante claves manipuladas o reutilizadas. Lo que añade el SDK: deduce solo el nombre corto de la organización a partir de la clave (sin configuración aparte), adjunta Authorization: Bearer <PRAXIUM_API_KEY> en cada petición y te da métodos tipados por centro (await client.location('amsterdam').getTeamMembers(), await client.location('amsterdam').getOpeningHours(), …) para que no escribas código fetch repetido.

Guardar la clave sigue siendo cosa tuya: cárgala desde un gestor de secretos o una variable de entorno (PRAXIUM_API_KEY es la convención, pero el nombre lo eliges tú), nunca la subas al control de versiones y rótala desde el portal de administración cuando cambie el personal o sospeches que se ha expuesto. Las claves generadas se muestran una sola vez al crearlas — solo se guarda su hash SHA-256, así que una clave perdida no se recupera (genera una nueva y revoca la anterior).

Cómo funcionan los contenidos traducidos en el SDK

Pon locale en nl, en o ro. El SDK envía ese valor como Accept-Language en cada petición, y un idioma desactivado para la organización cae a su idioma predeterminado.

Cada método tiene un solo tipo de respuesta de TypeScript. getFaq() devuelve nombres de categoría, preguntas y respuestas ya traducidos; las etiquetas y los valores de los campos personalizados del equipo siguen la misma regla. Los campos generados como mapas de idiomas conservan la forma documentada y puedes mostrarlos con las utilidades de traducción de tu aplicación.

Verlo en npm

Webhooks

Suscríbete a un tipo de recurso y a una o varias acciones de su ciclo de vida, con una condición opcional — por ejemplo: tipo de recurso = servicio, acción = actualizado, condición = el centro contiene Ámsterdam.

  • CloudEvents — un identificador de ocurrencia para reconocer reintentos, más el tipo y el identificador del recurso que cambió en el asunto y en los datos
  • Entrega fiable — firmas HMAC-SHA256 unidas al momento del envío, reintentos automáticos y 90 días de registro de entregas
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"    }  }}

Todos los ayudantes y tipos de evento → referencia de webhooks de @praxium/sdk

Cómo funcionan las firmas y cómo verificarlas

Cada entrega lleva una sola cabecera X-Praxium-Signature: t=<unix_ts>,sha256=<hmac_hex>, donde el HMAC-SHA256 se calcula en el servidor sobre ${timestamp}.${rawBody} con el secreto de ese webhook. El secreto compartido nunca viaja por la red — solo viaja el resultado del HMAC. La firma demuestra dos cosas a la vez: que el cuerpo no se alteró por el camino (integridad) y que la llamada viene de verdad de Praxium y no de alguien que adivinó la dirección de tu endpoint (autenticidad). Todas las entregas van por HTTPS — Praxium se niega a registrar direcciones de webhook que no sean HTTPS en los entornos publicados.

Quien recibe un webhook tiene que verificar cada entrega — Praxium firma y envía, pero la comprobación ocurre en tu manejador. Si usas @praxium/sdk no escribes nada de esto a mano: processWebhook() (independiente del framework) y createRevalidationHandler() (ISR de Next.js) hacen los cuatro pasos y además protegen frente a reenvíos. ¿Lo implementas en otro entorno? Los cuatro pasos son: (1) lee el momento y la firma de la cabecera, (2) rechaza las entregas más antiguas que tu ventana de reenvío — 5 minutos es lo habitual, (3) recalcula el HMAC sobre ${timestamp}.${rawBody} con tu secreto compartido, (4) compara con una comparación de tiempo constante (por ejemplo crypto.timingSafeEqual en Node).

Es el mismo esquema que usa Stripe para firmar sus webhooks. Los secretos de cada webhook se muestran una sola vez — en la respuesta que crea el webhook y en cada respuesta de rotación — y después no vuelven a aparecer. Esa exposición única significa que en la plataforma no queda una superficie de ataque duradera para el secreto: ni siquiera una sesión de administración comprometida podría volver a leerlo. ¿Necesitas uno nuevo? Rótalo desde el portal de administración — el secreto nuevo llega en la respuesta, el anterior deja de valer al momento y las demás suscripciones no se tocan.

Formas de integrarse.

Lee los datos cuando tu sitio los necesite. Reacciona a los cambios en cuanto ocurren.

Muestra los datos de Praxium en tu propio sitio

Tu sitio lee equipo, servicios, centros y FAQ a través del SDK. Suscríbete a sus eventos de ciclo de vida y regenera la página del idioma en cuanto llegue un evento firmado: nada de contenido caducado.

Evento del recurso + lectura de datos por SDK

Reacciona a los cambios en tus propias herramientas

Tu endpoint recibe un CloudEvent firmado con su identificador de ocurrencia y el del recurso que cambió. Reenvíalo a Slack, a tu CRM, a un data lake o a cualquier proceso tuyo — Praxium firma y reintenta el evento de origen, la reacción la eliges tú.

Webhooks salientes