The institutional ledger, programmable.
A versioned REST API, an OpenAPI 3.1 schema, signed webhooks, and OAuth Slack and Teams apps — all reading from the same higher-ed-grounded source of truth your auditors, finance team, and CISO already trust.
Four developer surfaces. One source of truth.
Public REST API
Read assets, people, sites, and the caller's session. Cursor-paginated, bearer-authed, tenant-scoped server-side.
Signed webhooks
Outbound events for assets, tickets, MDM and Stripe. HMAC-signed, replay-protected, idempotent by event id.
Slack & Teams apps
Native Habeo Copilot apps for Slack and Microsoft Teams — installed by your workspace admin, not your engineering team.
Punchout receiver
cXML 1.2.014 PunchOutOrderMessage receiver for procurement integrations (CDW, Connection, SHI, etc.).
From zero to your first row.
Get a Clerk session token, point curl at /api/v1/me, and you're in.
Reads you can call. Receivers we listen on.
Mutating the ledger from third-party code is reserved for write-aware integrations (MDM sync, ITSM bridges, punchout). New write endpoints land here when the audit posture is ready.
Signed in, signed out, idempotent by id.
Every webhook payload carries an HMAC signature and a stable event id so your handler can verify provenance and dedupe replays.
The contract
- HTTPS POSTJSON body, UTF-8.
- X-Habeo-SignatureHMAC-SHA256 of the raw body using your endpoint secret.
- X-Habeo-Event-IdStable UUID — dedupe on this if you see a retry.
- X-Habeo-Delivery-AttemptInteger; 1 on first delivery, increments on retry.
- Retry policyExponential backoff up to 24h on any non-2xx response.
Verifying a signature
import { createHmac, timingSafeEqual } from "node:crypto";
export function verify(rawBody: string, sig: string, secret: string) {
const mac = createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(mac);
const b = Buffer.from(sig);
return a.length === b.length && timingSafeEqual(a, b);
}Endpoint secrets are generated from /admin/integrations and rotated without downtime via the two-secret window.
An API your CISO will sign off on.
Higher-ed IT lives or dies by the audit trail. The Habeo API was built to be auditable on day one — not retrofitted with logging when the first SOC 2 came around.
Same audit log as the UI.
Every API write and confirmed webhook delivery lands in the same immutable ledger that backs the in-product audit page. One place to look for SOC 2 and HECVAT review.
Tenant-scoped at the row level.
Tenancy is enforced server-side, not by your client. A token for org A cannot read org B's rows even if you guess the id.
College-unit RBAC, on the API.
The same unit scope that gates the UI gates the API. A Westmark-scoped token only ever sees Westmark rows — including from /api/v1/assets.
Clerk-issued JWTs.
No long-lived plaintext keys. Tokens are Clerk session JWTs (the same the mobile app uses) — revocable, rotatable, and bound to a real user.
OpenAPI 3.1, codegen-ready.
/api/v1/openapi.json is the source of truth — pull it into openapi-typescript, openapi-generator, Postman, or whatever your team already uses.
Stable v1 contract.
v1 is frozen and additive-only. Breaking changes ship under /api/v2 and run alongside v1 for at least 12 months.
Developers, answered.
The questions we hear from every integration team in the first week. Answered briefly, with the technical detail your platform engineer will ask for next.
How do I authenticate?
Is there a sandbox?
What's the rate limit?
Do you have client SDKs?
How do webhook secrets work?
Can I write to the ledger via the API?
Pull the schema. Ship the integration.
OpenAPI 3.1 at /api/v1/openapi.json, interactive reference at /api/v1/docs. Bring questions to the demo and we'll wire your sandbox up live.