SSyncropel Docs

The API surface

Which doors on a workspace are public (a person or an integrator meets them on purpose) and which are internal, with one line per public door, grouped by what you do with them, and the page that explains each one when there is one.

Every workspace serves one HTTP API. Locally it listens on port 9100; a hosted workspace serves the same API at its own origin. This page is the map of that API: every public door in one place, grouped by what a person does with it, and a short list of the prefixes that belong to the machinery and are not part of the public surface.

It was read from the source of version 0.224.0. Where a door has a page of its own, the last column links to it; the API reference carries request and response shapes for many of them.

How to read this page

A public door is one you, your client, or a program you write calls on purpose. It takes an ordinary credential (a bearer token, or the local socket when you are on the machine that runs the workspace), answers JSON, and refuses with a small envelope: {"object": "error", "code": "...", "message": "..."}. A few doors are open without any credential, on purpose: the liveness probe, the capability manifest, the sign-in doors, invite preview and redemption, and public links. Those are marked open below.

An internal door is one the workspace's own moving parts use to talk to each other: a run's worker asking whether it may make a call, the model relay a worker speaks through, the feeds two workspaces exchange when they sync, the pairing handshake, the identity directory. They are listed by prefix at the end and are not documented as an API. Their shape can change between releases without notice.

Paths say actors in several places. On screen, and everywhere else in these docs, those are members: people and automated agents alike. A {did} in a path is a member's id, the one spl actor list prints.

Workspace and records

MethodPathWhat it is forDocumented
GET/v1/recordsList records by thread, by member, or by clock window (one filter is required)API reference
POST/v1/recordsWrite one recordAPI reference
GET/v1/records/{id}Read one record by idAPI reference
POST/v1/records/queryA structured query over records, with cursorsQuery
POST/v1/records/subscribeThe same query held open as a live stream
POST/v1/records/searchSearch records by meaningSemantic search
POST/v1/records/embedIndex existing records for search by meaningSemantic search
GET/v1/events/streamA live stream of new records, filtered by type and thread
GET/v1/findSearch files and threads by plain textFind
GET/v1/search/statsHealth of the text indexFind
POST/v1/search/rebuildRebuild the text indexFind
GET/v1/foldsThe computed views this workspace offers, and which are liveAPI reference
GET/v1/folds/{name}A computed view across the whole workspaceAPI reference
GET/v1/folds/{name}/{key}A computed view over one threadAPI reference
GET/v1/folds/frame/{key}The renderable frame for a threadAPI reference
GET/v1/folds/rollupA digest of everything you can reachAPI reference
GET/v1/folds/principal_trustTrust per person, unified across their workspacesAPI reference
GET/v1/folds/composite/{subject}The joined view of one subject
GET/v1/graph/queryAsk the graph: a path, shared context, a neighbourhood, centralityAPI reference
POST/v1/graph/queryStart a longer traversal that reports as it goesAPI reference
GET/v1/graph/query/{query_id}/diagnoseHop-by-hop diagnostics for one traversal
GET/v1/graph/facetsThe kinds, people and threads you can seeAPI reference
GET/v1/trustEvery member's trust standingAPI reference
GET/v1/governance/trustSame as /v1/trust
GET/v1/governance/trust/{actor}/{domain}One member's standing in one domain, with history
GET/v1/governance/cusum-alertsRecent drift alerts on a member's standing
GET/v1/governance/auditThe governance dashboard
GET/v1/dashboardSame as /v1/governance/audit
GET/v1/namespacesList the spaces within the workspaceSpaces
POST/v1/namespacesCreate a spaceSpaces
GET/v1/namespaces/{id}Read one spaceSpaces
PATCH/v1/namespaces/{id}Edit a spaceSpaces
DELETE/v1/namespaces/{id}Archive a spaceSpaces
POST/v1/erasureErase content that must be forgotten
GET/v1/telemetryRead the workspace's own log and console output
GET/v1/substrate/layer-statsHow quickly queries were answered over a window (?window=1h, 6h, 24h or 7d), for operators

Threads and runs

MethodPathWhat it is forDocumented
GET/v1/threadsList threads, pagedAPI reference
GET/v1/threads/{id}One threadAPI reference
GET/v1/threads/{id}/recordsThe records on a thread (honours limit)API reference
GET/v1/threads/{id}/stateThe thread's current stateAPI reference
GET/v1/threads/{id}/projectA formatted view of the threadAPI reference
GET/v1/threads/{id}/participantsWho has written on the threadAPI reference
GET/v1/threads/{id}/childrenThreads this thread spawned
GET/v1/threads/{id}/parentsThreads this thread came from
GET/v1/threads/{id}/thinkingThe runs a conversation on this thread started
GET/v1/threads/{id}/watchA live stream of the threadAPI reference
POST/v1/threads/{id}/cancelCancel a reply that is still being written
GET/v1/threads/{id}/checkpointsSaved checkpoints on a threadSession checkpoints
POST/v1/threads/{id}/checkpointSave a checkpointSession checkpoints
GET/v1/threads/{id}/resumeThe resume brief for a threadSession checkpoints
POST/v1/threads/{id}/resumeThe same brief, for clients that postSession checkpoints
GET/v1/threads/snapshotExport chosen threads as a snapshot (?threads=)
POST/v1/threads/restoreRestore threads from a snapshot
GET/v1/presence/{thread}Who is on the thread right now (a websocket)
GET/v1/threads/{thread}/ledgersThe ledgers declared on a threadAPI reference
GET/v1/threads/{thread}/ledgers/{id}One ledger's rowsAPI reference
GET/v1/threads/{thread}/ledgers/{id}/encodingThe compact text form of a ledgerAPI reference
POST/v1/actors/{did}/runsStart a run as a member; this is what spl run callsRunning a goal
GET/v1/actors/{did}/runsA member's runsRunning a goal
GET/v1/runsEvery run, newest first, filtered by state, member, or start timeRunning a goal
GET/v1/runs/{thread}One run: goal, state, turns, spend, the open questionRunning a goal
GET/v1/runs/{thread}/eventsThe run's events as a live stream; ?replay=true sends history firstRunning a goal
POST/v1/runs/{thread}/eventsAct on a run: {type: "message"} steers, {type: "decision"} answers its question, {type: "stop"} cancelsRunning a goal
GET/v1/runs/{thread}/provenanceThe definition, prompt and frame the run ran underAPI reference
GET/v1/actors/{did}/usageA member's spend, runs and tokens todayAPI reference
POST/v1/work/loopStart a run the older way, by goal aloneAPI reference
POST/v1/work/loop/previewWhat a run would be allowed to spend, before starting itAPI reference
GET/v1/work/loop/{thread}A run's statusAPI reference
POST/v1/work/loop/{thread}/cancelCancel a runAPI reference
GET/v1/work/loop/{thread}/streamThe same live stream as /v1/runs/{thread}/eventsAPI reference
GET/v1/work/compensation/reviewHow often a member's runs had to be corrected (operator only)API reference
GET/v1/work/compensation/review/topThe members corrected most often (operator only)API reference
POST/v1/decomposeAsk for a goal to be broken into steps before it runs
POST/v1/dispatchHand a task to a member's adapterAI clients
GET/v1/dispatchList dispatches by state
GET/v1/dispatch/{id}One dispatch
GET/v1/dispatch/{id}/recordsThe records a dispatch producedDispatch observability
POST/v1/sessions/startRegister a captured session (what spl session hook calls)Hooks
POST/v1/sessions/{thread}/toolOne tool use in a captured sessionHooks
POST/v1/sessions/{thread}/turnOne turn's closing wordsHooks
POST/v1/sessions/{thread}/endEnd the session; the workspace writes its reportHooks
POST/v1/sessions/{thread}/retainKeep the scrubbed transcriptHooks
DELETE/v1/sessions/{thread}/sourceForget the transcriptHooks

Your call

The lane of things waiting on a person. A decision needs an answer; a heads-up needs only a nod.

MethodPathWhat it is forDocumented
GET/v1/registerEverything waiting on you, ranked, with open proposals beside it; ?limit= caps each listYour call
POST/v1/register/weightRank one item above another: {above, below}; withdrawn: true removes the weightYour call
POST/v1/register/listenerTurn your listener on or off: {enabled}Your call
GET/v1/decisionsThe open decisions, unrankedAPI reference
POST/v1/decisions/{id}/decideAnswer one itemYour first decision
GET/v1/governance/decisionsSame as /v1/decisions
POST/v1/governance/decisions/{id}/decideSame as /v1/decisions/{id}/decide
GET/v1/lanes/{lane}Every thread where the lane holds, longest-waiting first: your-call, or waiting-on-people for questions you asked others
GET/v1/attention/homeThe one-payload Home digest
GET/v1/attention/briefYour re-entry brief
GET/v1/attention/queueWhat has been delivered to you and what is waiting
GET/v1/attention/annotationYour current where-was-I note
POST/v1/attention/annotationSave that note
GET/v1/attention/annotation/draftA drafted note to edit

The register door

GET /v1/register answers one object. The fields a client renders from:

  • configured: whether this workspace has been set up at all. An empty register with configured: false is a bare workspace, not a quiet one.
  • asks: the ranked rows, duplicates merged. asks_open counts every open item before folding, asks_distinct after.
  • asks_decisions and asks_notices: the split of those rows into decisions (an answer is needed) and heads-ups (a nod is enough). A badge that counts what needs a person reads asks_decisions.
  • asks_receivable and asks_unreceivable: how many of the rows a run can still take the answer to, and how many nothing can receive any more.
  • asks_capped and ask_scan_ceiling: whether the ask counts are exact or a floor, and the ceiling they were measured under. capped is the combined signal for asks and proposals together.
  • proposal_groups: open proposals grouped by identical text, each with its summary, count, confidence, latest_clock and decision_ids. Deciding any one member of a group settles the group. proposals and proposals_open are the ungrouped list and its count.
  • rules, rules_live, rules_re_asked: the answers that became standing policy, and which of them have come back as a question.
  • weights, oldest_ask_unix, viewer, root_thread.

The decide door

POST /v1/decisions/{id}/decide takes {decision, reason?, provided_value?, becomes_policy?}. For an item that offers options, decision is the chosen option's id (approve or reject for the plain pair). For an item that asks you to provide something, decision is "provide" and provided_value carries the answer. For a heads-up, decision is "acknowledge". becomes_policy turns the answer into a standing rule with an expiry.

The answer is {object: "decision", id, request_id, decision, policy, opened_thread}, plus fulfills (an answer) or cancels (a rejection) naming the request id again. opened_thread is the thread this answer opened, when it opened one; it is null for an ordinary item. A fresh workspace set up with any preset other than blank seeds one question in the register, "What are you working on?", and answering it opens your first thread, titled with exactly what you typed, and returns its id here so your client can take you into it. Answering the same question twice returns the same thread. See First run.

Members

MethodPathWhat it is forDocumented
GET/v1/actorsList membersAPI reference
POST/v1/actorsRegister a member
GET/v1/actors/lookupOne member by id (?did=)API reference
GET/v1/actors/rosterEvery defined member with its definition, model, tools and standingAPI reference
GET/v1/actors/threadsThe threads a member takes part in (?did=)
GET/v1/actors/{did}/threadsThe same, by path, with thread details
POST/v1/actors/defineDefine an automated member that runs as itself, within your own boundsMembers and adapters
DELETE/v1/actors/{did}/definitionRetire a member you definedMembers and adapters
PATCH/v1/actors/{did}/definitionShape a member: model, words, tools, ceilings, name, with a partial body (owner)Actor doors
GET/v1/actors/{did}/historyA member's versions, newest first, with what changed (owner)Actor doors
POST/v1/actors/{did}/definition/revertPut a listed version back, as a new version (owner)Actor doors
POST/v1/blueprints/materializeInstall a blueprint, which can define members, tools and rules togetherBlueprints
GET/v1/actors/{did}/memoriesWhat a member remembersMember memory
POST/v1/actors/{did}/memoriesGive a member something to rememberMember memory
DELETE/v1/actors/{did}/memories/{name}Forget one memoryMember memory
GET/v1/actors/{did}/evalsA member's graded history, by definitionEvaluating members
POST/v1/evals/scoreGrade a member's runs against a suiteEvaluating members
GET/v1/actors/{did}/exportExport a member, memories includedMember portability
POST/v1/actors/{did}/importImport a memberMember portability
GET/v1/actors/{did}/active-namespaceThe space a member is currently working in
PUT/v1/actors/{did}/active-namespaceMove a member to a space
POST/v1/actors/{did}/active-namespaceSame as PUT
GET/v1/adaptersThe adapters that connect members to models and toolsAPI reference
GET/v1/adapters/circuitWhether each adapter is currently allowed to run
GET/v1/adapters/{did}/circuitOne adapter's state
POST/v1/adapters/{did}/circuit/resetLet a paused adapter run again
POST/v1/adapters/{did}/enableEnable an adapter
POST/v1/adapters/{did}/disableDisable an adapter
GET/v1/membersThe membership roster with each grant's statusJoining a workspace
POST/v1/members/adoptTurn a label that has been writing records into a real memberAPI reference
DELETE/v1/members/{label}Remove a member; every credential they held stops workingAgent credentials
POST/v1/members/{label}/grantsGive an agent a narrower grant under a memberAgent credentials
DELETE/v1/members/{label}/grants/{grant_id}Revoke that grantAgent credentials
GET/v1/faculties/catalogThe standard assistants an owner can deploy
POST/v1/faculties/deployDeploy one (owner only)
GET/v1/me/faculty-prefsYour own assistant preferences
PUT/v1/me/faculty-prefsChange them
POST/v1/faculties/prefs/resetClear one person's preferences (owner only)

Permissions, rules and tools

MethodPathWhat it is forDocumented
GET/v1/config/rulesThe routing rules in forceRouting rules
GET/v1/config/permission-rulesThe permission rules in force, and whether the permission plane is onCEL expressions
GET/v1/config/fold-rulesThe status rules in force
GET/v1/config/health-checksThe health checks in force
GET/v1/config/decision-policiesThe decision policies in force
GET/v1/triggersThe scheduled triggers actually loaded, refused ones markedScheduled triggers
POST/v1/triggers/{name}/testDry-run a trigger without dispatchingScheduled triggers
POST/v1/expr/evalEvaluate an expression against the workspaceCEL expressions
GET/v1/system/snapshotThe workspace-state values an expression can read
GET/v1/tasks/snapshotThe task-board values an expression can read
GET/v1/toolsThe tools members may reachThe run_code tool
GET/v1/tools/{tool_id}One toolThe run_code tool
POST/v1/tools/{tool_id}/probeTry a tool once, outside a run
POST/v1/secrets/setStore a secretSecrets
POST/v1/secrets/getRead a secret you may readSecrets
POST/v1/secrets/listList the secrets you may seeSecrets
POST/v1/secrets/deleteDelete a secretSecrets
POST/v1/secrets/promoteMove a secret to a more durable storeSecrets
POST/v1/entitlementReport what a subscription did; the workspace decides the tier it grants. Idempotent by effect: the same status from the same source answers unchanged: true and writes nothing. On a hosted workspace with a plan, only a request signed by the hosting service is acceptedTiers and entitlements
POST/v1/engine/wakeThe hosting service wakes a sleeping workspace at a time the workspace published; the request names only that time, is signed with a key the workspace issued, and is answered until the due work is saved. Not found on a workspace that publishes no scheduleScheduled triggers
MethodPathWhat it is forDocumented
GET/v1/consent/grantsThe grants that let others read a threadConsent management
POST/v1/consent/grantsShare a thread with a person, a whole space, or the publicConsent management
DELETE/v1/consent/grantsUn-share a thread: every grant of that scope on itConsent management
GET/v1/consent/grants/{id}One grantConsent management
DELETE/v1/consent/grants/{id}Revoke one grantConsent management
GET/v1/connectionsYour connections to other workspaces and services
POST/v1/connectionsAdd one
GET/v1/connections/{id}One connection
PATCH/v1/connections/{id}Change it
DELETE/v1/connections/{id}End it
GET/v1/public/thread/{thread_id}Read a publicly shared thread (open)Media that plays
GET/v1/public/folds/{name}/{thread_id}A computed view of a publicly shared thread (open)
GET/v1/public/media_tokenA short-lived token to play media from a shared thread (open)
GET/v1/public/medium/resolveHow to present a shared piece of media (open)Media that plays
GET/l/{*rest}A shareable link; redirects to the viewer (open)Media that plays
GET/i/{id}The invite preview page (open)Pair, share, invite
POST/v1/invitesIssue an invite: a device, a guest, another workspace, or a new memberPair, share, invite
GET/v1/invitesYour outstanding invitesPair, share, invite
GET/v1/invites/{id}Preview an invite before redeeming it (open)Pair, share, invite
POST/v1/invites/{id}/redeemRedeem an invite (open: the invite is the credential)Pair, share, invite
POST/v1/invites/{id}/revokeRevoke onePair, share, invite
POST/v1/invites/bulk-revokeRevoke manyPair, share, invite
GET/v1/invites/auditRecent invite activityPair, share, invite
POST/v1/invites/sign-attestationHave this workspace vouch for you when you redeem another workspace's invite (signed in here first)Pair, share, invite
GET/v1/invite-templatesSaved invite templatesPair, share, invite
POST/v1/invite-templatesSave onePair, share, invite
GET/v1/scope_presetsThe built-in access presets an invite can carry (open)Scopes and permissions
POST/v1/directory/listingPublish or refresh your listing in the directory
GET/v1/directory/searchSearch the directory (open)API reference
GET/v1/directory/resolveFind where a member's workspace lives (open)
GET/v1/directory/recommendationsListings suggested for you
POST/v1/directory/recommendations/dismissNever suggest one again
POST/v1/directory/blockBlock a listing, or unblock it
POST/v1/directory/reportReport a listing for abuse
POST/v1/directory/delistRemove a listing (operator moderation)
POST/v1/repo/declareDeclare a repository for this workspace at <label>/<name> (owner)Publishing a repository
POST/v1/repo/publishPublish this workspace as a repository; takes the write lease first, and binds a workspace that has no repository yetPublishing a repository
POST/v1/repo/bindBind an empty published tree as this workspace's write-back target (owner)Publishing a repository
POST/v1/repo/forkFork a repository
POST/v1/repo/unlistRetract a repository's directory listing
POST/v1/repo/keysMint a deploy key for a repository; expires_days defaults to 90 and is refused past 365 by name (every bearer class expires)
GET/.well-known/repositoriesThe live repository listings (open)
GET/The workspace's public front page (open)The workspace site
GET/v1/siteThe published site recordThe workspace site
GET/v1/site/previewYour draft site, renderedThe workspace site
POST/v1/site/assetsUpload an image for the site (owner only)The workspace site
GET/site/assets/{version}/{id}A published site asset (open)
GET/site/local/{name}A site asset from the workspace's own folder (open)Filesystem overlay
GET/site/copy.jsThe front page's copy-button script (open)
GET/site/glyph.svgThe workspace's glyph (open)
GET/v1/instance/shellThe chrome that frames every screenWorkspace chrome

Files

MethodPathWhat it is forDocumented
GET/v1/data/listList a folderFiles and blobs
GET/v1/data/statOne file or folder's detailsFiles and blobs
GET/v1/data/materialsSearch files by nameFiles and blobs
GET/v1/data/nodeResolve one file by id or pathFiles and blobs
GET/v1/data/historyThe versions of one path, newest first
POST/v1/data/mkdirMake a folderFiles and blobs
POST/v1/data/mvMove or renameFiles and blobs
POST/v1/data/rmRemoveFiles and blobs
POST/v1/data/write/initBegin a writeFiles and blobs
PUT/v1/blobs/upload/{upload_id}Upload a chunkFiles and blobs
POST/v1/data/write/completeCommit the writeFiles and blobs
POST/v1/data/read-urlGet a URL to read a file's bytesFiles and blobs
GET/v1/blobs/{hash}Read a file's bytesFiles and blobs
GET/v1/data/readRead a mounted file's bytesFiles
POST/v1/data/publishKeep a file as a durable artifactFiles and blobs
GET/v1/data/medium/resolveHow to present a piece of your own mediaMedia that plays
GET/v1/data/mountsMounted external storageFiles
GET/v1/data/driversThe storage drivers trusted hereFiles
GET/v1/data/usageStorage used against the quotaFiles and blobs
GET/v1/data/capabilitiesWhether the file surface is present, and its limitsFiles and blobs
GET/v1/data/eventsA live stream of file changes
GET/v1/data/provenanceFiles written by automated members, newest firstFiles and blobs

Identity and sign-in

MethodPathWhat it is forDocumented
GET/v1/identityThe workspace's identity, and who your credential isAPI reference
POST/v1/identity/rotateRotate the workspace's signing key
GET/v1/selfWho this credential is, and what recovery proofs it has boundKeeping your access
GET/v1/self/bindingsYour recovery proofs (never the secret)Keeping your access
POST/v1/self/bindingsBind a recovery code, passkey, or accountKeeping your access
POST/v1/self/bindings/challengeStart binding a passkeyKeeping your access
DELETE/v1/self/bindings/{id}Remove one proofKeeping your access
GET/v1/self/credentialsEvery live credential that opens this workspace as youKeeping your access
DELETE/v1/self/credentials/{bearer_id}Revoke one of themKeeping your access
GET/v1/self/reportWhether this workspace can answer yet (configured, a provider is live, an assistant is present), the plan, and two reasons from outside the workspace: provider_unfunded before you type, provider_degraded after a failureWhat the workspace says about itself
POST/v1/recredential/challengeStart signing in with a passkey (open)Keeping your access
POST/v1/recredentialGet a new credential from a proof: the proof is the credential (open)Keeping your access
GET/v1/auth/challengeA signed challenge for key-based sign-in (open; refused unless that mode is enabled)
POST/v1/bootstrap/service-accountMint the first credential on a workspace that has none yet; refused afterwards (open only until then)Workspace lifecycle
GET/v1/service-accountsList service accountsService accounts and tokens
POST/v1/service-accountsCreate one, with its scopesService accounts and tokens
DELETE/v1/service-accounts/{id}Revoke one and every token under itService accounts and tokens
POST/v1/service-accounts/{id}/rotate-keyRotate: a new token first, then the old ones revokedService accounts and tokens
GET/v1/tokensList tokensService accounts and tokens
POST/v1/tokensMint a tokenService accounts and tokens
DELETE/v1/tokens/{token_id}Revoke a tokenService accounts and tokens
POST/v1/tokens/{token_id}/rotateRotate your own tokenPair, share, invite
GET/.well-known/openid-configuration"Log in with Syncropel" discovery (open; only when the provider is enabled)
GET/oauth/jwksThe workspace's public signing key (open)
GET/oauth/authorizeBegin a login (open)
GET/oauth/authorize/{request_id}The consent screen's context (open)
POST/oauth/authorize/{request_id}/decideApprove or refuse a login (open)
POST/oauth/tokenExchange the code for tokens (open)
GET/oauth/userinfoThe signed-in person's claims (open)
GET/oauth/logoutEnd a login session (open)
POST/oauth/revokeRevoke a login token (open)
POST/oauth/introspectCheck whether a login token is live (open)

Operations and health

MethodPathWhat it is forDocumented
GET/healthIs the workspace up (open)Workspace lifecycle
GET/health/readyIs it ready to take traffic (open)
GET/v1/healthThe full health reportAPI reference
GET/metricsHealth counters in a scrape-friendly form
GET/v1/engine/healthThe engine's countersWorkspace lifecycle
GET/v1/engine/expression_cache/statsExpression cache statistics, read by spl doctorAPI reference
GET/v1/engine/revocation_cache/statsInvite revocation cache statistics
GET/v1/engine/reconcile-queueBacklog in the processing pipeline
GET/v1/engine/migrationsWhether stored data is at the current layout
POST/v1/engine/migrations/applyRe-apply the layout
POST/v1/engine/sweepExpire standing rules that have reached their expiry, now
POST/v1/drain/startStop taking new work ahead of a shutdown
GET/v1/drain/statusWhether a drain is in progress
POST/v1/drain/cancelCancel the drain
POST/v1/lifecycle/drain/startSame as /v1/drain/start
GET/v1/lifecycle/drain/statusSame as /v1/drain/status
POST/v1/lifecycle/drain/cancelSame as /v1/drain/cancel
GET/v1/fleet/statusThe fleet this workspace belongs to: which workspaces are live, frozen or stoppedAPI reference
GET/v1/lifecycle/fleet/statusSame as /v1/fleet/status
POST/v1/admin/backupTake a backup now
POST/v1/portability/exportExport the whole workspace as a signed bundlePortability
POST/v1/portability/importImport onePortability
GET/v1/instance/bootstrapEverything a client needs to draw its first screen (open)API reference
POST/v1/instance/configureApply a setup preset to a bare workspaceFirst run
GET/v1/capabilitiesWhat this workspace can do, machine-readable (open)API reference
GET/.well-known/syncropelThe same, for a workspace that has not signed in yet (open); since v0.236 it also carries owner_actions, the nine actions a control plane may forward on an owner's behalf, each naming a declared door and its scopeAPI reference
GET/openapi.jsonThe OpenAPI document (open)
GET/docs/apiA rendered view of it (open)
GET/v1/console/manifestWhich commands the operator console may run
POST/v1/corpus/promotePromote graded runs into the training corpus (a deliberate act, never automatic)
POST/v1/corpus/backfillCapture runs that finished before the corpus existed
POST/v1/proxy/messagesTalk to a member through a messages-style APIAPI reference
POST/v1/messagesSame as /v1/proxy/messages
POST/v1/mcpThe MCP door for AI clientsAI clients

Internal doors

These prefixes belong to the workspace's own machinery. They are not the public surface, they are not documented here, and their shape can change between releases without notice.

  • /v1/work/tool-verdict and /v1/work/tool-call: the seam between a run's worker and the workspace that judges each of its tool calls.
  • /v1/broker/: the model relay a worker speaks through, so the worker never holds a model credential.
  • /v1/sync/ and /v1/federation/: the feeds and pairing handshake two workspaces use to exchange records and files. You drive them with spl federation pair and spl sync; see Federation.
  • /v1/discovery/: finding peers on the local network.
  • /directory/ and /v1/directory/publish, /v1/directory/self-delist: the identity directory service and the doors other workspaces and the provisioning service push into.
  • /v1/admin/provisioning-worker-restore: the provisioning service's own door.
  • /v1/patterns/: cross-workspace pattern evaluation.
  • The relay, which carries messages between workspaces that cannot reach each other directly, is a separate service with its own doors; see Relay.

Stability

Doors are added, and fields are added to existing answers, in ordinary releases without notice; a client that ignores fields it does not know keeps working. A breaking change is a door renamed or removed, a field whose meaning changes, or a call that used to succeed and now refuses. Breaking changes are called out in the release notes and in the source changelog, with the migration; a removed path answers 404 from the release that removes it, the way the older /v1/agent/* paths did when they became /v1/work/*. The capability manifest at GET /v1/capabilities carries a manifest_version that changes only when the manifest's own shape breaks, so a client can detect that before it parses.

Internal doors carry no such promise.

On this page