Plenura (plenura.redbroomsoftware.com)
Wellness and therapy platform — therapist discovery, session booking, AI-assisted client matching and session notes, practice management, and earnings withdrawal.
URL: https://plenura.redbroomsoftware.comStatus: LIVE Tier: T2 (vertical SaaS primitive)
T1 apps are indispensable horizontal primitives. T2 apps are vertical SaaS or single-domain primitives — primitive-like in their domain but not universal dependencies.
What you can integrate
- Appointment lifecycle — receive
appointment.completedwhen a therapy session is marked fulfilled; use for billing, CRM enrichment, or loyalty flows - Cancellation events —
booking.cancelledfires when a client or therapist cancels a scheduled appointment - AI therapist matching —
/api/ai/matchreturns a ranked list of therapists for a client profile using semantic search - Practice management — create practices, invite therapists, and manage team access programmatically
- Subscription lifecycle — Plenura gates features by Camino subscription tier; the full event set is consumed for graceful upgrades, downgrades, and expirations
Authentication
Authorization: Bearer <api_key>
Content-Type: application/jsonUser identity flows through Camino SSO. Per-practice API keys are issued from the Plenura admin console. Consumer-facing booking uses session tokens scoped to the client profile.
Endpoints
| Method | Path |
|---|---|
| POST | /api/ai/chat |
| POST | /api/ai/match |
| POST | /api/ai/review-summary |
| POST | /api/ai/search |
| POST | /api/ai/session-notes |
| POST | /api/ai/support-chat |
| POST | /api/ecosystem/register |
| POST | /api/ecosystem/upsell-track |
| GET, POST | /api/ecosystem/webhooks |
| GET | /api/insights/:therapistId |
32 total — 8 admin/cron/internal (hidden) — +14 more primary endpoints not shown. Source: src/routes/api/**/+server.{ts,js} in the plenura-web repo.
Events emitted
| Event | Receivers | Description |
|---|---|---|
ai.usage | colectiva | AI token usage report for metering |
appointment.completed | colectiva, camino | A therapy or veterinary appointment has been completed and paid |
booking.cancelled | colectiva | A booking has been cancelled. PD-115 (S178-inverse fingerprint): goodbay added as sender — Colectiva's handleBookingCancelled handler at /api/ecosystem/webhooks/+server.js:960 was wired end-to-end but no goodbay producer fired the event, surfacing as a dormant emitter in the S327 audit. Goodbay emits from /api/bookings/[id]/+server.ts after the cancel batch commits. |
booking.created | colectiva | A new booking was created in a hospitality or pet-care app — Colectiva records it for revenue tracking and occupancy analytics. |
upsell.appointment_capacity | camino | Plenura free-tier therapist has hit or is approaching their monthly booking limit (5/month). Camino surfaces a Plenura Pro upgrade recommendation. |
Events consumed
| Event | Senders | Description |
|---|---|---|
cfdi.cancelled | constanza | A CFDI invoice has been cancelled |
cfdi.stamped | constanza | A CFDI invoice has been stamped by the SAT via Constanza — receiver apps attach the UUID to their local invoice record and update status. |
employee.missing_data | constanza | Constanza detected an employee with missing fiscal data (RFC/CURP/etc.) — routed back to the source app that created the employee so the missing fields can be completed. |
invoice.compliance_issue | constanza | Constanza detected an invoice compliance issue (missing/invalid RFC, duplicate, format error) — routed back to the source app for review. |
payment.status_changed | colectiva | [auto-derived] payment.status_changed event |
subscription.activated | camino, colectiva | A subscription plan has been activated for a tenant — all apps that gate features behind the subscription tier update their local tier state. |
subscription.cancelled | camino, colectiva | A subscription has been cancelled — all apps that gate features behind the subscription tier update their local tier state to free/cancelled. |
subscription.changed | camino | A subscription plan has been upgraded or downgraded — receiver apps update their tier gates and feature access accordingly. |
subscription.expired | camino | A subscription has expired (end of billing period, no renewal) |
subscription.past_due | camino | A tenant's subscription entered past_due state after a failed renewal — Camino dunning flow pauses feature access without cancelling. Receiver apps mark memberships or subscriptions past_due until payment is received. |
subscription.payment_failed | camino, colectiva | A subscription payment attempt failed — receiver apps surface a payment-failed banner to the tenant operator and may restrict feature access. |
subscription.pending_cancellation | camino | A subscription cancellation was scheduled for the end of the current billing period — receiver apps surface a notice that the subscription will end soon. |
subscription.renewed | camino, colectiva | A subscription was successfully renewed for a new billing period — receiver apps update the subscription period end date and resume any paused features. |
subscription.trial_expiring | camino | A trial subscription is expiring soon — receiver apps surface an upgrade prompt to the tenant operator. |
subscription.trial_started | camino | A trial subscription was started — receiver apps activate trial-tier features for the new tenant. |
Webhook signature
Standard ecosystem HMAC-SHA256 over the raw body with a 5-minute timestamp window. See Webhooks.
OpenAPI
Coming in the OpenAPI generator phase — see /reference/openapi.
SDK
See /sdk/ for @r-bsoftware/ecosystem-sdk helpers.
Gotchas
- Practice isolation uses
plenura_therapist_{id}as the tenant pattern — the tenant key is keyed to the lead therapist, not the practice entity. Queries are always scoped through this key. appointment.completedandbooking.cancelledboth feed into Colectiva for earnings metering. Ensure your adapter handles both events if you are building a billing summary.- AI endpoints (
/api/ai/*) emitai.usageevents that feed into Colectiva for per-token billing. Do not call these in loops without rate-limiting on your side.