Use Huddle from your own product

Two shapes, one engine. Call the hosted API when your app should start and follow discussions, or embed the engine when the board itself belongs in your interface.

Status: the shape below is final and GET /api/public/v1/status is live. The write endpoints and self-service API keys open with Business — ask for early access.

1. Hosted REST API

One workspace-scoped key per integration. Keys are secret, never expire on their own and can be revoked at any time.

curl https://huddlediscussdecide.com/api/public/v1/huddles \
  -H "Authorization: Bearer hk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "usergroupId": "ug_123",
    "title": "Move the Q4 launch?",
    "intent": "question",
    "opening": "Support says the new pricing page will not be ready. Do we move?",
    "call": { "type": "input", "members": ["cathy", "arthur"] }
  }'
  • POST/api/public/v1/huddles

    Start a huddle: usergroup, title, opening post and intent (question | issue | concern | idea | information).

  • POST/api/public/v1/huddles/{id}/posts

    Add a post. Left untagged it is classified like any other post; you may pass an explicit tag.

  • POST/api/public/v1/huddles/{id}/calls

    Invite people: input | recommend | vote | decide | approve, with the members to call.

  • GET/api/public/v1/huddles/{id}

    Posts, threads, stage, participants and open calls.

  • GET/api/public/v1/huddles/{id}/reading

    The stored AI reading: what is forming, what leads, what is unresolved, who still owes an answer. Never triggers a new AI call.

  • GET/api/public/v1/decisions

    The decision log, filterable by usergroup, huddle or date, for your own records.

  • GET/api/public/v1/status

    Live today: version and the endpoints this workspace exposes.

2. Webhooks

Every event is signed with HMAC-SHA256 over the raw body in X-Huddle-Signature, so your endpoint can verify it came from us before acting on it.

  • huddle.stage_changed

    A huddle moved: initiated → discussing → converging → decided.

  • huddle.decided

    A decision was recorded, with decider, basis and reason.

  • call.fulfilled

    An invitee answered the input, recommendation, vote, decision or approval.

  • post.created

    A new post, including the tag the AI gave it.

{
  "event": "huddle.decided",
  "huddleId": "hd_8a2",
  "decision": { "option": "Move to January 12", "by": "Richard", "basis": "vote" },
  "at": "2026-08-30T10:14:00Z"
}

3. Embedded engine

The Huddle engine ships as a self-contained package: the model, the AI reading, the vocabulary and the board UI, with one adapter you implement against your own storage and your own signed-in user.

import { installHuddleAdapter, Huddle } from "@/huddle";

await installHuddleAdapter({
  load: async () => ({ snapshot, me }),
  save: async (docs) => upsert(docs),
  onError: (message) => toast.error(message),
});

<Huddle group={group} onClose={close} />

Your app keeps its own design tokens; Huddle uses semantic tokens only, so it inherits the host theme. A self-check route validates every step and option after installation.