REST API
The PAL control plane serves a REST API on :8080, and the dashboard, CLI and SDKs all call it. Every /v1/ endpoint takes a Bearer token: a dashboard JWT or an API key. This page gives request and response shapes for the core resources (agents, runs, sessions, connectors, schedules, triggers, providers) and indexes every other registered route under More endpoints, so you can call any of it with curl.
Authentication
Section titled “Authentication”Pass your API key in the Authorization header on every request:
Authorization: Bearer hlx_live_your_api_key_hereCreate keys under Settings > API keys. Keys start with pal_live_ (keys issued before the rename start with hlx_live_ and keep working) and carry scopes (read, write, admin, or fine-grained ones such as agents:write and runs:execute). Every route is annotated with the scope it needs (for example GET /v1/runs needs runs:read, POST /v1/runs needs runs:execute). A dashboard session JWT holds the scopes of the user’s role, always enforced (see Roles), lasts PAL_JWT_TTL (default 12 hours) and is revoked by POST /auth/logout or a password or role change. For API keys, scope enforcement is on by default in production (PAL_ENV=production|staging) and off in dev. Set PAL_AUTHZ_ENFORCE=0 to opt out (logged as a warning) or =1 to force it on in dev; a key missing the required scope then gets 403. POST /v1/api-keys takes an optional expiresAt (RFC 3339, in the future, at most one year out); an expired key gets 401. POST /v1/api-keys/{id}/rotate (admin scope) returns a replacement with the same name and scopes once and revokes the old key in the same transaction (the gateway caches introspection for up to 60 seconds, so it may keep accepting the old key for that long); rotating an unscoped (legacy) key needs an owner/admin JWT, an admin-scoped key gets 403; send expiresAt to set a new expiry (required if the old key already expired). Keys record the user who created them (createdBy). Row-level security is on in production whenever PAL_APP_DB_PASSWORD is set; without it the control plane refuses to start unless you set PAL_RLS_ENFORCE=0.
Accounts
Section titled “Accounts”Sign-up, login, logout, sessions, roles, email verification, password reset, data export and workspace deletion (/auth/* and /v1/tenants/{id}) are documented on Accounts. OAuth sign-in starts at GET /auth/oauth/{provider}/start; in invite sign-up mode pass the code as ?invite=<code>, and OAuth sign-up follows PAL_SIGNUP_MODE like password sign-up.
Agents
Section titled “Agents”List agents
Section titled “List agents”GET /v1/agents
Response: 200 OK — bare array[ { "name": "research-agent", "currentVersionId": "v1", "labels": {}, "createdAt": "2026-04-10T12:00:00Z" }]Get agent
Section titled “Get agent”GET /v1/agents/{name}
Response: 200 OK{ "name": "research-agent", "currentVersionId": "v1", "manifest": { "systemPrompt": "You are a research assistant...", "model": "auto" }, "labels": {}, "createdAt": "2026-04-10T12:00:00Z"}Create agent
Section titled “Create agent”POST /v1/agentsContent-Type: application/json
{ "name": "my-agent", "manifest": { "systemPrompt": "You are a helpful assistant...", "model": "auto" }}
Response: 201 Created{ "name": "my-agent" }Delete agent
Section titled “Delete agent”DELETE /v1/agents/{name}
Response: 204 No Content
PATCH /v1/agents/{name} — updateCreate a run
Section titled “Create a run”Add an optional callbackUrl to be told when the run ends instead of polling: on a terminal status (succeeded, failed, cancelled) the control plane POSTs the run to it, signed with a per-tenant key in X-Pal-Signature: v1=<hex HMAC-SHA256 of the body> and carrying X-Pal-Run-ID. A 5xx or network error is retried up to 4 attempts with backoff; a 4xx is final. Production requires https, and URLs that resolve to private addresses are refused.
POST /v1/runsContent-Type: application/json
{ "agentName": "research-agent", "input": { "topic": "quantum computing" }}
Response: 201 Created{ "id": "550e8400-e29b-41d4-a716-446655440000", "agentId": "...", "status": "queued", "input": { "topic": "quantum computing" }, "createdAt": "2026-04-12T10:00:00Z"}Get run
Section titled “Get run”GET /v1/runs/{id}
Response: 200 OK{ "id": "550e8400-...", "agentId": "...", "status": "succeeded", "input": { "topic": "quantum computing" }, "output": { "summary": "..." }, "tokensIn": 820, "tokensOut": 2100, "costUsd": 0.0042, "createdAt": "2026-04-12T10:00:00Z", "startedAt": "2026-04-12T10:00:01Z", "finishedAt": "2026-04-12T10:00:08Z"}Run status values: queued, running, paused, succeeded, failed, cancelled. A failed run carries error: {code, message}; parentRunId and sessionId appear when set.
List runs
Section titled “List runs”GET /v1/runs?agent=research-agent&status=succeeded
Response: 200 OK — bare array, at most 100 (no limit parameter)[ { "id": "...", "agentId": "...", "status": "succeeded", ... }]
Filters: agent, status, sessionIdStream run events (SSE)
Section titled “Stream run events (SSE)”GET /v1/runs/{id}/eventsAccept: text/event-stream
Response: Server-Sent EventsThe event name is the journal kind; data is JSON.
event: step_starteddata: {"seq":1,"kind":"step_started","stepId":"plan","runId":"550e...","at":"2026-04-12T10:00:01Z","payload":{}}
event: step_completeddata: {"seq":2,"kind":"step_completed","stepId":"plan","runId":"550e...","at":"2026-04-12T10:00:03Z","payload":{"output":"..."}}
event: step_starteddata: {"seq":3,"kind":"step_started","stepId":"search-0","runId":"550e...","at":"2026-04-12T10:00:03Z","payload":{}}
event: step_completeddata: {"seq":4,"kind":"step_completed","stepId":"search-0","runId":"550e...","at":"2026-04-12T10:00:06Z","payload":{"output":"..."}}
: heartbeatPossible event kinds on a run stream:
step_started: a step began executing.step_completed: a step finished with output.step_failed: a step errored; payload haserror.step_retrying: transient failure, will retry.step_waiting: waiting for human approval.confidence_evaluated: confidence gate scored a step.anomaly_detected: runtime anomaly reported by the harness.
Other run endpoints
Section titled “Other run endpoints”POST /v1/runs/{id}/cancel — cancel a runDELETE /v1/runs/{id} — delete a runPOST /v1/runs/{id}/receipt — issue a signed receiptPOST /v1/runs/{id}/feedback — score 1-5, optional commentForecast cost before running
Section titled “Forecast cost before running”POST /v1/runs/forecastContent-Type: application/json
{ "agentName": "research-agent", "input": { "topic": "..." } }
Response: 200 OK{ "estimatedTokensIn": 800, "estimatedTokensOut": 2000, "estimatedCostUsd": 0.004, "confidence": 0.82, "wouldExceedBudget": false}Sessions
Section titled “Sessions”Sessions are interactive multi-turn conversations. Send messages and stream the reply as it generates.
Create session
Section titled “Create session”POST /v1/sessionsContent-Type: application/json
{ "agentName": "my-agent" }
Response: 201 Created{ "id": "sess-uuid", "agentName": "my-agent", "status": "active", "createdAt": "..." }Send a message
Section titled “Send a message”POST /v1/sessions/{id}/messagesContent-Type: application/json
{ "content": "What is the capital of France?" }
Response: 200 OK{ "turnId": "turn-uuid", "text": "Paris.", "tokensIn": 12, "tokensOut": 4, "costUsd": 0.00001 }Stream session events
Section titled “Stream session events”GET /v1/sessions/{id}/eventsAccept: text/event-stream
event: message_deltadata: {"sessionId":"...","turnId":"...","seq":1,"delta":"Par"}
event: message_deltadata: {"sessionId":"...","turnId":"...","seq":2,"delta":"is."}
event: message_completeddata: {"turnId":"...","text":"Paris.","usage":{"tokensIn":12,"tokensOut":4,"costUsd":0.00001}}
A failed turn emits message_error.Other session endpoints
Section titled “Other session endpoints”GET /v1/sessions — list (bare array)GET /v1/sessions/{id} — getPOST /v1/sessions/{id}/stop — stop a running sessionDELETE /v1/sessions/{id} — delete sessionConnectors
Section titled “Connectors”Install a connector
Section titled “Install a connector”POST /v1/connectors/installContent-Type: application/json
{ "connectorId": "gmail", "config": { "userEmail": "you@example.com" }}
Response: 201 Created{ "connectorId": "gmail", "status": "installed" }List connectors
Section titled “List connectors”GET /v1/connectors
Response: 200 OK — bare array[ { "connectorId": "gmail", "status": "installed", "installedAt": "..." }]Execute a connector action
Section titled “Execute a connector action”POST /v1/connectors/{connectorId}/execute?action=send_emailContent-Type: application/json
{ "to": "friend@example.com", "subject": "Hello", "body": "..." }
Response: 200 OK{ "result": { "messageId": "..." } }Other connector endpoints
Section titled “Other connector endpoints”POST /v1/connectors/{id}/test — test connectionDELETE /v1/connectors/{id} — uninstallSchedules
Section titled “Schedules”Schedules trigger agent runs on a cron expression. They are a separate resource from agents: one agent can have multiple schedules.
Create schedule
Section titled “Create schedule”POST /v1/schedulesContent-Type: application/json
{ "agentName": "research-agent", "cronExpr": "0 9 * * 1-5", "timezone": "America/New_York", "config": { "input": { "mode": "daily-digest" } }, "enabled": true}
Response: 201 Created{ "id": "sched-uuid", "agentName": "research-agent", "cronExpr": "0 9 * * 1-5", ... }Other schedule endpoints
Section titled “Other schedule endpoints”GET /v1/schedules — list (bare array)PUT /v1/schedules/{id} — updateDELETE /v1/schedules/{id} — deleteTriggers
Section titled “Triggers”Inbound webhook triggers start a run of one agent when GitHub, Sentry, PagerDuty or a signed generic sender posts to a public URL. Setup, signatures and status codes are on Webhook triggers.
POST /v1/agents/{name}/triggers — create {provider, secret?, inputTemplate?}; 201, secret shown onceGET /v1/agents/{name}/triggers — list (bare array, no secrets)GET /v1/triggers/{id} — getPATCH /v1/triggers/{id} — {enabled?, secret?, inputTemplate?}DELETE /v1/triggers/{id} — 204POST /v1/hooks/{id} — public receiver, authenticated by HMAC signature, not a tokenLLM providers
Section titled “LLM providers”POST /v1/settings/llm-providersContent-Type: application/json
{ "provider": "anthropic", "apiKey": "sk-ant-..." }
Response: 200 OK{ "provider": "anthropic", "configured": true }
GET /v1/settings/llm-providers — list configured providers (bare array)POST /v1/settings/llm-providers/{provider}/test — test the keyMore endpoints
Section titled “More endpoints”Everything else registered in services/control-plane/cmd/server/main.go, with the page that explains it. Paths are relative to :8080; all take a Bearer token unless noted.
| Area | Endpoints | Guide |
|---|---|---|
| Completions | POST /v1/completions (LLM proxy, routes to your configured providers) |
Models |
| Budgets | GET/PUT/DELETE /v1/agents/{name}/budget, GET /v1/budgets, GET/PUT/DELETE /v1/budgets/tenant, GET /v1/usage |
Budgets |
| Evals | /v1/eval-suites, /v1/eval-runs (422 on regression), /v1/eval-baselines, GET /v1/eval-observability/{failures,trends}, POST /v1/runs/rehearse |
Evaluations |
| Experiments | /v1/experiments, POST /v1/experiments/{id}/{record,conclude} |
Evaluations |
| Takeover | POST /v1/runs/{id}/takeover/request, GET .../takeover, POST .../takeover/{id}/{grant,deny,answer,release} |
Approvals |
| Receipts | POST /v1/runs/{id}/receipt, POST /v1/runs/receipts/verify (no auth), GET /.well-known/pal-receipts, GET /.well-known/pal-agent-identity |
Receipts |
| Knowledge and handoff | /v1/agents/{name}/documents (+ /search), POST /v1/sessions/{id}/{handoff,operator-messages,resolve} |
Knowledge and handoff |
| Marketplace and MCP | /v1/marketplace (+ publish, {slug}/{fork,star,invoke}, invocations), GET /v1/mcp/servers, /v1/agents/{name}/mcp-servers, A2A: GET /v1/agents/{name}/card, POST /v1/agents/{name}/a2a/invoke, GET /.well-known/agent.json |
Marketplace |
| Agent extras | PATCH /v1/agents/{name}, GET/PUT /v1/agents/{name}/workflow, POST /v1/agents/{generate-spec,generate-code,from-template,loop}, GET /v1/agents/templates, GET /v1/agents/{name}/feedback, GET /v1/agents/{name}/setup |
Agents |
| Batches | POST /v1/batches (runs:execute; N child runs, optional concurrency, default 20; at most PAL_BATCH_MAX_ITEMS, default 1000; Idempotency-Key header; optional callbackUrl fires when every child is done), GET /v1/batches/{id}, GET /v1/batches/{id}/results (paged), POST /v1/batches/{id}/cancel |
Invoke an agent |
| Billing | GET /v1/billing (settings:read), POST /v1/billing/{checkout,portal} (owner or admin, settings:write), POST /v1/billing/webhook (Stripe-signed, no JWT). Off until PAL_STRIPE_SECRET_KEY is set: GET reports {enabled:false} and the rest answer 404 |
|
| Devices | POST /v1/bridges/enroll (settings:write; a one-time pairing code), POST /v1/bridges/pair (no auth, rate-limited; returns a device token once), POST /v1/bridges/self/rotate (device token), GET /v1/bridges (settings:read), DELETE /v1/bridges/{id} |
|
| Deployments | /v1/deployments, GET/POST /v1/agents/{name}/deploy (+ deploy/stop), /v1/data-planes |
Production deployment |
| Sandbox VMs | POST /v1/runtime/schedule, /v1/runtime/vms (+ {id}, pause, resume, fork, exec, logs, files, files/content), /v1/runtime/{quota,cluster,audit,metrics}, GET/PUT /v1/egress/dlp-policy (+ rules) |
Sandbox lifecycle |
| Runtime internals | POST /v1/runtime/report, POST /v1/runtime/secrets/resolve (service token, not JWT) |
Egress |
| Channels | /v1/surfaces (+ {id}/test, slack/command, whatsapp/{heartbeat,status}), /v1/voice/{numbers,calls,token,webhook/{provider},calls/status/{provider}} |
Channels |
| Memory and people | /v1/people (+ resolve, merge, duplicates, relationship), /v1/memory/{events,context,search,distill,distillates} |
PAL internals |
| Settings and keys | /v1/settings/llm-providers, /v1/api-keys, GET /v1/system/health |
Your first agent |
| Promotion | POST /v1/agents/{name}/versions (freeze), POST /v1/agents/{name}/promote, GET /v1/agents/{name}/environments, POST /v1/agents/{name}/environments/{env}/rollback, POST /v1/agents/{name}/environments/prod/canary/evaluate, POST /v1/agents/{name}/environments/sandbox/runs (record sandbox evidence), GET /v1/promotions (+ audit), POST /v1/promotions/{id}/{approve,reject} (human owner/admin only). Scopes: agents:read / agents:write |
Promotion |
| Agent identity and policy | GET/PUT /v1/agents/{name}/policy (PUT with a stale version is 409), POST .../policy/propose (never saved), GET .../identity, POST .../identity/{rotate,revoke}, POST .../identity/token (JWT owner/admin only), GET .../audit (?limit=&event=, returns chainValid), GET /.well-known/pal-agent-keys/{agentId} (public). A policy deny is 403 agent_policy_denied; an agent calling as itself sends X-Pal-Agent-Token |
Agent identity and policy |
| Reliability | GET /v1/runs/{id}/trace (redacted step, LLM, tool and child-run tree), GET/PUT /v1/agents/{name}/slo (+ GET .../slo/status), GET/PUT /v1/agents/{name}/prod-evals, GET /v1/incidents (+ {id}), POST /v1/incidents/{id}/{acknowledge,resolve,rollback}, POST /v1/incidents/scan |
Observability |
| Debug and support | POST /v1/debug/analyze (run, incident or eval case), POST /v1/support/ask, GET/POST /v1/support/escalations, GET /v1/support/escalations/{id} (+ /verify, checks the signed digest) |
Debugging and support |
| A2A v0.3 | GET /v1/agents/{name}/a2a/.well-known/agent-card.json (spec card), POST /v1/agents/{name}/a2a (JSON-RPC: message/send, message/stream, tasks/get, tasks/cancel, tasks/resubscribe), GET /.well-known/agent-card.json (the agent named by PAL_A2A_DEFAULT_AGENT, public only). The older POST /v1/agents/{name}/a2a/invoke and GET .../card remain |
A2A |
| MCP client | GET/POST /v1/mcp/tenant-servers, DELETE /v1/mcp/tenant-servers/{slug}, GET /v1/mcp/credentials, PUT/DELETE /v1/mcp/credentials/{slug}, POST /v1/mcp/oauth/{start,callback}, GET /v1/agents/{name}/mcp-servers/{slug}/tools |
MCP |
| MCP server | POST /mcp (stateless Streamable HTTP; accepts only API keys that carry the explicit mcp scope), GET and DELETE /mcp answer 405, GET /.well-known/oauth-protected-resource[/mcp] (RFC 9728 metadata) |
MCP |
| Conversational onboarding | GET/DELETE /v1/onboarding/agent?product= (transcript, reset), POST /v1/onboarding/agent/turn ({product, message?, event?, results?}; runs:execute) |
Your first agent |
| Agent onboarding | GET/PUT/DELETE /v1/onboarding, POST /v1/onboarding/explain |
Your first agent |
| pal setup | GET/PUT/DELETE /v1/pal/onboarding, GET /v1/pal/onboarding/profile, POST /v1/pal/onboarding/{guide,voice,profile/extract,trust/suggest}. Reads need read, state writes settings:write, the four POSTs (they call an LLM) runs:execute |
Set up PAL |
| Domain records | /v1/domain-records (+ {id}), GET /v1/domains/{domain}/digest, POST /v1/assist/explain |
PAL internals |
| Internal | POST /internal/auth/introspect-key (gateway, x-pal-service-token) |
Security boundaries |
The bridges also use endpoints that serve the personal agent only: /v1/life-events, /v1/commitments, /v1/errands, /v1/whatsapp/{drafts,facts,vips}, /v1/jarvis/*, /v1/signals (a device token, JWT or API key; or the legacy shared token), /v1/shortcuts/*, /v1/news, /v1/vision/ocr, /v1/audio/transcriptions, /v1/browser/*. They are single-owner and not a stable public surface.
Errors
Section titled “Errors”Errors use a flat JSON body:
// Most errors{ "error": "agent 'my-agent' not found" }
// Validation errors (may include field detail){ "error": "missing required field: agentName" }Common HTTP status codes:
400: bad request or validation failure.401: missing or invalid API key.403: insufficient scope or cross-tenant access.402: budget or VM quota exceeded (hard-fail policy).404: resource not found, including another tenant’s resource.429: too many runs onPOST /v1/runs, or the auth endpoints are rate limited.503: a hard-fail budget could not be read, so the run fails closed.409: wrong state (for example resuming a VM that is not paused).422: an eval run regressed against its branch baseline.500: internal error.
Route index
Section titled “Route index”Every route the control plane registers, generated from the Go sources by node scripts/gen-api-routes.mjs --write. CI runs --check and fails if a route is missing here, so this list is complete; the sections above explain the shapes. Each route’s required scope is set where it is registered in services/control-plane/cmd/server/main.go.
GET /.well-known/agent-card.jsonGET /.well-known/agent.jsonGET /.well-known/oauth-protected-resourceGET /.well-known/oauth-protected-resource/mcpGET /.well-known/pal-agent-identityGET /.well-known/pal-agent-keys/{agentId}GET /.well-known/pal-receiptsPOST /auth/forgotPOST /auth/loginPOST /auth/logoutGET /auth/meGET /auth/oauth/{provider}/callbackGET /auth/oauth/{provider}/startPOST /auth/oauth/exchangeGET /auth/providersPOST /auth/resetPOST /auth/signupPOST /auth/verifyPOST /auth/verify/resendGET /dl/{token}POST /internal/auth/introspect-keyPOST /internal/dl/stageDELETE /mcpGET /mcpPOST /mcpGET /v1/agentsPOST /v1/agentsDELETE /v1/agents/{name}GET /v1/agents/{name}PATCH /v1/agents/{name}POST /v1/agents/{name}/a2aGET /v1/agents/{name}/a2a/.well-known/agent-card.jsonPOST /v1/agents/{name}/a2a/invokeGET /v1/agents/{name}/auditDELETE /v1/agents/{name}/budgetGET /v1/agents/{name}/budgetPUT /v1/agents/{name}/budgetGET /v1/agents/{name}/cardGET /v1/agents/{name}/deployPOST /v1/agents/{name}/deployPOST /v1/agents/{name}/deploy/stopGET /v1/agents/{name}/documentsPOST /v1/agents/{name}/documentsDELETE /v1/agents/{name}/documents/{id}GET /v1/agents/{name}/documents/{id}POST /v1/agents/{name}/documents/searchGET /v1/agents/{name}/environmentsPOST /v1/agents/{name}/environments/{env}/rollbackPOST /v1/agents/{name}/environments/prod/canary/evaluatePOST /v1/agents/{name}/environments/sandbox/runsGET /v1/agents/{name}/feedbackGET /v1/agents/{name}/identityPOST /v1/agents/{name}/identity/revokePOST /v1/agents/{name}/identity/rotatePOST /v1/agents/{name}/identity/tokenGET /v1/agents/{name}/mcp-serversPOST /v1/agents/{name}/mcp-serversDELETE /v1/agents/{name}/mcp-servers/{slug}GET /v1/agents/{name}/mcp-servers/{slug}/toolsGET /v1/agents/{name}/policyPUT /v1/agents/{name}/policyPOST /v1/agents/{name}/policy/proposeGET /v1/agents/{name}/prod-evalsPUT /v1/agents/{name}/prod-evalsPOST /v1/agents/{name}/promoteGET /v1/agents/{name}/setupGET /v1/agents/{name}/sloPUT /v1/agents/{name}/sloGET /v1/agents/{name}/slo/statusGET /v1/agents/{name}/triggersPOST /v1/agents/{name}/triggersPOST /v1/agents/{name}/versionsGET /v1/agents/{name}/workflowPUT /v1/agents/{name}/workflowPOST /v1/agents/from-templatePOST /v1/agents/generate-codePOST /v1/agents/generate-specPOST /v1/agents/loopGET /v1/agents/templatesGET /v1/api-keysPOST /v1/api-keysDELETE /v1/api-keys/{id}POST /v1/api-keys/{id}/rotatePOST /v1/assist/explainPOST /v1/audio/transcriptionsPOST /v1/batchesGET /v1/batches/{id}POST /v1/batches/{id}/cancelGET /v1/batches/{id}/resultsGET /v1/billingPOST /v1/billing/checkoutPOST /v1/billing/portalPOST /v1/billing/webhookGET /v1/bridgesDELETE /v1/bridges/{id}POST /v1/bridges/enrollPOST /v1/bridges/pairPOST /v1/bridges/self/rotatePOST /v1/browser/commitments/{id}/executePOST /v1/browser/proposePOST /v1/browser/readGET /v1/budgetsDELETE /v1/budgets/tenantGET /v1/budgets/tenantPUT /v1/budgets/tenantGET /v1/commitmentsPOST /v1/commitmentsGET /v1/commitments/{id}PUT /v1/commitments/{id}POST /v1/commitments/{id}/dismissPOST /v1/commitments/{id}/donePOST /v1/commitments/{id}/execute-actionPOST /v1/commitments/{id}/researchPOST /v1/commitments/{id}/snoozePOST /v1/completionsGET /v1/connectorsGET /v1/connectors/{connectorId}/executePOST /v1/connectors/{connectorId}/executeDELETE /v1/connectors/{id}GET /v1/connectors/{id}POST /v1/connectors/{id}/testGET /v1/connectors/gmail/messagesPOST /v1/connectors/installGET /v1/connectors/oauth/callbackPOST /v1/connectors/oauth/startPOST /v1/cross-app/proposeGET /v1/data-planesPOST /v1/data-planesDELETE /v1/data-planes/{id}POST /v1/debug/analyzeGET /v1/deploymentsPOST /v1/deploymentsGET /v1/deployments/{id}GET /v1/domain-recordsPOST /v1/domain-recordsDELETE /v1/domain-records/{id}PUT /v1/domain-records/{id}GET /v1/domains/{domain}/digestGET /v1/egress/dlp-policyPUT /v1/egress/dlp-policyPOST /v1/egress/dlp-policy/rulesDELETE /v1/egress/dlp-policy/rules/{ruleId}GET /v1/errandsPOST /v1/errandsPOST /v1/errands/{id}/confirm-and-callPOST /v1/errands/{id}/opt-outGET /v1/eval-baselinesPOST /v1/eval-baselinesPOST /v1/eval-judge/calibrateGET /v1/eval-observability/failuresGET /v1/eval-observability/trendsGET /v1/eval-runsPOST /v1/eval-runsGET /v1/eval-runs/{id}GET /v1/eval-suitesPOST /v1/eval-suitesDELETE /v1/eval-suites/{id}GET /v1/eval-suites/{id}POST /v1/eval-suites/{id}/runPOST /v1/eval-suites/generateGET /v1/experimentsPOST /v1/experimentsGET /v1/experiments/{id}POST /v1/experiments/{id}/concludePOST /v1/experiments/{id}/recordPOST /v1/hooks/{id}GET /v1/immigration/deadlinesPOST /v1/immigration/scanGET /v1/incidentsGET /v1/incidents/{id}POST /v1/incidents/{id}/acknowledgePOST /v1/incidents/{id}/resolvePOST /v1/incidents/{id}/rollbackPOST /v1/incidents/scanGET /v1/jarvis/briefPOST /v1/jarvis/brief/actPOST /v1/jarvis/stream-completionPOST /v1/kiosk/sessionGET /v1/life-eventsPOST /v1/life-eventsPOST /v1/life-events/{id}/dismissPOST /v1/life-events/{id}/undoGET /v1/life-events/prefsPUT /v1/life-events/prefsGET /v1/marketplaceDELETE /v1/marketplace/{slug}GET /v1/marketplace/{slug}POST /v1/marketplace/{slug}/forkPOST /v1/marketplace/{slug}/invokeDELETE /v1/marketplace/{slug}/starPOST /v1/marketplace/{slug}/starGET /v1/marketplace/invocationsPOST /v1/marketplace/publishGET /v1/mcp/credentialsDELETE /v1/mcp/credentials/{slug}PUT /v1/mcp/credentials/{slug}POST /v1/mcp/oauth/callbackPOST /v1/mcp/oauth/startGET /v1/mcp/serversGET /v1/mcp/servers/{slug}GET /v1/mcp/tenant-serversPOST /v1/mcp/tenant-serversDELETE /v1/mcp/tenant-servers/{slug}GET /v1/memory/contextPOST /v1/memory/distillGET /v1/memory/distillatesPOST /v1/memory/eventsGET /v1/memory/searchPOST /v1/messaging/twilio/inboundGET /v1/newsPOST /v1/news/askDELETE /v1/onboardingGET /v1/onboardingPUT /v1/onboardingDELETE /v1/onboarding/agentGET /v1/onboarding/agentPOST /v1/onboarding/agent/turnPOST /v1/onboarding/explainDELETE /v1/pal/onboardingGET /v1/pal/onboardingPUT /v1/pal/onboardingPOST /v1/pal/onboarding/guideGET /v1/pal/onboarding/profilePOST /v1/pal/onboarding/profile/extractPOST /v1/pal/onboarding/trust/suggestPOST /v1/pal/onboarding/voiceGET /v1/peopleGET /v1/people/duplicatesPOST /v1/people/mergePOST /v1/people/relationshipPOST /v1/people/resolveGET /v1/promotionsPOST /v1/promotions/{id}/approvePOST /v1/promotions/{id}/rejectGET /v1/promotions/auditGET /v1/runsPOST /v1/runsDELETE /v1/runs/{id}GET /v1/runs/{id}POST /v1/runs/{id}/cancelGET /v1/runs/{id}/eventsGET /v1/runs/{id}/feedbackPOST /v1/runs/{id}/feedbackPOST /v1/runs/{id}/receiptGET /v1/runs/{id}/takeoverPOST /v1/runs/{id}/takeover/{takeoverId}/answerPOST /v1/runs/{id}/takeover/{takeoverId}/denyPOST /v1/runs/{id}/takeover/{takeoverId}/grantPOST /v1/runs/{id}/takeover/{takeoverId}/releasePOST /v1/runs/{id}/takeover/requestGET /v1/runs/{id}/tracePOST /v1/runs/forecastPOST /v1/runs/receipts/verifyPOST /v1/runs/rehearseGET /v1/runtime/auditGET /v1/runtime/clusterGET /v1/runtime/metricsGET /v1/runtime/quotaPUT /v1/runtime/quotaPOST /v1/runtime/reportPOST /v1/runtime/schedulePOST /v1/runtime/secrets/resolveGET /v1/runtime/vmsDELETE /v1/runtime/vms/{id}GET /v1/runtime/vms/{id}POST /v1/runtime/vms/{id}/execGET /v1/runtime/vms/{id}/filesGET /v1/runtime/vms/{id}/files/contentPUT /v1/runtime/vms/{id}/files/contentPOST /v1/runtime/vms/{id}/forkGET /v1/runtime/vms/{id}/logsPOST /v1/runtime/vms/{id}/pausePOST /v1/runtime/vms/{id}/resumeGET /v1/schedulesPOST /v1/schedulesDELETE /v1/schedules/{id}PUT /v1/schedules/{id}GET /v1/sessionsPOST /v1/sessionsDELETE /v1/sessions/{id}GET /v1/sessions/{id}GET /v1/sessions/{id}/eventsPOST /v1/sessions/{id}/handoffPOST /v1/sessions/{id}/messagesPOST /v1/sessions/{id}/operator-messagesPOST /v1/sessions/{id}/resolvePOST /v1/sessions/{id}/stopGET /v1/settings/llm-providersPOST /v1/settings/llm-providersPOST /v1/settings/llm-providers/{provider}/testPOST /v1/shortcuts/pausePOST /v1/shortcuts/resumePOST /v1/shortcuts/sayGET /v1/shortcuts/statusGET /v1/signalsPOST /v1/signalsPOST /v1/sms/twilio/webhookPOST /v1/support/askGET /v1/support/escalationsPOST /v1/support/escalationsGET /v1/support/escalations/{id}GET /v1/support/escalations/{id}/verifyGET /v1/surfacesPOST /v1/surfacesDELETE /v1/surfaces/{id}PUT /v1/surfaces/{id}POST /v1/surfaces/{id}/testPOST /v1/surfaces/slack/commandPOST /v1/surfaces/whatsapp/heartbeatGET /v1/surfaces/whatsapp/statusGET /v1/system/healthDELETE /v1/tenants/{id}GET /v1/tenants/{id}/exportDELETE /v1/triggers/{id}GET /v1/triggers/{id}PATCH /v1/triggers/{id}GET /v1/usagePOST /v1/vision/ocrGET /v1/voice/callsPOST /v1/voice/calls/status/{provider}POST /v1/voice/errand/turn/{id}GET /v1/voice/numbersPOST /v1/voice/numbersDELETE /v1/voice/numbers/{id}POST /v1/voice/tokenPOST /v1/voice/ttsPOST /v1/voice/twilio/turnPOST /v1/voice/twilio/webhookPOST /v1/voice/webhook/{provider}GET /v1/whatsapp/draftsPOST /v1/whatsapp/draftsPOST /v1/whatsapp/drafts/{id}/actGET /v1/whatsapp/factsPOST /v1/whatsapp/factsDELETE /v1/whatsapp/facts/{id}DELETE /v1/whatsapp/vipsGET /v1/whatsapp/vipsPOST /v1/whatsapp/vips