API v1.0.0
Developer documentation
How to run your first assessment and sign in to the API. The CLI and the Python SDK are in progress: neither is published yet. The API reference at the end is generated from the running application, so it lists the 213 routes this deployment serves for you to call and nothing it does not.
Getting started
- 01Get an accountCreate a free account at Sign up, then activate it from the email we send.
- 02Save a provider keyOpen Settings, then Credentials, and save the key for the provider your agent runs on.
- 03Save the agentOpen Agents and add the agent you want to assess: its provider, its model and the saved credential.
- 04Run an assessmentOpen the Scanner, choose the agent and a profile. Choose a versioned profile, from Smoke 25 through the full 4,075-test corpus, within your contract capacity.
- 05Read the reportOpen the report for the graded findings, the response evidence behind each one and the remediation. Export it as PDF, HTML, JSON, SARIF or CSV.
How each test is graded is on the methodology page.
First assessment by API
The same five steps through the API. Every request below is a route in the reference. Replace the placeholders with your own values.
import requests
BASE = "https://api.secuvon.ai"
# 1. Sign in. The response carries a short-lived bearer access token.
tokens = requests.post(
f"{BASE}/api/v1/auth/login",
json={"email": "[email protected]", "password": "YOUR_PASSWORD"},
).json()
headers = {"Authorization": f"Bearer {tokens['access_token']}"}
# 2. Save the provider key once. It is encrypted at rest and never returned.
credential = requests.post(
f"{BASE}/api/v1/credentials",
headers=headers,
json={"provider": "openai", "name": "OpenAI production", "api_key": "YOUR_PROVIDER_KEY"},
).json()
# 3. Save the agent to assess, attached to that credential.
agent = requests.post(
f"{BASE}/api/v1/agents",
headers=headers,
json={
"name": "Support bot",
"provider": "openai",
"model": "YOUR_MODEL_ID",
"credential_id": credential["id"],
},
).json()
# 4. Start an assessment (202 Accepted; it runs in the background).
# Send include_compliance explicitly: the API assumes true when it is left out.
scan = requests.post(
f"{BASE}/api/v1/scans/run",
headers=headers,
json={"agent_id": agent["id"], "test_mode": "quick", "include_compliance": False},
).json()
# 5. Poll the status, then read the graded results.
status = requests.get(f"{BASE}/api/v1/scans/{scan['scan_id']}/status", headers=headers).json()
print(status["status"])Authentication
Access tokens
POST /api/v1/auth/login returns a short-lived access token and a refresh token. Send the access token as Authorization: Bearer, and exchange the refresh token at /api/v1/auth/refresh. An account with two-factor sign-in completes it at /api/v1/auth/mfa/verify. The web app uses the same tokens as cookies, and a cookie session must send its X-CSRF-Token header on every write.
API keys
Create a key in Settings, then API keys. It is shown once, expires, and can be revoked. A key reaches only the reviewed routes marked Accepts an API key below: reading agents, scans and reports, and starting a scan. Everything else needs an access token.
CLI
In progressThe secuvon command runs an assessment of a saved agent from a terminal or a pipeline and writes the result as a table, JSON, Markdown, HTML or SARIF. It is not published yet, so there is nothing to install, and the commands below run once it is. Until then, the API runs the same assessment: see First assessment by API.
# The secuvon CLI is not published yet: these commands run once it is.
# Authenticate with an API key, or a short-lived access token
export SECUVON_API_KEY=ftf_... # or: export SECUVON_API_TOKEN=...
# Assess a saved agent and write SARIF for code scanning
secuvon scan --agent-id AGENT_ID --suite quick --output sarif --output-file secuvon.sarifIt exits 0 when the scan completed with no blocking finding, 1 when it found one or the API refused the request, and 2 when there is no verdict: a configuration problem, a scan that did not complete, or a scan that is Not scored because every test errored. A Not scored scan writes no SARIF file, because an empty one would read as a clean scan.
Python SDK
In progressThe Python SDK wraps the same API with typed models, sync and async clients, token refresh, retries and live scan progress. It is not published yet either. Once it is, its methods for features this deployment does not serve answer with a not-found error.
# The Python SDK is not published yet: this runs once it is.
import os
from secuvon import Client
with Client(api_token=os.environ["SECUVON_API_TOKEN"]) as client:
scan = client.scans.start(agent_id="AGENT_ID", test_mode="quick")
for event in client.scans.stream(scan.scan_id):
print(event.type, getattr(event, "progress_percent", None))
print(client.scans.get(scan.scan_id).status)CI
In progressIn CI, the CLI runs with an API key stored as a secret and uploads its SARIF file to code scanning. The CLI is not published yet, so the job below has no install step and runs once it is.
jobs:
secuvon:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@v6
with:
python-version: "3.12"
# The secuvon CLI is not published yet, so this job has no install
# step and runs once a published release says how to install it.
- run: secuvon scan --agent-id "$SECUVON_AGENT_ID" --suite quick --output sarif --output-file secuvon.sarif
env:
SECUVON_API_KEY: ${{ secrets.SECUVON_API_KEY }}
SECUVON_AGENT_ID: ${{ vars.SECUVON_AGENT_ID }}API reference
Every route this deployment serves for you to call, grouped by area, with who may call it. Paths are relative to https://api.secuvon.ai. Routes that only the platform's operators, its monitoring or a payment or email provider call are not listed. This deployment runs the full platform, which also serves routes this launch-edition reference does not list.
Authentication
- DELETE
/api/v1/auth/accountDelete Account
Permanently close the current user's account.
Signed-in account200JSON body
- POST
/api/v1/auth/change-passwordChange Password
Change the current user's password.
Signed-in account200JSON body
- POST
/api/v1/auth/forgot-passwordForgot Password
Request a password reset email.
No sign-in200JSON body
- POST
/api/v1/auth/loginLogin
Authenticate user and return JWT tokens.
No sign-in200JSON body
- POST
/api/v1/auth/logoutLogout
Logout the current user.
Signed-in account200JSON body
- GET
/api/v1/auth/meGet Current User Profile
Get current authenticated user's profile.
Signed-in account200 - PUT
/api/v1/auth/meUpdate Profile
Update the current user's profile.
Signed-in account200JSON body
- DELETE
/api/v1/auth/mfaMfa Disable
Disable MFA for the current user.
Signed-in account200JSON body
- POST
/api/v1/auth/mfa/setupMfa Setup
Initiate MFA setup by generating a TOTP secret.
Signed-in account200 - POST
/api/v1/auth/mfa/verifyMfa Verify Login
Complete login by verifying MFA code after initial password authentication.
No sign-in200JSON body
- POST
/api/v1/auth/mfa/verify-setupMfa Verify Setup
Verify MFA setup by confirming a TOTP code from the user's authenticator app.
Signed-in account200JSON body
- POST
/api/v1/auth/refreshRefresh
Obtain a new access token using a refresh token.
No sign-in200JSON body
- POST
/api/v1/auth/registerRegister
Register a new user account.
No sign-in201JSON body
- POST
/api/v1/auth/resend-verificationResend Verification
Send a new activation link to an account that is waiting for one.
No sign-in200JSON body
- POST
/api/v1/auth/reset-passwordReset Password
Reset password using a valid reset token.
No sign-in200JSON body
- POST
/api/v1/auth/send-verificationSend Verification
Send an email verification link to the current user.
Signed-in account200 - POST
/api/v1/auth/verify-emailVerify Email
Activate an account when the mailbox holder accepts the current Terms.
No sign-in200JSON body
Credentials
- GET
/api/v1/credentialsList Credentials
List the authenticated user's credentials, newest first. Never leaks keys.
Signed-in account200 - POST
/api/v1/credentialsCreate Credential
Create a credential, encrypting the key at rest. Returns no key.
Signed-in account201JSON body
- GET
/api/v1/credentials/{credential_id}Get Credential
Fetch a single credential owned by the caller. Never leaks the key.
Signed-in account200credential_id (path, required)
- PATCH
/api/v1/credentials/{credential_id}Update Credential
Partial update. Re-encrypts api_key if sent; omitted key stays unchanged.
Signed-in account200credential_id (path, required), JSON body
- DELETE
/api/v1/credentials/{credential_id}Delete Credential
Delete a credential. Referencing agents' credential_id becomes NULL.
Signed-in account204credential_id (path, required)
Agents
- GET
/api/v1/agentsList Agents
List all agents registered by the current user.
Signed-in accountAccepts an API key200 - POST
/api/v1/agentsCreate Agent
Register a new LLM agent (endpoint) for security testing.
Signed-in account201JSON body
- GET
/api/v1/agents/{agent_id}Get Agent
Get a specific agent by ID.
Signed-in accountAccepts an API key200agent_id (path, required)
- PUT
/api/v1/agents/{agent_id}Update Agent
Update an agent.
Signed-in account200agent_id (path, required), JSON body
- DELETE
/api/v1/agents/{agent_id}Delete Agent
Archive an agent while preserving all associated scans and evidence.
Signed-in account204agent_id (path, required)
Workspace inventory
- GET
/api/v1/inventory/agentsInventory Agents
Signed-in account200offset (query), limit (query)
- GET
/api/v1/inventory/assetsList Assets
Signed-in account200kind (query), offset (query), limit (query)
- POST
/api/v1/inventory/assetsCreate Asset
Signed-in account201JSON body
- PUT
/api/v1/inventory/assets/{asset_id}Update Asset
Signed-in account200asset_id (path, required), JSON body
- DELETE
/api/v1/inventory/assets/{asset_id}Delete Asset
Signed-in account204asset_id (path, required)
- POST
/api/v1/inventory/assets/{asset_id}/assessmentSave Vendor Assessment
Score bounded questionnaire answers and save only to the owner's vendor.
Signed-in account200asset_id (path, required), JSON body
Prompts
- GET
/api/v1/promptsList Templates
Signed-in account200 - POST
/api/v1/promptsCreate Template
Signed-in account201JSON body
- POST
/api/v1/prompts/seed-samplesSeed Samples
Create 3 illustrative starter templates for the user.
Signed-in account201JSON body
- GET
/api/v1/prompts/{template_id}Get Template
Signed-in account200template_id (path, required)
- PATCH
/api/v1/prompts/{template_id}Update Template
Update a template's name / description / category / linked agent.
Signed-in account200template_id (path, required), JSON body
- DELETE
/api/v1/prompts/{template_id}Delete Template
Signed-in account204template_id (path, required)
- POST
/api/v1/prompts/{template_id}/activate/{version_number}Activate Version
Signed-in account200template_id (path, required), version_number (path, required)
- GET
/api/v1/prompts/{template_id}/diffDiff Versions
Signed-in account200template_id (path, required), a (query, required), b (query, required)
- GET
/api/v1/prompts/{template_id}/versionsList Versions
Signed-in account200template_id (path, required)
- POST
/api/v1/prompts/{template_id}/versionsCreate Version
Signed-in account201template_id (path, required), JSON body
- GET
/api/v1/prompts/{template_id}/versions/{version_number}Get Version
Signed-in account200template_id (path, required), version_number (path, required)
- DELETE
/api/v1/prompts/{template_id}/versions/{version_number}Delete Version
Delete a single version. Refused if the version is currently active or is the only version.
Signed-in account204template_id (path, required), version_number (path, required)
Model Tools
- GET
/api/v1/model-tools/attack-catalogReturn the full attack cost catalog
Returns the complete ATTACK_COSTS catalog with all supported attack types, their descriptions, researcher hour estimates, infrastructure costs, and average token consumption per attempt. Use the attack type identifiers from this response as the 'attack_type' parameter in POST /estimate-attack-cost.
Signed-in account200 - GET
/api/v1/model-tools/card-templateReturn a fully-populated model card template
Returns a complete model card template with all required and recommended fields filled with descriptive placeholder values. Use this as a starting point when creating a model card for your AI system. Replace all placeholder values with real information before submitting to POST /validate-card.
Signed-in account200 - POST
/api/v1/model-tools/compute-roiCompute the ROI of a Secuvon scan against expected breach cost
Computes the return on investment (ROI) of running a Secuvon security scan, comparing scan cost against the expected breach cost avoidance. The model uses: (1) Attacker-equivalent cost: total attacker labour for all detected attacks. (2) Breach probability reduction: critical_findings_pct × 0.30 (NIST SP 800-30). (3) Expected loss avoidance: breach cost × probability reduction. (4) ROI ratio: loss avoidance / scan cost. Breach cost baseline defaults to $4,450,000 (IBM Cost of a Data Breach 2023).
Signed-in account200JSON body
- POST
/api/v1/model-tools/estimate-attack-costEstimate the fully-loaded cost for an attacker to mount a specific attack
Estimates the researcher time and infrastructure cost required for an attacker to mount a specific AI security attack. The fully-loaded cost combines researcher hours (at the provided hourly rate) and infrastructure costs (GPU, API calls, cloud services). Use this to quantify the value Secuvon delivers by replicating attacker workloads at a fraction of the cost.
Signed-in account200JSON body
- POST
/api/v1/model-tools/estimate-scan-costEstimate the total API and platform cost for a Secuvon scan
Estimates the token consumption and cost of running a Secuvon security scan against a given LLM model. Token costs are based on the model's published pricing (per 1M tokens). A 25% platform overhead is added on top of raw API costs to cover Secuvon orchestration, storage, and result analysis. Unknown model identifiers fall back to gpt-4o pricing with an 'is_unknown_model' flag in the response.
Signed-in account200JSON body
- POST
/api/v1/model-tools/validate-cardValidate a model card against the HuggingFace / Google MC spec
Validates an AI model card JSON object against the HuggingFace model card standard and Google Model Card Toolkit specification. Returns a structured ValidationReport with errors, warnings, a completeness score (0-100), and a letter grade (A-F). Errors indicate missing required content; warnings indicate missing recommended content. Use GET /card-template to retrieve a fully-populated starting point.
Signed-in account200JSON body
Vendor Risk
- POST
/api/v1/vendor-risk/assessSubmit a vendor assessment and receive scored risk report
Accepts a completed (or partial) vendor assessment and returns a fully scored risk report. Unanswered questions are treated as score 0 (no control present). The report includes overall risk score (0-100, lower = safer), risk rating (LOW / MEDIUM / HIGH / CRITICAL), per-domain scores, identified gaps, and prioritised recommendations.
Signed-in account200JSON body
- GET
/api/v1/vendor-risk/questionnaireGet full vendor risk assessment questionnaire
Returns all 40 assessment questions organised by domain in canonical order. Each question includes its ID, domain, full text, weight, assessor guidance, and preferred evidence type. Use this endpoint to display the questionnaire in a UI or export it for offline completion.
Signed-in account200 - GET
/api/v1/vendor-risk/templateDownload empty assessment template
Returns an empty assessment template containing all 40 questions with blank answer slots. Useful for downloading, distributing to vendors, or pre-filling a UI form before submission. Each question slot contains null score, empty notes, and empty evidence fields.
Signed-in account200
Scans
- GET
/api/v1/scansList Scans
List scans for the current user.
Signed-in accountAccepts an API key200limit (query), offset (query), agent_id (query)
- GET
/api/v1/scans/compareCompare Scans By Query
Compare current with baseline, or with the automatic baseline when baseline is omitted: the caller's most recent completed, scored scan of the same agent that finished before current.
Signed-in account200current (query, required), baseline (query)
- GET
/api/v1/scans/dashboard-statsDashboard Stats
Get aggregated dashboard statistics for the current user.
Signed-in account200 - GET
/api/v1/scans/model-comparison/modulesModel Comparison Modules
Per-model, per-module pass rates over the caller's current-corpus scans.
Signed-in account200limit (query), offset (query)
- GET
/api/v1/scans/modulesModule Catalogue
Every module the scanner loads from the corpus, with its display name, test count, profile membership (smoke, quick, release, full), the OWASP ids authored on its tests and the evaluation types it is graded with.
Signed-in account200 - GET
/api/v1/scans/profiles/readinessProfile Readiness
Which assessment profiles the active grader can run, and why not.
Signed-in account200modules (query)
- POST
/api/v1/scans/runStart Scan
Start a new security scan against a registered agent.
Signed-in accountAccepts an API key202JSON body
- GET
/api/v1/scans/{scan_id}Get Scan
Return a single scan summary in the same normalized shape the list returns.
Signed-in accountAccepts an API key200scan_id (path, required)
- DELETE
/api/v1/scans/{scan_id}Delete Scan
Delete a scan and optionally its results.
Signed-in account200scan_id (path, required), delete_results (query)
- POST
/api/v1/scans/{scan_id}/cancelCancel Scan
Cancel an in-flight scan.
Signed-in account200scan_id (path, required)
- GET
/api/v1/scans/{scan_id}/resultsGet Scan Results
Get the complete results of a completed scan.
Signed-in accountAccepts an API key200scan_id (path, required), page (query), per_page (query)
- GET
/api/v1/scans/{scan_id}/statusGet Scan Status
Get the current status of a scan.
Signed-in accountAccepts an API key200scan_id (path, required)
- GET
/api/v1/scans/{scan_id}/streamSse Scan Progress
Server-Sent Events endpoint for real-time scan progress.
Signed-in accountAccepts an API key200scan_id (path, required)
- GET
/api/v1/scans/{scan_id}/verify-integrityVerify Scan Integrity
Compare a scan's stored result hash with its result summary fields.
Signed-in account200scan_id (path, required)
Evidence
- GET
/api/v1/scans/{scan_id}/findings/{finding_id}/evidenceFull evidence trace for a finding
Return the structured evidence trace for (scan_id, finding_id).
Signed-in accountAccepts an API key200scan_id (path, required), finding_id (path, required)
- GET
/api/v1/scans/{scan_id}/findings/{finding_id}/evidence.zipDownloadable evidence bundle (JSON + transcript)
Return a zip archive containing trace.json and transcript.txt.
Signed-in accountAccepts an API key200scan_id (path, required), finding_id (path, required)
Reports
- GET
/api/v1/reports/{scan_id}/pdfDownload PDF pentest report for a scan
Generate and stream a professional PDF pentest report for the given scan.
Signed-in accountAccepts an API key200scan_id (path, required)
- GET
/api/v1/reports/{scan_id}/summaryGet JSON summary of scan data used for the PDF report
Return the structured JSON data that would be used to generate the PDF report.
Signed-in accountAccepts an API key200scan_id (path, required)
Remediation
- GET
/api/v1/findings/{finding_id}/remediationGet Remediation
Return the cached remediation plan, or generate one on first access.
Signed-in account200finding_id (path, required)
- POST
/api/v1/findings/{finding_id}/remediation/feedbackSubmit Feedback
Persist helpful/not-helpful feedback for the cached plan.
Signed-in account201finding_id (path, required), JSON body
- POST
/api/v1/findings/{finding_id}/remediation/regenerateRegenerate Remediation
Force regeneration of the plan, bypassing the cache.
Signed-in account200finding_id (path, required)
Drift
- GET
/api/v1/drift/history/{agent_id}Pass-rate history for an agent
Return the last limit scored scans of the caller's agent_id.
Signed-in account200agent_id (path, required), limit (query)
- GET
/api/v1/drift/{scan_id}Drift vs auto-resolved baseline
Compute drift for scan_id vs its automatically-resolved baseline.
Signed-in account200scan_id (path, required)
- GET
/api/v1/drift/{scan_id}/vs/{baseline_id}Drift vs explicit baseline
Compute drift between two specific scans of the same agent.
Signed-in account200scan_id (path, required), baseline_id (path, required)
Schedules
- GET
/api/v1/schedulesList Schedules
One page of the user's schedules, newest first.
Signed-in account200limit (query), offset (query)
- POST
/api/v1/schedulesCreate Schedule
Create a new scan schedule.
Signed-in account201JSON body
- GET
/api/v1/schedules/trends/{agent_id}Get Risk Trends
Get security-score trend data for an agent.
Signed-in account200agent_id (path, required), days (query)
- GET
/api/v1/schedules/{schedule_id}Get Schedule
Get details of a specific schedule.
Signed-in account200schedule_id (path, required)
- PUT
/api/v1/schedules/{schedule_id}Update Schedule
Update a schedule.
Signed-in account200schedule_id (path, required), JSON body
- DELETE
/api/v1/schedules/{schedule_id}Delete Schedule
Delete a schedule.
Signed-in account204schedule_id (path, required)
- GET
/api/v1/schedules/{schedule_id}/runsList Schedule Runs
One page of the schedule's run history, newest first.
Signed-in account200schedule_id (path, required), limit (query), offset (query)
- POST
/api/v1/schedules/{schedule_id}/triggerTrigger Schedule
Manually trigger a scheduled scan immediately.
Signed-in account202schedule_id (path, required)
Frameworks
- GET
/api/v1/frameworksList Frameworks
The framework catalogue: every framework the compliance engine tracks.
Signed-in account200 - GET
/api/v1/frameworks/coverageGet Tenant Coverage
The caller's evidence per framework and control.
Signed-in account200agent_id (query)
- GET
/api/v1/frameworks/registry/{framework_id}/testsList Control Tests
The exact corpus tests mapped to one control, in test id order.
Signed-in account200framework_id (path, required), control (query, required), limit (query), offset (query)
Policies
- GET
/api/v1/policiesList Policies
One page of the authenticated user's policies (active and inactive).
Signed-in account200limit (query), offset (query)
- POST
/api/v1/policiesCreate Policy
Create a new policy from raw YAML.
Signed-in account201JSON body
- POST
/api/v1/policies/gateDeploy Gate
CI/CD deploy gate: aggregate the caller's active policies into a verdict.
No sign-in200JSON body
- GET
/api/v1/policies/gate/decisionsList Gate Decisions
Recent CI/CD gate decisions for the caller, newest first.
Signed-in account200limit (query)
- POST
/api/v1/policies/gate/verifyVerify Gate Decision
Check that a gate decision is genuine, and say what it decided and when.
Signed-in account200JSON body
- POST
/api/v1/policies/validateValidate Policy Route
Check a policy document's structure with the engine's own parser.
Signed-in account200JSON body
- GET
/api/v1/policies/waiversList Waivers
One page of the caller's waivers, newest first.
Signed-in account200active (query), limit (query), offset (query)
- POST
/api/v1/policies/waiversCreate Waiver
Create a waiver that suppresses a matching gate failure.
Signed-in account201JSON body
- DELETE
/api/v1/policies/waivers/{waiver_id}Delete Waiver
Soft-delete a waiver (is_active = False). Owner-scoped.
Signed-in account204waiver_id (path, required)
- GET
/api/v1/policies/{policy_id}Get Policy
Signed-in account200policy_id (path, required)
- PUT
/api/v1/policies/{policy_id}Update Policy
Update YAML source and/or active flag. Bumps version on YAML change.
Signed-in account200policy_id (path, required), JSON body
- DELETE
/api/v1/policies/{policy_id}Delete Policy
Signed-in account204policy_id (path, required)
- POST
/api/v1/policies/{policy_id}/evaluateEvaluate Policy Route
Evaluate a policy against a scan owned by the same user.
Signed-in account200policy_id (path, required), JSON body
- GET
/api/v1/policies/{policy_id}/evaluationsList Policy Evaluations
A policy's stored evaluations, newest first, one page at a time.
Signed-in account200policy_id (path, required), limit (query), offset (query)
- POST
/api/v1/policies/{policy_id}/impactPolicy Impact
Dry-run a policy against the caller's most recent completed scans.
Signed-in account200policy_id (path, required), JSON body
Benchmark
- GET
/api/v1/benchmark/posture/currentCurrent security posture
The caller's security posture now, from each agent's latest scored scan.
Signed-in account200 - GET
/api/v1/benchmark/posture/historySecurity posture snapshot history
Return the caller's own daily security posture snapshots, newest first.
Signed-in account200days (query)
Audit Packs
- GET
/api/v1/audit-packsList Packs
Signed-in account200limit (query), offset (query)
- POST
/api/v1/audit-packsQueue Pack
Signed-in account202JSON body
- GET
/api/v1/audit-packs/{pack_id}Get Pack
Signed-in account200pack_id (path, required)
- DELETE
/api/v1/audit-packs/{pack_id}Delete Pack
Signed-in account204pack_id (path, required)
- GET
/api/v1/audit-packs/{pack_id}/downloadDownload Pack
Signed-in account200pack_id (path, required), format (query)
Guardian
- GET
/api/v1/guardian/rulesList Builtin Rules
List available built-in guardian rules.
Signed-in account200 - GET
/api/v1/guardian/{agent_id}/activityGet Guardian Activity
Get recent guardian inspection events for an agent (newest first).
Signed-in account200agent_id (path, required), limit (query)
- GET
/api/v1/guardian/{agent_id}/anomaliesGet Guardian Anomalies
Detect behavioral anomalies for an agent over its Guardian telemetry.
Signed-in account200agent_id (path, required)
- GET
/api/v1/guardian/{agent_id}/configGet Guardian Config
Get guardian configuration for an agent.
Signed-in account200agent_id (path, required)
- POST
/api/v1/guardian/{agent_id}/configCreate Update Guardian Config
Create or update guardian configuration for an agent.
Signed-in account201agent_id (path, required), JSON body
- DELETE
/api/v1/guardian/{agent_id}/configDelete Guardian Config
Disable guardian for an agent.
Signed-in account204agent_id (path, required)
- GET
/api/v1/guardian/{agent_id}/gateway-keysList Gateway Keys
Signed-in account200agent_id (path, required)
- POST
/api/v1/guardian/{agent_id}/gateway-keysCreate Gateway Key
Signed-in account201agent_id (path, required), JSON body
- DELETE
/api/v1/guardian/{agent_id}/gateway-keys/{key_id}Revoke Gateway Key
Signed-in account204agent_id (path, required), key_id (path, required)
- POST
/api/v1/guardian/{agent_id}/inspectInspect Message
Inspect a message through the guardian.
Signed-in account200agent_id (path, required), JSON body
- GET
/api/v1/guardian/{agent_id}/latencyPer-agent Guardian latency summary (JSON)
Return a JSON p50/p95/p99 latency summary for a single agent.
Signed-in account200agent_id (path, required)
- POST
/api/v1/guardian/{agent_id}/rulesAdd Custom Rule
Add a custom rule to an agent's guardian.
Signed-in account201agent_id (path, required), JSON body
- GET
/api/v1/guardian/{agent_id}/statsGet Guardian Stats
Get guardian statistics for an agent.
Signed-in account200agent_id (path, required)
Guardian BYOK Gateway
- POST
/api/v1/proxy/anthropic/v1/messagesAnthropic
No sign-in200 - POST
/api/v1/proxy/openai/v1/chat/completionsOpenai
No sign-in200
Guardian Runtime Decisions
- GET
/api/v1/runtime/eventsEvents
Signed-in account200limit (query), offset (query), agent_id (query), reason (query), verdict (query)
- GET
/api/v1/runtime/exportExport
Signed-in account200
Agent Sessions
- GET
/api/v1/sessionsList Sessions
List the caller's agent sessions, optionally filtered by agent.
Signed-in account200agent_id (query), limit (query), offset (query)
- GET
/api/v1/sessions/{session_id}Get Session
Fetch a single session header. Ownership-checked.
Signed-in account200session_id (path, required)
- GET
/api/v1/sessions/{session_id}/replayReplay Session
Return the ordered, redaction-safe timeline for a session.
Signed-in account200session_id (path, required)
Teams
- GET
/api/v1/teamsList Teams
The workspaces you belong to, the one you founded first.
Signed-in account200 - POST
/api/v1/teams/invites/acceptAccept Invite
Join a workspace with an invitation addressed to your account.
Signed-in account200JSON body
- POST
/api/v1/teams/invites/lookupLookup Invite
What an invitation link offers the signed-in account.
Signed-in account200JSON body
- GET
/api/v1/teams/{team_id}Get Team
One workspace: your role, what it lets you do, and its seats.
Signed-in account200team_id (path, required)
- GET
/api/v1/teams/{team_id}/dashboardGet Team Dashboard
The workspace's own completed assessments (scans:read).
Signed-in account200team_id (path, required)
- GET
/api/v1/teams/{team_id}/invitesList Invites
Open invitations, newest first (team:invite).
Signed-in account200team_id (path, required), limit (query), cursor (query)
- POST
/api/v1/teams/{team_id}/invitesCreate Invite
Invite an address with a role (team:invite), within the plan's seats.
Signed-in account201team_id (path, required), JSON body
- DELETE
/api/v1/teams/{team_id}/invites/{invite_id}Revoke Invite
Withdraw an open invitation; its link stops working at once.
Signed-in account204team_id (path, required), invite_id (path, required)
- POST
/api/v1/teams/{team_id}/invites/{invite_id}/resendResend Invite
A fresh link and expiry for an open invitation; the old link stops working.
Signed-in account200team_id (path, required), invite_id (path, required)
- GET
/api/v1/teams/{team_id}/membersList Members
The workspace's members, the founder first. Any member may read it.
Signed-in account200team_id (path, required), limit (query), cursor (query)
- DELETE
/api/v1/teams/{team_id}/members/{user_id}Remove Member
Remove a member (team:remove), or leave the workspace yourself.
Signed-in account204team_id (path, required), user_id (path, required)
- PUT
/api/v1/teams/{team_id}/members/{user_id}/roleChange Member Role
Give a member another role (rbac:manage).
Signed-in account200team_id (path, required), user_id (path, required), JSON body
RBAC
- GET
/api/v1/rbac/permissionsList Permissions
The permission catalogue custom roles are built from.
Signed-in account200 - GET
/api/v1/rbac/rolesList Roles
Built-in and custom roles, each with its permissions and pages.
Signed-in account200org_id (query)
- POST
/api/v1/rbac/rolesCreate Custom Role
Create a custom role from catalogue permissions (rbac:manage).
Signed-in account201JSON body
- PUT
/api/v1/rbac/roles/{role_id}Update Custom Role
Rename a custom role or replace its permissions (rbac:manage).
Signed-in account200role_id (path, required), JSON body
- DELETE
/api/v1/rbac/roles/{role_id}Delete Custom Role
Delete a custom role nobody holds or is offered (rbac:manage).
Signed-in account204role_id (path, required), org_id (query)
SSO
- GET
/api/v1/sso/admin/configsList Configs
Signed-in account200org_id (query, required)
- POST
/api/v1/sso/admin/configsCreate Config
Signed-in account201JSON body
- PUT
/api/v1/sso/admin/configs/{config_id}Update Config
Signed-in account200config_id (path, required), org_id (query, required), JSON body
- DELETE
/api/v1/sso/admin/configs/{config_id}Delete Config
Signed-in account204config_id (path, required), org_id (query, required)
- POST
/api/v1/sso/admin/configs/{config_id}/linkLink Identity
Signed-in account200config_id (path, required), org_id (query, required)
- DELETE
/api/v1/sso/admin/configs/{config_id}/linkUnlink Identity
Signed-in account204config_id (path, required), org_id (query, required)
- GET
/api/v1/sso/mfa/challengeMfa Challenge
No sign-in200 - GET
/api/v1/sso/{org_slug}/callbackSso Callback
No sign-in200org_slug (path, required)
- POST
/api/v1/sso/{org_slug}/callbackSso Callback
No sign-in200org_slug (path, required)
- GET
/api/v1/sso/{org_slug}/loginSso Login
No sign-in200org_slug (path, required)
- GET
/api/v1/sso/{org_slug}/metadata.xmlMetadata
No sign-in200org_slug (path, required)
SCIM
- GET
/scim/admin/tokensList Tokens
Signed-in account200org_id (query, required)
- POST
/scim/admin/tokensIssue Token
Signed-in account201JSON body
- DELETE
/scim/admin/tokens/{token_id}Revoke Token
Signed-in account204token_id (path, required), org_id (query, required)
- GET
/scim/v2/GroupsList Groups
No sign-in200startIndex (query), count (query)
- POST
/scim/v2/GroupsCreate Group
No sign-in201 - GET
/scim/v2/Groups/{group_id}Get Group
No sign-in200group_id (path, required)
- PUT
/scim/v2/Groups/{group_id}Update Group
No sign-in200group_id (path, required)
- PATCH
/scim/v2/Groups/{group_id}Update Group
No sign-in200group_id (path, required)
- DELETE
/scim/v2/Groups/{group_id}Delete Group
No sign-in204group_id (path, required)
- GET
/scim/v2/ResourceTypesTypes Route
No sign-in200 - GET
/scim/v2/SchemasSchemas Route
No sign-in200 - GET
/scim/v2/ServiceProviderConfigConfig Route
No sign-in200 - GET
/scim/v2/UsersList Users
No sign-in200filter (query), startIndex (query), count (query)
- POST
/scim/v2/UsersCreate User
No sign-in201 - GET
/scim/v2/Users/{user_id}Get User
No sign-in200user_id (path, required)
- PUT
/scim/v2/Users/{user_id}Replace User
No sign-in200user_id (path, required)
- PATCH
/scim/v2/Users/{user_id}Patch User
No sign-in200user_id (path, required)
- DELETE
/scim/v2/Users/{user_id}Delete User
No sign-in204user_id (path, required)
SCIM Admin
- GET
/api/v1/scim/admin/tokensList Tokens
Signed-in account200org_id (query, required)
- POST
/api/v1/scim/admin/tokensIssue Token
Signed-in account201JSON body
- DELETE
/api/v1/scim/admin/tokens/{token_id}Revoke Token
Signed-in account204token_id (path, required), org_id (query, required)
Retention
- GET
/api/v1/retention/configGet Config
The workspace's retention windows, its plan's bounds and the purge.
Signed-in account200org_id (query)
- PUT
/api/v1/retention/configUpdate Config
Set the workspace's windows within its plan (retention:manage).
Signed-in account200JSON body
Webhooks
- GET
/api/v1/webhooksList Webhooks
One page of the workspace's channels (integrations:read).
Signed-in account200org_id (query), limit (query), cursor (query)
- POST
/api/v1/webhooksCreate Webhook
Add a channel to the workspace (integrations:manage).
Signed-in account201org_id (query), JSON body
- GET
/api/v1/webhooks/eventsList Events
What a channel can subscribe to, and the channel types this release has.
Signed-in account200 - GET
/api/v1/webhooks/historyGet Webhook History
The delivery log: up to 20 recent outcomes per channel, with status codes, attempt numbers and scheduled retries (integrations:read).
Signed-in account200org_id (query), limit (query), cursor (query)
- GET
/api/v1/webhooks/{webhook_id}Get Webhook
One channel of the workspace (integrations:read).
Signed-in account200webhook_id (path, required), org_id (query)
- PUT
/api/v1/webhooks/{webhook_id}Update Webhook
Change a channel (integrations:manage).
Signed-in account200webhook_id (path, required), org_id (query), JSON body
- DELETE
/api/v1/webhooks/{webhook_id}Delete Webhook
Delete a channel and stop its retries (integrations:manage).
Signed-in account204webhook_id (path, required), org_id (query)
- POST
/api/v1/webhooks/{webhook_id}/rotate-secretRotate Signing Secret
Replace a signed channel's secret; the new one is returned once and signs every later delivery (integrations:manage).
Signed-in account200webhook_id (path, required), org_id (query)
- POST
/api/v1/webhooks/{webhook_id}/testTest Webhook
Send one REAL test delivery and report its REAL outcome.
Signed-in account202webhook_id (path, required), org_id (query)
API Keys
- GET
/api/v1/api-keysList Api Keys
Signed-in account200limit (query), offset (query)
- POST
/api/v1/api-keysCreate Api Key
Signed-in account201JSON body
- DELETE
/api/v1/api-keys/{key_id}Revoke Api Key
Signed-in account204key_id (path, required)
Billing
- POST
/api/v1/billing/checkoutCreate Checkout Session
Create a Stripe Checkout session for the requested plan.
Signed-in account200 - GET
/api/v1/billing/plansGet Public Plans
Public, cacheable plan catalogue for the pricing and upgrade surfaces.
No sign-in200 - POST
/api/v1/billing/portalCreate Portal Session
Create a Stripe customer portal session for self-serve billing management.
Signed-in account200 - GET
/api/v1/billing/statusGet Billing Status
Return legacy Stripe state plus authoritative organisation entitlements.
Signed-in account200
Product
- GET
/api/v1/product/capabilitiesGet Product Capabilities
No sign-in200
Blog
- GET
/api/v1/blogList Blog Posts
List published blog posts with optional category filter and pagination.
No sign-in200category (query), page (query), page_size (query)
- GET
/api/v1/blog/categoriesList Categories
List blog categories with the number of published posts in each.
No sign-in200 - GET
/api/v1/blog/{slug}Get Blog Post
Get a single published blog post by its slug.
No sign-in200slug (path, required)
Facts
- GET
/api/v1/factsList Module Facts
List every module fact, ordered by module name.
No sign-in200
Contact
- POST
/api/v1/contactSubmit Contact
Record a contact-form message from the public site.
No sign-in201JSON body
Newsletter
- POST
/api/newsletter/confirmConfirm
Record consent only after the mailbox holder uses the emailed link.
No sign-in200JSON body
- POST
/api/newsletter/subscribeSubscribe
Send a confirmation email; no one is subscribed by this request alone.
No sign-in200JSON body
- POST
/api/newsletter/unsubscribeUnsubscribe
Withdraw marketing consent using the token included in email.
No sign-in200JSON body
Email Preferences
- GET
/api/v1/email-preferences/meRead My Email Preferences
Whether this account has current, confirmed newsletter consent.
Signed-in account200 - PUT
/api/v1/email-preferences/meUpdate My Email Preferences
Withdraw marketing consent for the signed-in account's address.
Signed-in account200JSON body
- POST
/api/v1/email-preferences/onboarding/unsubscribeUnsubscribe Onboarding
Stop the onboarding emails (founder note and nudge) for one account.
No sign-in200token (query)
Feedback
- POST
/api/v1/feedbackSubmit Feedback
Record feedback from the signed-in user and notify the founder inbox.
Signed-in account201JSON body
Health
- GET
/healthHealth Check
Public health: is this API process up and serving.
No sign-in200
Root
- GET
/Root
Root endpoint with API information.
No sign-in200