Reference
API reference
The Machinaut control-plane HTTP API, grouped by area. Every route carries an honest status — shipped, beta, or planned — and its auth. It mirrors the endpoint map the control plane serves at its own GET / root, so it tracks what's actually running.
Statuses are honest — and some surfaces are planned, not live
null). The always-current per-capability state is the roadmap, and the live console is the source of truth.Authentication
Four ways a request is authenticated. A bearer token is checked first; a session cookie is the browser fallback.
- Bearer — a machine API token (
mk_…), project- or tenant-scoped, minted underPOST /v1/tokens. Sent asAuthorization: Bearer …orx-api-key. This is what the shipper and the approval proxy use. - Session — a browser session cookie (
mc_session) from signup / login. Many routes are session-only (tokens, org, identity, the Fleet map, the sample sandbox, share management): a machine credential — even a leaked one — can’t reach them. Session · owner additionally re-checks a live owner membership on every call, so a deprovisioned owner loses access immediately. - SCIM bearer — a separate provisioning credential (
scim_…), minted per org and stored only as a hash. It authenticates your IdP against/scim/v2/…and nothing else — it cannot read sessions, chains, or approvals. - Public — no auth: the ops probes, the OIDC start/callback, and a shared session’s public read. Internal marks probes not exposed through the Ingress at all.
# Machine callers (shipper, approval proxy) — checked first
Authorization: Bearer mk_live_… # or: x-api-key: mk_live_…
# Browser callers (the explorer) — a session cookie from signup/login
Cookie: mc_session=…Endpoints
Grouped by area. :param segments are path parameters; a GET | PUT cell means the same path serves both verbs.
Health & ops
Unauthenticated operational probes. Readiness and metrics are internal — never routed through the Ingress.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /healthz | Liveness — the process is up. | Shipped | Public |
GET /readyz | Readiness — 200 when the backing store is reachable, 503 when not. | Shipped | Internal |
GET /metrics | Prometheus metrics — request counts + latency. | Shipped | Internal |
Ingest
The session_ship@1 receiver — full wire format in the ingest contract.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
POST /v1/events | Ingest a shipped session (NDJSON manifest + records). | Shipped | Bearer |
Explorer & sessions
Read the hosted chain — projects, sessions, and a session’s six-stage projection + report.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/projects | List a tenant's projects. | Shipped | Bearer / session |
GET /v1/projects/:project_id/sessions | List a project's sessions. | Shipped | Bearer / session |
GET /v1/projects/:project_id/sessions/:session_id | A session’s chain projection + report. | Shipped | Bearer / session |
Calibration
OSS-computed ECE / Brier, charted per session and rolled up per fleet.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/projects/:project_id/calibration | Fleet calibration — the latest pass per session. | Beta | Bearer / session |
GET /v1/projects/:project_id/sessions/:session_id/calibration | Session calibration passes. | Beta | Bearer / session |
Sentinels
The agent SIEM — OSS-raised sentinel alerts, hosted and rolled up.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/projects/:project_id/sentinels | Fleet sentinel rollup across sessions. | Beta | Bearer / session |
GET /v1/projects/:project_id/sessions/:session_id/sentinels | Session sentinel alerts. | Beta | Bearer / session |
Fleet, overview & audit
Rollups the single-operator OSS viewer can’t give. /v1/overview and /v1/audit are scoped to one org; /v1/fleet (new in v0.3.0) is the multi-org lens — it spans the orgs you are already a member of, and adds no reach beyond that.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/overview | Org overview — sessions/day, held rate, calibration health, sentinel feed, top agents. | Beta | Bearer / session |
GET /v1/audit | Audit log — approve/deny/run/block decisions with retained proof; ?format=csv|ndjson to export. | Beta | Bearer / session |
GET /v1/fleet | The multi-org health map — per-org rollup, worst-first agent table, and a 14-day activity chart across every Team/Enterprise org you govern. Session-only by design: an API token is single-tenant, so a machine credential structurally cannot make the cross-org read. Free orgs are returned in excludedOrgs rather than a 402. Reports spend and drift as null — neither is built. | Beta | Session |
Policies
Read the active signed policy and edit the unsigned draft. The cloud never signs — you sign and deploy locally.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/policies | Active (signed) policy snapshot, read-only. | Beta | Bearer / session |
GET | PUT /v1/policies/draft | The team’s unsigned working draft. | Beta | Bearer / session |
POST /v1/policies/draft/impact | Indicative flip simulation (best-effort; the authoritative dry-run is local). | Beta | Bearer / session |
GET /v1/policies/draft/export | Export the draft as unsigned canonical Policy JSON to sign + deploy. | Beta | Bearer / session |
Approvals
The relay (announce / fetch / consume) and the write-path (inbox / resolve) — full semantics in the approval relay contract.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
POST /v1/approvals | announce — park a hold (bare ApprovalRequest or wrapper). | Beta | Bearer |
POST /v1/approvals/:project_id | announce with project in the path. | Beta | Bearer |
GET /v1/approvals/inbox | Approval inbox — held actions with status + resolution summary. | Beta | Bearer / session |
POST /v1/approvals/:project_id/:request_id/resolve | Record a signed Approve / Deny. | Beta | Bearer / session |
GET /v1/approvals/:project_id/:request_id | fetch — the untrusted ApprovalResolution, or 404. | Beta | Bearer |
DELETE /v1/approvals/:project_id/:request_id | consume — spend the resolution (tombstoned). | Beta | Bearer |
Auth
Email + password, plus OIDC SSO in beta (v0.3.0) — a deployment must have a secret-encryption key configured before an SSO connection can be stored, so a self-host without one reports SSO as unconfigured. SAML, magic-link, and password reset are planned, not shipped.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
POST /v1/auth/signup | Email + password signup → session cookie. | Shipped | Public |
POST /v1/auth/login | Email + password login → session cookie. | Shipped | Public |
POST /v1/auth/logout | End the session ({ all: true } = everywhere) and clear the cookie. | Shipped | Session |
POST /v1/auth/switch-org | Switch the active org for a multi-org user → the me payload for the new org. | Shipped | Session |
GET /v1/auth/me | Current user + org. | Shipped | Session |
API tokens
Mint and revoke the machine tokens that authenticate ingest and the relay. Session-only — a leaked machine key must never mint another.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/tokens | List the tenant's API tokens. | Shipped | Session |
POST /v1/tokens | Mint a project/tenant API token — secret shown once. | Shipped | Session |
DELETE /v1/tokens/:id | Revoke an API token. | Shipped | Session |
Org & team
Members, roles, and invites. Invites are copy-able capability links — no email is sent (email transport is planned). Session-only; role/invite changes are owner-only.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/org/members | Org roster — members + roles. | Beta | Session |
PATCH /v1/org/members/:id | Change a member's role (owner | member). | Beta | Session · owner |
DELETE /v1/org/members/:id | Remove a member. | Beta | Session · owner |
POST /v1/org/invites | Invite a teammate → a copy-able link, no email sent. | Beta | Session · owner |
GET /v1/org/invites | Pending invites with their links. | Beta | Session · owner |
DELETE /v1/org/invites/:id | Revoke a pending invite. | Beta | Session · owner |
GET /v1/org/invites/lookup/:token | Preview an invite before accepting. | Beta | Session |
POST /v1/org/invites/accept | Redeem an invite — email-bound. | Beta | Session |
GET /v1/org/audit | Append-only admin audit log — member add/remove and role changes, with actor, before/after and request-id. | Beta | Session · owner |
GET /v1/org/settings | Governance settings — enforce-SSO, the org’s plan and unlocked capabilities, and the key-custody default. Custody reads customer_held at every tier. | Beta | Session · owner |
PATCH /v1/org/settings | Toggle enforce-SSO (Team+). Selecting managed key custody is refused with 409 custody_managed_unavailable — the selector is surfaced, but managed custody is planned, not built, and customer-held stays in force. | Beta | Session · owner |
GET /v1/org/seats | The billable-identity contract — live memberships vs pending invites vs deactivated, plus the org’s plan. No metering or billing is wired up yet. | Beta | Session · owner |
Single sign-on (OIDC)
New in v0.3.0. SSO governs who may sign in, never who may sign — an SSO-granted owner holds console authority, not signing authority, because approver keys stay customer-held. The IdP client secret is sealed at rest (AES-256-GCM), so a deployment without a secret-encryption key configured reports SSO as unconfigured rather than storing it in the clear. SAML is planned, not built.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/org/sso | The org’s OIDC connection (the client secret is never returned) plus the SP callback URL to register at your IdP. | Beta | Session · owner |
POST /v1/org/sso | Configure the OIDC connection — discovery URL, client id/secret, and IdP group → role mapping. Requires the Team plan. | Beta | Session · owner |
PATCH /v1/org/sso | Edit the connection — rotate the client secret or change the group → role map. | Beta | Session · owner |
DELETE /v1/org/sso | Disable the org’s OIDC connection. | Beta | Session · owner |
GET /sso/:org_id/oidc/start | SP-initiated login → redirect to the IdP. ?mode=test previews the decoded claims and the role you’d get without minting a session. | Beta | Public |
GET /sso/:org_id/oidc/callback | The OIDC redirect URI — validates state/nonce, verifies the id_token, JIT-provisions the user, and mints an SSO session. | Beta | Public |
SCIM 2.0 provisioning
New in v0.3.0. Your directory keeps the org roster in sync. Deprovisioning a leaver kills their console sessions and revokes their personal API tokens — but it cannot rotate a customer-held approver key; that stays a customer-side operation. Minting a token requires the Enterprise plan and a live SSO connection.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/org/scim/tokens | List the org’s SCIM bearer tokens. | Beta | Session · owner |
POST /v1/org/scim/tokens | Mint a SCIM bearer — shown once, stored only as a SHA-256 hash. Requires the Enterprise plan. | Beta | Session · owner |
POST /v1/org/scim/tokens/:id/rotate | Rotate a SCIM token — mints a successor while the old one stays valid for an overlap window. | Beta | Session · owner |
DELETE /v1/org/scim/tokens/:id | Revoke a SCIM token. | Beta | Session · owner |
GET|POST|PUT|PATCH|DELETE /scim/v2/Users… | The SCIM 2.0 user endpoints your IdP drives (plus /scim/v2/ServiceProviderConfig). Setting active: false deprovisions immediately; reactivating flips the same row back, so no phantom seat is created. SCIM-managed members take precedence over manual and JIT. | Beta | SCIM bearer |
Verified domains
New in v0.3.0. Claim a domain, prove control with a DNS-TXT record, and optionally let teammates on it auto-join on their first SSO sign-in. Claiming and verifying work on any tier; only enabling auto-join needs Team+. Auto-join is exact-match only — a verified acme.com does not authorize eng.acme.com — and it admits a user only when your own IdP asserts email_verified, so it fails closed.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/org/domains | List this org’s domain claims and their verification state. | Beta | Session · owner |
POST /v1/org/domains | Claim a domain → returns the DNS-TXT record to publish. | Beta | Session · owner |
POST /v1/org/domains/:id/verify | Check the TXT proof and stamp the domain verified. | Beta | Session · owner |
PATCH /v1/org/domains/:id | Toggle auto-join (enabling requires a verified domain and the Team plan). Default off. | Beta | Session · owner |
DELETE /v1/org/domains/:id | Remove a domain claim. | Beta | Session · owner |
Sample sandbox
One-click sample project for onboarding — see connect your agent. Session-only: a machine credential must never seed or wipe a tenant.
| Endpoint | Description | Status | Auth |
|---|---|---|---|
GET /v1/demo | Whether the sample project is seeded (fingerprint-verified). | Shipped | Session |
POST /v1/demo/seed | Load a labelled sample — a real chain + held approval + audit trail. | Shipped | Session |
DELETE /v1/demo | Remove the sample project. | Shipped | Session |
This map comes from the running control plane
GET / on a live Machinaut returns its own endpoint map — each route with its status inline — and this reference mirrors it. Two v0.3.0 routes (/v1/fleet and /v1/org/domains) are not in that root map yet, so they are documented here from the routes the server actually registers; the server, not this page, is the source of truth. The two write contracts have their own pages: the ingest contract and the approval relay contract.