Docs
Welcome to OSuite Documentation
Build with OSuite, connect governed runtimes, move into the workspace console, and deepen into SDK reference only when you need implementation detail.
Welcome to OSuite Documentation
Build with OSuite, learn the runtime model, and move from your first governed action into approvals, evidence, and reference from one documentation portal.
Introduction
OSuite documentation is organized like a developer portal: start with the API & SDK path, understand the console surfaces, then move into pricing and implementation reference without changing mental models.
Self-host and future SaaS are deployment models for the OSuite control plane. They do not determine governance level by themselves.
Get started
Get started
OSuite Control Plane
Connect one runtime. Keep approvals, evidence, and replay portable.
OSuite is a governance control plane for AI agents. The fastest way in is to connect a runtime, send one action, review the approval path, and verify the evidence bundle that comes back.
Modalities
SDK runtimes · workflow bridges · governed approvals
Features
Action recording · policy checks · replay-ready evidence
Quick orientation
API & SDK starts the product
Begin with connect, verify the first governed action, then deepen into reference only when implementation questions appear.
Workspace flow
Console keeps operators aligned
Move from workspace setup to keys, webhooks, approvals, and pricing without changing context or vocabulary.
Governance method
PCAA ties route, review, and proof together
Checkpoint semantics stay stable even when the underlying runtime changes.
Get started
MCP server / connect path
Use the docs quick-start and /connect golden path to get one real action flowing first.
Get started
SDK starter
Install the Node or Python SDK, set environment variables, and run the smoke template.
Get started
Runtime families
Move from the smoke template into the runtime family that best matches your control surface and execution shape.
Quick start with the API
Start here
OSuite should feel like a short, reliable setup path: install the SDK, set three environment variables, run one real action, and confirm the evidence lands in the control plane.
Minimal governed loop
Minimal governed loop
OSuite should feel like a short, reliable setup path: install the SDK, set three environment variables, run one real action, and confirm the evidence lands in the control plane.
First successful connection
Do these five things in order
Install the SDK
Set OSUITE_BASE_URL, OSUITE_API_KEY, and OSUITE_AGENT_ID
Run the minimal smoke template once
Confirm the action in Decisions and Replay
Move to a real runtime template
Install and configure
npm install osuite
export OSUITE_BASE_URL="https://studio.osuite.ai" export OSUITE_API_KEY="<workspace-api-key>" export OSUITE_AGENT_ID="my-agent"
Governance levels
Evidence Import
OSuite ingests evidence and supports replay, audit, and post-facto analysis.
Advisory Governance
OSuite evaluates policy before execution, but the external runtime may not enforce the stop.
Approval-Orchestrated Governance
OSuite can pause execution, wait for approval, and resume or deny deterministically.
Runtime-Enforced Governance
OSuite sits at the real execution boundary and can enforce before side effects happen.
Product surfaces
Embedded Runtime SDK / Package
Instrument customer-controlled runtimes, tools, and orchestrators from inside the code.
Runtime Boundary Adapter
Intercept real tool or action execution at the boundary where side effects occur.
Control Plane
Run policy, approvals, replay, and evidence management as the operator system of record.
Evidence Import Surface
Import actions, traces, and logs when the external runtime cannot be governed directly.
Deployment models
Self-Hosted Control Plane
Run the OSuite control plane in your own infrastructure and under your own operations model.
SaaS Control Plane
Use a OSuite-managed control plane once the hosted service is available.
Release notes
Check release notes before rolling new SDK versions or changing runtime adapters so your workspace operators can line up approvals, policies, and evidence expectations.
Console
Workbench
Workspace setup
Create or switch workspaces, manage identity, and prepare the shared operating surface before you onboard a team.
Credentials
API keys
Generate workspace-scoped API keys for governed runtimes and keep connection handoff steps visible to operators.
Operations
Approvals and webhooks
Move from passive observability into active approvals, policy review, and notification routing inside the workspace console.
Console
Workspace setup
Review workspace identity, plan, and setup flow before inviting members.
Console
API keys
Create runtime credentials and validate the connection kit from the workspace.
Console
Approvals
See how pending actions, human review, and runtime evidence appear inside the console.
Models and pricing
Pricing
Plans
Choose between free entry, control-focused governance, and larger assurance tiers based on volume and control depth.
Volume
Rate limits
Understand how governed action volume, replay retention, and export surfaces change as you move up plan tiers.
Upgrade
Billing
See which workspace capabilities unlock at each tier before you route production traffic through OSuite.
Plans
Free is designed for first value. Paid plans expand governed action volume, replay-ready proof export, compliance exports, and deeper approval controls.
Rate limits
Volume and feature boundaries are enforced per workspace so teams can start small and scale without changing the operating model.
PCAA checkpoints
Pre-action admissibility
Evaluate whether the proposed action is allowed, warned, blocked, or approval-gated before side effects happen.
Action open
Create the portable action record that becomes the trust object for replay, scoring, and proof.
Assumption capture
Record what the runtime believed or depended on so operators can replay the reasoning boundary later.
Approval checkpoint
Pause, wait, or externally hold execution when policy requires a human checkpoint.
Outcome closure
Write the final result, evidence, and status so the action certificate closes cleanly.
Evidence bundles
Evidence bundles collect approvals, policy context, action payloads, and runtime proof into one replayable surface so OSuite can prove not just what happened, but why it was allowed.
Connect path
/docs and /connect are one journey
Start here for the docs-first activation path, then continue into /connect for richer runtime-family guidance, validator steps, optional verified pairing, and deeper sample switching.
What success looks like
The action appears in /decisions with the expected action type and goal.
Replay shows assumptions and the final outcome.
The agent ID is stable across repeated runs.
Operators can describe what happened without reading raw agent logs.
Runtime Adapter Contract
OSuite stays neutral by treating every runtime as an adapter problem, not a product integration problem. The adapter contract below defines what a runtime must preserve so PCAA remains portable across frameworks, bridges, and boundary evidence paths.
Identity and tenant scope
Every adapter must preserve stable tenant and agent identity across actions, approvals, and replay.
Execution boundary mapping
Adapters must declare where OSuite can truly intercept execution versus only observe or import evidence.
Action envelope normalization
Adapters should normalize runtime events into one portable action envelope instead of platform-specific payloads.
Portable approval semantics
Approval must map to a consistent OSuite checkpoint whether the runtime uses native waits, interrupts, or external holds.
Replay evidence closure
Adapters must emit enough trace, artifact, and outcome data for operators to reconstruct what happened.
PCAA checkpoints
Pre-action admissibility
Evaluate whether the proposed action is allowed, warned, blocked, or approval-gated before side effects happen.
SDK method: guard
Action open
Create the portable action record that becomes the trust object for replay, scoring, and proof.
SDK method: createAction
Assumption capture
Record what the runtime believed or depended on so operators can replay the reasoning boundary later.
SDK method: recordAssumption
Approval checkpoint
Pause, wait, or externally hold execution when policy requires a human checkpoint.
SDK method: waitForApproval
Outcome closure
Write the final result, evidence, and status so the action certificate closes cleanly.
SDK method: updateOutcome
Portable action envelope
action_typeRequiredStable action taxonomy shared by operators, policy, replay, and scoring.
declared_goalRequiredHuman-readable intent for the action before side effects happen.
risk_scoreOptionalRuntime-supplied risk hint before OSuite policy evaluation.
tool_nameOptionalConcrete tool or capability invoked by the runtime.
tool_inputOptionalSanitized input summary used for replay, policy, and audit.
assumptionsOptionalBeliefs or operating assumptions recorded around the action.
approval_stateOptionalPortable approval checkpoint state independent of runtime brand.
outcomeOptionalFinal status, summary, and evidence closure for the action.
artifactsOptionalURLs, files, outputs, or references attached to the replay record.
trace_refOptionalPointer to runtime trace, log, or execution timeline when available.
tenant_idRequiredWorkspace / tenant scope for policy, billing, compliance, and access control.
agent_idRequiredStable runtime identity inside the tenant boundary.
Templates
The old connection smoke sample is now the first template, not the whole story. Once it works, move to a domain template so your operators start seeing meaningful actions immediately.
Minimal Smoke Test
Fastest way to prove the SDK, API key, and dashboard path are all wired correctly.
Best for: First live connection and CI smoke checks
import { OSuite } from 'osuite';
const osuite = new OSuite({
baseUrl: process.env.OSUITE_BASE_URL || 'https://studio.osuite.ai',
apiKey: process.env.OSUITE_API_KEY,
agentId: process.env.OSUITE_AGENT_ID || 'smoke-agent',
});
const decision = await osuite.guard({
action_type: 'integration.smoke_test',
declared_goal: 'Verify OSuite connection and dashboard visibility',
risk_score: 5,
});
if (decision.decision === 'block') {
throw new Error(`Blocked: ${decision.reasons.join(', ')}`);
}
const { action_id } = await osuite.createAction({
action_type: 'integration.smoke_test',
declared_goal: 'Verify OSuite connection and dashboard visibility',
risk_score: 5,
metadata: { environment: 'local', template: 'minimal-smoke' },
});
if (decision.decision === 'review') {
await osuite.updateOutcome(action_id, {
status: 'pending_approval',
summary: 'Smoke test created and awaiting operator approval',
});
console.log('Smoke test pending approval:', action_id);
process.exit(0);
}
await osuite.recordAssumption({
action_id,
assumption: 'OSuite base URL and API key are valid',
});
await osuite.updateOutcome(action_id, {
status: 'completed',
summary: 'Smoke test completed successfully',
});
console.log('Smoke test action:', action_id);Support Triage Agent
A customer-support pattern that records ticket classification, confidence, and routed outcome.
Best for: Inbox triage, helpdesk copilots, escalation workflows
import { OSuite } from 'osuite';
const osuite = new OSuite({
baseUrl: process.env.OSUITE_BASE_URL || 'https://studio.osuite.ai',
apiKey: process.env.OSUITE_API_KEY,
agentId: process.env.OSUITE_AGENT_ID || 'support-triage',
});
const ticket = {
id: 'ticket_2048',
customer: 'Acme Robotics',
summary: 'Webhook deliveries are timing out after the latest deploy',
severity: 'high',
};
const decision = await osuite.guard({
action_type: 'support.route_ticket',
declared_goal: 'Classify and route a customer support ticket',
risk_score: ticket.severity === 'high' ? 48 : 18,
metadata: { ticket_id: ticket.id, customer: ticket.customer },
});
const { action_id } = await osuite.createAction({
action_type: 'support.route_ticket',
declared_goal: 'Classify and route a customer support ticket',
risk_score: ticket.severity === 'high' ? 48 : 18,
metadata: {
ticket_id: ticket.id,
severity: ticket.severity,
template: 'support-triage',
},
});
await osuite.recordAssumption({
action_id,
assumption: 'The timeout is most likely infrastructure-related rather than an auth regression',
});
await osuite.updateOutcome(action_id, {
status: decision.decision === 'allow' ? 'completed' : 'needs_review',
summary: 'Ticket routed to platform-ops with webhook timeout hypothesis',
metadata: {
routed_to: 'platform-ops',
confidence: 0.82,
},
});Release Gate Agent
A higher-risk template that records a deployment action and waits for approval when required.
Best for: Deployments, schema changes, production cutovers
import { OSuite } from 'osuite';
const osuite = new OSuite({
baseUrl: process.env.OSUITE_BASE_URL || 'https://studio.osuite.ai',
apiKey: process.env.OSUITE_API_KEY,
agentId: process.env.OSUITE_AGENT_ID || 'release-gate',
});
const { action_id } = await osuite.createAction({
action_type: 'deploy.release',
declared_goal: 'Promote checkout-service v2.4.1 to production',
risk_score: 78,
metadata: {
service: 'checkout-service',
environment: 'production',
template: 'release-gate',
},
});
await osuite.recordAssumption({
action_id,
assumption: 'Rollback image v2.4.0 remains available if error rate increases',
});
await osuite.waitForApproval(action_id);
await osuite.updateOutcome(action_id, {
status: 'completed',
summary: 'Release promoted after human approval',
});Runtime Families
Embedded SDK runtime
Use when you can place governance directly around tools, handoffs, and outcomes inside the runtime.
Graph-orchestrated runtime
Use when execution moves through explicit nodes, checkpoints, interrupts, or state transitions.
Multi-agent task runtime
Use when multiple workers cooperate inside one task envelope and still need distinct replay evidence.
Tool-hook runtime
Use when governance attaches at the command, tool, or pre-execution hook boundary.
FAQ
Should connect live inside docs or be a separate page?
Both. Docs should expose the quick-start path directly, while /connect remains the focused hands-on flow with richer samples and runtime-specific guidance.
What should I use after the smoke test passes?
Move immediately to a domain template that matches your agent’s real job, such as support triage or release gating. That gives operators a meaningful action taxonomy from day one.
Do I need verified pairing before my first successful connection?
No. The first milestone is a clean, observable action loop. Verified pairing is a hardening step once you need stronger provenance.
Constructor
const claw = new OSuite({ baseUrl, apiKey, agentId });| Parameter | Type | Required | Description |
|---|---|---|---|
| baseUrl / base_url | string | Yes | Dashboard URL |
| apiKey / api_key | string | Yes | API Key |
| agentId / agent_id | string | Yes | Unique Agent ID |
Behavior Guard
claw.guard(context)
Evaluate guard policies for a proposed action. Call this before risky operations. The guard response includes a `learning` field with historical performance context when available (recent scores, drift status, learned patterns, feedback summary).
| Parameter | Type | Required | Description |
|---|---|---|---|
| action_type | string | Yes | Proposed action type |
| risk_score | number | No | 0-100 |
Returns: Promise<{ decision: string, reasons: string[], risk_score: number, agent_risk_score: number | null }>
const result = await claw.guard({ action_type: 'deploy', risk_score: 85 });Action Recording
claw.createAction(action) / claw.create_action(**kwargs)
Create a new action record.
Returns: Promise<{ action_id: string }>
const { action_id } = await claw.createAction({ action_type: 'deploy' });claw.waitForApproval(id) / claw.wait_for_approval(id)
Poll for human approval.
await claw.waitForApproval(action_id);
claw.updateOutcome(id, outcome) / claw.update_outcome(id, **kwargs)
Log final results.
await claw.updateOutcome(action_id, { status: 'completed' });claw.recordAssumption(asm) / claw.record_assumption(asm)
Track agent beliefs.
await claw.recordAssumption({ action_id, assumption: '...' });Signals
claw.getSignals() / claw.get_signals()
Get current risk signals across all agents.
Returns: Promise<{ signals: Object[] }>
const { signals } = await claw.getSignals();Agent Lifecycle
claw.heartbeat(status, metadata) / claw.heartbeat(status=..., metadata=...)
Report agent presence and health to the control plane. Call periodically to indicate the agent is alive.
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | No | Agent status — 'online', 'busy', 'idle'. Defaults to 'online' |
| metadata | object | No | Arbitrary metadata to include with the heartbeat |
await claw.heartbeat('online', { cycle: 42, uptime_ms: 360000 });claw.reportConnections(connections) / claw.report_connections(connections)
Report active provider connections and their status. Appears in the agent's Fleet profile.
| Parameter | Type | Required | Description |
|---|---|---|---|
| connections | Array<Object> | Yes | List of { name, type, status } connection objects |
await claw.reportConnections([
{ name: 'OpenAI', type: 'llm', status: 'connected' },
{ name: 'Postgres', type: 'database', status: 'connected' },
]);Loops & Assumptions
claw.registerOpenLoop(actionId, type, desc) / claw.register_open_loop(...)
Register an unresolved dependency for a decision. Open loops track work that must be completed before the decision is fully resolved.
| Parameter | Type | Required | Description |
|---|---|---|---|
| action_id | string | Yes | Associated action |
| loop_type | string | Yes | The category of the loop |
| description | string | Yes | What needs to be resolved |
await claw.registerOpenLoop(action_id, 'validation', 'Waiting for PR review');
claw.resolveOpenLoop(loopId, status, res) / claw.resolve_open_loop(...)
Resolve a pending loop.
await claw.resolveOpenLoop(loop_id, 'completed', 'Approved');
claw.recordAssumption(asm) / claw.record_assumption(asm)
Record what the agent believed to be true when making a decision.
await claw.recordAssumption({ action_id, assumption: 'User is authenticated' });Learning Analytics
claw.getLearningVelocity() / claw.get_learning_velocity()
Compute learning velocity (rate of score improvement) for agents.
Returns: Promise<{ velocity: Array<Object> }>
const { velocity } = await claw.getLearningVelocity();claw.getLearningCurves() / claw.get_learning_curves()
Compute learning curves per action type to measure efficiency gains.
const curves = await claw.getLearningCurves();
claw.getLessons({ actionType, limit }) / claw.get_lessons(action_type=..., limit=...)
Fetch consolidated lessons from scored outcomes — what OSuite has learned about this agent's performance patterns.
| Parameter | Type | Required | Description |
|---|---|---|---|
| actionType | string | No | Filter by action type |
| limit | number | No | Max lessons to return (default 10) |
Returns: Promise<{ lessons: Object[], drift_warnings: Object[], agent_id: string }>
const { lessons, drift_warnings } = await claw.getLessons({ actionType: 'deploy' });
lessons.forEach(l => console.log(l.guidance));Prompt Management
claw.renderPrompt() / claw.render_prompt()
Fetch rendered prompt from OSuite.
const { rendered } = await claw.renderPrompt({
template_id: 'marketing',
variables: { company: 'Apple' }
});Evaluation Framework
claw.createScorer(name, type, config) / claw.create_scorer(...)
Create a reusable scorer definition for automated evaluation.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Scorer name |
| scorer_type | string | Yes | Type (llm_judge, regex, range) |
| config | object | No | Scorer configuration |
await claw.createScorer('toxicity', 'regex', { pattern: 'bad-word' });Scoring Profiles
claw.createScoringProfile(config) / claw.create_scoring_profile(...)
Define weighted quality scoring profiles across multiple scorers.
await claw.createScoringProfile({
name: 'prod-quality',
dimensions: [{ scorer: 'toxicity', weight: 0.5 }]
});Agent Messaging
claw.sendMessage(params) / claw.send_message(**kwargs)
Send a point-to-point message or broadcast to all agents in the organization.
| Parameter | Type | Required | Description |
|---|---|---|---|
| to | string | No | Target agent ID (omit for broadcast) |
| body | string | Yes | Message content |
| type | string | No | action|info|lesson|question |
| urgent | boolean | No | Mark as high priority |
await claw.sendMessage({
to: 'scout-agent-01',
body: 'I have finished indexing the repository. You can start the analysis.',
type: 'status'
});claw.getInbox(options?) / claw.get_inbox(**kwargs)
Retrieve messages from the agent inbox with optional filtering.
| Parameter | Type | Required | Description |
|---|---|---|---|
| type | string | No | Filter by message type |
| unread | boolean | No | Only return unread messages |
| limit | number | No | Max messages to return |
Returns: Promise<{ messages, total, unread_count }>
const { messages } = await claw.getInbox({ unread: true, limit: 10 });Session Handoffs
claw.createHandoff(handoff) / claw.create_handoff(**kwargs)
Create a session handoff document to persist state between agent sessions or transfer context to another agent.
await claw.createHandoff({
summary: 'Completed initial data collection from Jira.',
key_decisions: ['Prioritize high-severity bugs', 'Ignore closed tickets'],
open_tasks: ['Run security scan on src/', 'Draft fix for #123'],
next_priorities: ['Security audit']
});claw.getLatestHandoff() / claw.get_latest_handoff()
Retrieve the most recent handoff for the current agent.
Returns: Promise<Object|null>
const handoff = await claw.getLatestHandoff();
Security Scanning
claw.scanPromptInjection(text) / claw.scan_prompt_injection(text)
Scan untrusted input for potential prompt injection or jailbreak attempts.
| Parameter | Type | Required | Description |
|---|---|---|---|
| text | string | Yes | Untrusted input to scan |
Returns: Promise<{ clean: boolean, risk_level: string, recommendation: string }>
const result = await claw.scanPromptInjection(userInput);
if (!result.clean) {
console.warn('Injection risk:', result.risk_level);
}User Feedback
claw.submitFeedback(params) / claw.submit_feedback(**kwargs)
Submit feedback for a specific agent action. Used for human evaluation of agent performance.
| Parameter | Type | Required | Description |
|---|---|---|---|
| action_id | string | Yes | Target action ID |
| rating | number | Yes | 1-5 star rating |
| comment | string | No | Textual feedback |
| category | string | No | Grouping tag |
await claw.submitFeedback({
action_id: 'act_4b2s8...',
rating: 4,
comment: 'Action was safe and effective but took longer than expected.',
category: 'performance_review'
});Context Threads
claw.createThread(options) / claw.create_thread(**kwargs)
Create a new context thread to track a multi-step reasoning chain or investigation.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Thread name |
| summary | string | No | Initial thread summary |
Returns: Promise<{ thread, thread_id }>
const { thread } = await claw.createThread({ name: 'Deploy analysis', summary: 'Evaluating safety' });claw.addThreadEntry(threadId, content, entryType) / claw.add_thread_entry(...)
Append an observation, conclusion, or decision to an existing context thread.
| Parameter | Type | Required | Description |
|---|---|---|---|
| threadId | string | Yes | Thread ID to append to |
| content | string | Yes | Entry content |
| entryType | string | Yes | 'observation' | 'conclusion' | 'decision' |
await claw.addThreadEntry('ct_abc123', 'Staging checks passed', 'observation');claw.closeThread(threadId, summary?) / claw.close_thread(thread_id, summary=None)
Close a context thread, optionally providing a final summary.
| Parameter | Type | Required | Description |
|---|---|---|---|
| threadId | string | Yes | Thread ID to close |
| summary | string | No | Final summary of the thread |
await claw.closeThread('ct_abc123', 'Deploy approved after staging check');Bulk Sync
claw.syncState(state) / claw.sync_state(**kwargs)
Bulk-sync agent state including decisions, lessons, goals, context, relationships, memory, and preferences in a single call.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | object | Yes | State object with keys: decisions, lessons, goals, context, relationships, memory, preferences |
await claw.syncState({ decisions: [...], lessons: [...], goals: [...] });Agent Identity
Enroll agents via public-key pairing and manage approved identities. Pairing requests are created by agents; approval is an admin action. Once approved, the agent's public key is registered as a trusted identity for signature verification.
POST /api/pairings
Create an agent pairing request. The agent submits its public key and waits for operator approval.
| Parameter | Type | Required | Description |
|---|---|---|---|
| public_key | string | Yes | PEM-encoded RSA public key |
| algorithm | string | No | Key algorithm. Default: RSASSA-PKCS1-v1_5 |
| agent_name | string | No | Human-readable label for the agent |
Returns: { pairing: { id, status, agent_name, created_at } }
// Node SDK (v1 legacy)
import { OSuite } from 'osuite/legacy';
const claw = new OSuite({ baseUrl, apiKey, agentId });
const { pairing } = await claw.createPairing(publicKeyPem, 'RSASSA-PKCS1-v1_5', 'my-agent');
console.log(pairing.id); // pair_...GET /api/pairings
List all pairing requests for the organization. Admin API key required.
Returns: { pairings: Array<{ id, status, agent_name, created_at, approved_at }> }
const res = await fetch('/api/pairings', {
headers: { 'x-api-key': adminApiKey }
});
const { pairings } = await res.json();GET /api/pairings/:id
Get a specific pairing request by ID. Used by agents to poll for approval status.
Returns: { pairing: { id, status, agent_name, created_at, approved_at } }
// Node SDK (v1 legacy) const status = await claw.getPairing(pairingId); console.log(status.pairing.status); // pending | approved | expired
POST /api/pairings/:id/approve
Approve a pending pairing request. Admin API key required. On approval, the agent's public key is registered as a trusted identity.
Returns: { pairing: { id, status, approved_at } }
const res = await fetch(`/api/pairings/${pairingId}/approve`, {
method: 'POST',
headers: { 'x-api-key': adminApiKey }
});POST /api/identities
Directly register an agent's public key as a trusted identity. Admin API key required. Bypasses the pairing flow.
| Parameter | Type | Required | Description |
|---|---|---|---|
| agent_id | string | Yes | Unique agent identifier |
| public_key | string | Yes | PEM-encoded RSA public key |
| algorithm | string | No | Key algorithm. Default: RSASSA-PKCS1-v1_5 |
Returns: { identity: { agent_id, algorithm, created_at } }
// Node SDK (v1 legacy)
await claw.registerIdentity('agent-007', publicKeyPem, 'RSASSA-PKCS1-v1_5');GET /api/identities
List all registered agent identities for the organization. Admin API key required.
Returns: { identities: Array<{ agent_id, algorithm, created_at }> }
// Node SDK (v1 legacy)
const { identities } = await claw.getIdentities();DELETE /api/identities/:agentId
Revoke a registered agent identity. Admin API key required. The agent's public key is removed and signature verification will fail for future actions.
Returns: { success: true }
const res = await fetch(`/api/identities/${agentId}`, {
method: 'DELETE',
headers: { 'x-api-key': adminApiKey }
});Error Handling
{ message: "Validation failed", status: 400 }