Your governed knowledge, available to your other AI tools.
A contract-first REST API, signed webhooks, and a hosted MCP server — with the same audience scopes enforced identically across all three. Author once in Cairn, serve your Claude, your Copilot, your Slack bot, your internal agents.
POST /v1/knowledge/search
Authorization: Bearer ath_sk_…
Content-Type: application/json
{
"query": "how do I add a teammate",
"audience": "customer",
"limit": 5
}→ 200 · chunks with source ids, guide refs, step anchors, and freshness metadata. Internal chunks are absent, not filtered — a customer-scoped key never sees them.
01 — Integration surfaces
Six ways in, all built on the same contract.
02 — Contract first
The spec is the source of truth, and the build enforces it.
Which means the documentation cannot quietly drift away from the API you are actually calling.
Read the API reference →A single specification is the source of truth for every HTTP payload. It is not generated from the code as an afterthought — the code is checked against it.
Client types are generated from the spec, and CI fails on drift between the two. If the docs and the API disagree, the build breaks before you find out.
Workspace-scoped API keys, hashed at rest, with audience scope attached to the key. A customer-scoped key cannot reach internal knowledge — that is enforced at retrieval, not by a filter you could bypass.
Write endpoints accept an idempotency key so a retry after a timeout does not create a second guide, contact, or conversation.
Structured problem responses with a machine-readable code, not a prose message you would have to string-match. Rate limits return their reset window.
03 — MCP server
The last mile: your knowledge, governed once, reachable from everywhere.
Most knowledge bases are a dead end — content goes in and only that vendor's chatbot can read it. A hosted MCP server makes the same audience-scoped knowledge available to whatever else your company runs, with the scopes enforced identically rather than reimplemented.
Exposed tools
search_knowledgeAudience-scoped semantic search returning chunks with citations and freshness metadata.
get_guideA full guide with its ordered steps, screenshots and per-step URLs.
list_gapsCurrent ranked gap clusters — useful for wiring the loop into your own planning tools.
request_captureIssue a capture request programmatically when your own systems detect an undocumented flow.
One place to govern
Add an internal runbook once and every connected client respects its audience tag. You are not maintaining a permission model per tool.
Citations travel
Chunks carry source ids and step anchors, so an answer produced by your Claude or your Copilot can cite the guide it came from — the same way ours does.
Revocable per key
Each connection is a scoped key you can revoke without touching the others, and every query is logged against it.
04 — Widget and walkthrough
Under 120KB, and it runs on your customers’ pages — so we treat the budget as a contract.
One snippet, or a JS API if you want to drive it yourself. Identity is HMAC-signed from your backend so the agent knows what the visitor is entitled to see before it answers. The walkthrough runtime is a further chunk under 25KB, loaded only when a walkthrough actually starts.
- Widget bundle
- Under 120KB, static CDN delivery
- Walkthrough runtime
- Under 25KB, loaded on demand
- Identity
- HMAC-SHA256 signed server-side
- Mobile
- Native iOS and Android SDKs
// identify the visitor — hash signed server-side
Cairn.identify({
id: "usr_8f2c",
email: "sofia@northwind.test",
hash: "<hmac-sha256>"
});
// pin a guide to this screen
Cairn.pinGuide("add-a-teammate", {
selector: "[data-test=add-member]"
});
// start a walkthrough at a given step
Cairn.walkthrough("add-a-teammate", {
step: 3
});
// react to what happened
Cairn.on("walkthrough:complete", fn);
Cairn.on("walkthrough:stepFailed", fn);05 — Webhooks
Signed, retried, redeliverable.
The events worth building on are the ones the loop produces — a gap detected, a guide flagged as drifted, a draft ready for review. That is where an integration adds something your team would otherwise do by hand.
knowledge.gap.clusteredA new ranked gap cluster appeared, with its sample questions and estimated value.
guide.drift.flaggedA step stopped resolving and the guide crossed its health threshold — it is now paused as an AI answer source.
article.draft.readyConversation mining assembled a draft from resolved conversations and it is awaiting review.
capture.request.completedSomeone recorded the guide you requested; the cluster is now linked to real content.
conversation.escalatedThe agent handed off to a human, with the retrieval set and confidence score attached.
walkthrough.completedA customer finished a walkthrough end to end — the cleanest self-serve signal available.
credits.threshold.reachedBalance crossed a threshold you set, so you can act before the agent stops answering.
Secrets are hashed at rest. Deliveries are signed, retried with backoff, and redeliverable from the dashboard — so a bad deploy on your side does not silently lose a day of events.
06 — Clients and stack
What you would be integrating with
Clients we ship
- Browser extension
- Manifest V3, Chrome and Edge
- Desktop
- Tauri 2 — Windows and macOS
- Mobile SDKs
- iOS and Android, native
- Widget
- Single snippet or JS API
- Help center
- Server-rendered, your domain
Platform
- Application
- Laravel 13 / PHP 8.5
- Frontend
- Vue 3, TypeScript strict, Tailwind
- Data
- PostgreSQL 16 + pgvector, Redis
- Realtime
- Laravel Reverb websockets
- Domain surface
- 127 models, 431 API routes
Honest limits
The docs are young, and the API is unversioned in practice.
- The developer docs are young. The rendered API reference, the widget guide and the webhook reference are live at docs.cairn.how; long-form integration guides beyond that are not written yet. The OpenAPI specification remains the authoritative contract.
- The API is pre-launch and we have made no backwards-compatibility promise yet. Endpoints are stable in practice, but we will not claim a versioning policy we have not had to honour.
- The OAuth app platform has no public directory and no review process — installs are private today.
- No SDK for the REST API in any language beyond the generated types. If you want a client library, tell us which language and it becomes a real priority rather than a guess.
Get a key and point your own agent at it.
The trial includes API access and the MCP server. If the integration you need is not there, tell us before you build a workaround.