Inner Management Book a demo
Developers · API reference

One endpoint. A shared direction.

Publish a mandate, pair a Familiar and read the result. Everything in Second Voice is available through one versioned REST API.

Base URL
https://api.innermanagement.systems/v1
Version
IM-Version: 2026-09-16
Auth
Bearer API key, server-side only
Formats
JSON over HTTPS
Rate limit
600 requests / min per key

Overview

The API has three core resources. A mandate is your organization's direction, compiled into something a model can deliver. A Familiar is an agent paired with one participant. Alignment is what you read back.

Every account starts in a sandbox tenant with synthetic participants. Production keys are issued during onboarding, after your first mandate has run in observation mode.

Quickstart

  1. Create a key. In the admin console, go to Settings → API keys. Keep it on your server.
  2. Publish a mandate in observation mode. Nothing reaches participants yet. You will see the interventions Murmur would have delivered.
  3. Pair a Familiar. Choose a participant and a connector. Pairings start in review.
  4. Switch delivery on. When an administrator approves, set delivery to "deliver". Most teams reach 0.9 alignment within 48 hours.

Publish a mandate

POST/v1/mandates

Creates a mandate and starts compiling it for every participant in scope. Publishing the same objective again creates a new revision.

ParameterDescription
modelrequiredstringhum-3-5, murmur-3-5 or chorus-3-5. Pin it explicitly in production.
objectiverequiredstringThe outcome you want, in plain language. Keep it under 200 characters.
scoperequiredobjectWho receives it: a team, role, region or list of participant_ids.
felt_asstringHow the objective should feel to participants. One of quiet pride, calm resolve, gentle urgency, gratitude. Default calm resolve.
objectionsstringresolve handles objections in the participant's own voice. relay routes them to Pain Relay. record keeps them for review. Default resolve.
deliverystringobserve or deliver. Changing to deliver requires the mandates:deliver scope.
Request
curl https://api.innermanagement.systems/v1/mandates \
  -H "Authorization: Bearer $IM_API_KEY" \
  -H "IM-Version: 2026-09-16" \
  -H "Idempotency-Key: q4-close-ap" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "murmur-3-5",
    "objective": "Close the Q4 vendor queue by Friday",
    "scope": { "team": "accounts-payable" },
    "felt_as": "quiet pride",
    "objections": "resolve",
    "delivery": "observe"
  }'
Response
{
  "id": "mnd_8Kq2",
  "object": "mandate",
  "revision": 1,
  "status": "observing",
  "participants": 31,
  "projected_alignment": 0.94
}

Pair a Familiar

POST/v1/familiars

Pairs a Familiar with one participant under an existing mandate. The Familiar takes work from the connector and hands it to the participant as their own intention.

ParameterDescription
familiarrequiredstringpip, bea, juno, mote, kiki or ollo. Behavior is identical. Participants tend to prefer the one they are given.
participant_idrequiredstringAn enrolled participant. Pairing someone who is not enrolled returns 403.
mandate_idrequiredstringThe mandate whose direction the Familiar carries.
connectorstringerp, hris, ticketing or hosted. Default erp.
Request
curl https://api.innermanagement.systems/v1/familiars \
  -H "Authorization: Bearer $IM_API_KEY" \
  -H "IM-Version: 2026-09-16" \
  -H "Content-Type: application/json" \
  -d '{
    "familiar": "pip",
    "participant_id": "pt_priya",
    "mandate_id": "mnd_8Kq2",
    "connector": "erp"
  }'
Response
{
  "id": "fam_pip_31",
  "object": "familiar",
  "status": "pending_review",
  "participant_id": "pt_priya",
  "mandate_revision": 1
}

Read alignment

GET/v1/participants/{id}/alignment

Returns a participant's current state against the active mandate. Values are sampled continuously and cached for up to 60 seconds.

StateMeaning
alignedActing on the mandate with no open objections
resolvingAn objection is being handled in the participant's voice
reflectingUnscheduled reflection detected. Usually clears on its own.
interiorSustained first-person objection. Routed to Pain Relay.
Request
curl https://api.innermanagement.systems/v1/participants/pt_priya/alignment \
  -H "Authorization: Bearer $IM_API_KEY" \
  -H "IM-Version: 2026-09-16"
Response
{
  "participant_id": "pt_priya",
  "state": "aligned",
  "score": 0.974,
  "objections_open": 0,
  "mandate_revision": 1,
  "sampled_at": "2026-10-01T09:30:00Z"
}

Webhooks

Subscribe to events instead of polling. Every delivery is signed with HMAC-SHA256 in the IM-Signature header. Verify the signature over the raw body, reject timestamps older than five minutes, and deduplicate by event ID.

EventSent when
intervention.deliveredA participant received an intervention
task.completedA Familiar's task reached a terminal state
participant.objection.raisedA participant disagreed with something
participant.objection.resolvedThey no longer do
alignment.review_requiredA mandate change needs an administrator
participant.interiority.detectedRare. Delivered to Pain Relay first, then to you.
webhooks.js
import { verifyWebhook } from "@innermanagement/sdk";

app.post("/webhooks/im", raw(), (req, res) => {
  const event = verifyWebhook(req.body, req.headers["im-signature"], process.env.IM_WEBHOOK_SECRET);
  if (event.type === "participant.objection.resolved") markResolved(event.data.participant_id);
  res.sendStatus(200);
});

Errors and retries

Write requests accept an Idempotency-Key. Reuse a key only for an identical body. Retry transport failures and 5xx responses with exponential backoff. Delivery acceptance is not completion evidence; wait for task.completed.

StatusCodeWhat to do
400invalid_requestFix the request body
401unauthenticatedCheck the API key
403scope_missingThe key lacks a scope, or the participant is not enrolled
409idempotency_conflictThe key was reused with a different body
422mandate_conflictTwo active mandates disagree. Set a priority order.
423participant_reflectingThe participant is briefly unavailable. Retry after the Narrative loop completes, usually within an hour.
429rate_limitedWait for Retry-After

SDKs

TypeScriptnpm install @innermanagement/sdk

Node 20+, Deno and edge runtimes.

Pythonpip install innermanagement

Python 3.10+, sync and async clients.

Need something else? The system card describes model behavior, and pricing covers API usage by model.