Skip to main content

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

  1. 01Get an accountCreate a free account at Sign up, then activate it from the email we send.
  2. 02Save a provider keyOpen Settings, then Credentials, and save the key for the provider your agent runs on.
  3. 03Save the agentOpen Agents and add the agent you want to assess: its provider, its model and the saved credential.
  4. 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.
  5. 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 progress

The 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.sarif

It 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 progress

The 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 progress

In 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/account

    Delete Account

    Permanently close the current user's account.

    Signed-in account200

    JSON body

  • POST/api/v1/auth/change-password

    Change Password

    Change the current user's password.

    Signed-in account200

    JSON body

  • POST/api/v1/auth/forgot-password

    Forgot Password

    Request a password reset email.

    No sign-in200

    JSON body

  • POST/api/v1/auth/login

    Login

    Authenticate user and return JWT tokens.

    No sign-in200

    JSON body

  • POST/api/v1/auth/logout

    Logout

    Logout the current user.

    Signed-in account200

    JSON body

  • GET/api/v1/auth/me

    Get Current User Profile

    Get current authenticated user's profile.

    Signed-in account200
  • PUT/api/v1/auth/me

    Update Profile

    Update the current user's profile.

    Signed-in account200

    JSON body

  • DELETE/api/v1/auth/mfa

    Mfa Disable

    Disable MFA for the current user.

    Signed-in account200

    JSON body

  • POST/api/v1/auth/mfa/setup

    Mfa Setup

    Initiate MFA setup by generating a TOTP secret.

    Signed-in account200
  • POST/api/v1/auth/mfa/verify

    Mfa Verify Login

    Complete login by verifying MFA code after initial password authentication.

    No sign-in200

    JSON body

  • POST/api/v1/auth/mfa/verify-setup

    Mfa Verify Setup

    Verify MFA setup by confirming a TOTP code from the user's authenticator app.

    Signed-in account200

    JSON body

  • POST/api/v1/auth/refresh

    Refresh

    Obtain a new access token using a refresh token.

    No sign-in200

    JSON body

  • POST/api/v1/auth/register

    Register

    Register a new user account.

    No sign-in201

    JSON body

  • POST/api/v1/auth/resend-verification

    Resend Verification

    Send a new activation link to an account that is waiting for one.

    No sign-in200

    JSON body

  • POST/api/v1/auth/reset-password

    Reset Password

    Reset password using a valid reset token.

    No sign-in200

    JSON body

  • POST/api/v1/auth/send-verification

    Send Verification

    Send an email verification link to the current user.

    Signed-in account200
  • POST/api/v1/auth/verify-email

    Verify Email

    Activate an account when the mailbox holder accepts the current Terms.

    No sign-in200

    JSON body

Credentials

  • GET/api/v1/credentials

    List Credentials

    List the authenticated user's credentials, newest first. Never leaks keys.

    Signed-in account200
  • POST/api/v1/credentials

    Create Credential

    Create a credential, encrypting the key at rest. Returns no key.

    Signed-in account201

    JSON body

  • GET/api/v1/credentials/{credential_id}

    Get Credential

    Fetch a single credential owned by the caller. Never leaks the key.

    Signed-in account200

    credential_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 account200

    credential_id (path, required), JSON body

  • DELETE/api/v1/credentials/{credential_id}

    Delete Credential

    Delete a credential. Referencing agents' credential_id becomes NULL.

    Signed-in account204

    credential_id (path, required)

Agents

  • GET/api/v1/agents

    List Agents

    List all agents registered by the current user.

    Signed-in accountAccepts an API key200
  • POST/api/v1/agents

    Create Agent

    Register a new LLM agent (endpoint) for security testing.

    Signed-in account201

    JSON body

  • GET/api/v1/agents/{agent_id}

    Get Agent

    Get a specific agent by ID.

    Signed-in accountAccepts an API key200

    agent_id (path, required)

  • PUT/api/v1/agents/{agent_id}

    Update Agent

    Update an agent.

    Signed-in account200

    agent_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 account204

    agent_id (path, required)

Workspace inventory

  • GET/api/v1/inventory/agents

    Inventory Agents

    Signed-in account200

    offset (query), limit (query)

  • GET/api/v1/inventory/assets

    List Assets

    Signed-in account200

    kind (query), offset (query), limit (query)

  • POST/api/v1/inventory/assets

    Create Asset

    Signed-in account201

    JSON body

  • PUT/api/v1/inventory/assets/{asset_id}

    Update Asset

    Signed-in account200

    asset_id (path, required), JSON body

  • DELETE/api/v1/inventory/assets/{asset_id}

    Delete Asset

    Signed-in account204

    asset_id (path, required)

  • POST/api/v1/inventory/assets/{asset_id}/assessment

    Save Vendor Assessment

    Score bounded questionnaire answers and save only to the owner's vendor.

    Signed-in account200

    asset_id (path, required), JSON body

Prompts

  • GET/api/v1/prompts

    List Templates

    Signed-in account200
  • POST/api/v1/prompts

    Create Template

    Signed-in account201

    JSON body

  • POST/api/v1/prompts/seed-samples

    Seed Samples

    Create 3 illustrative starter templates for the user.

    Signed-in account201

    JSON body

  • GET/api/v1/prompts/{template_id}

    Get Template

    Signed-in account200

    template_id (path, required)

  • PATCH/api/v1/prompts/{template_id}

    Update Template

    Update a template's name / description / category / linked agent.

    Signed-in account200

    template_id (path, required), JSON body

  • DELETE/api/v1/prompts/{template_id}

    Delete Template

    Signed-in account204

    template_id (path, required)

  • POST/api/v1/prompts/{template_id}/activate/{version_number}

    Activate Version

    Signed-in account200

    template_id (path, required), version_number (path, required)

  • GET/api/v1/prompts/{template_id}/diff

    Diff Versions

    Signed-in account200

    template_id (path, required), a (query, required), b (query, required)

  • GET/api/v1/prompts/{template_id}/versions

    List Versions

    Signed-in account200

    template_id (path, required)

  • POST/api/v1/prompts/{template_id}/versions

    Create Version

    Signed-in account201

    template_id (path, required), JSON body

  • GET/api/v1/prompts/{template_id}/versions/{version_number}

    Get Version

    Signed-in account200

    template_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 account204

    template_id (path, required), version_number (path, required)

Model Tools

  • GET/api/v1/model-tools/attack-catalog

    Return 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-template

    Return 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-roi

    Compute 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 account200

    JSON body

  • POST/api/v1/model-tools/estimate-attack-cost

    Estimate 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 account200

    JSON body

  • POST/api/v1/model-tools/estimate-scan-cost

    Estimate 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 account200

    JSON body

  • POST/api/v1/model-tools/validate-card

    Validate 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 account200

    JSON body

Vendor Risk

  • POST/api/v1/vendor-risk/assess

    Submit 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 account200

    JSON body

  • GET/api/v1/vendor-risk/questionnaire

    Get 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/template

    Download 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/scans

    List Scans

    List scans for the current user.

    Signed-in accountAccepts an API key200

    limit (query), offset (query), agent_id (query)

  • GET/api/v1/scans/compare

    Compare 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 account200

    current (query, required), baseline (query)

  • GET/api/v1/scans/dashboard-stats

    Dashboard Stats

    Get aggregated dashboard statistics for the current user.

    Signed-in account200
  • GET/api/v1/scans/model-comparison/modules

    Model Comparison Modules

    Per-model, per-module pass rates over the caller's current-corpus scans.

    Signed-in account200

    limit (query), offset (query)

  • GET/api/v1/scans/modules

    Module 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/readiness

    Profile Readiness

    Which assessment profiles the active grader can run, and why not.

    Signed-in account200

    modules (query)

  • POST/api/v1/scans/run

    Start Scan

    Start a new security scan against a registered agent.

    Signed-in accountAccepts an API key202

    JSON 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 key200

    scan_id (path, required)

  • DELETE/api/v1/scans/{scan_id}

    Delete Scan

    Delete a scan and optionally its results.

    Signed-in account200

    scan_id (path, required), delete_results (query)

  • POST/api/v1/scans/{scan_id}/cancel

    Cancel Scan

    Cancel an in-flight scan.

    Signed-in account200

    scan_id (path, required)

  • GET/api/v1/scans/{scan_id}/results

    Get Scan Results

    Get the complete results of a completed scan.

    Signed-in accountAccepts an API key200

    scan_id (path, required), page (query), per_page (query)

  • GET/api/v1/scans/{scan_id}/status

    Get Scan Status

    Get the current status of a scan.

    Signed-in accountAccepts an API key200

    scan_id (path, required)

  • GET/api/v1/scans/{scan_id}/stream

    Sse Scan Progress

    Server-Sent Events endpoint for real-time scan progress.

    Signed-in accountAccepts an API key200

    scan_id (path, required)

  • GET/api/v1/scans/{scan_id}/verify-integrity

    Verify Scan Integrity

    Compare a scan's stored result hash with its result summary fields.

    Signed-in account200

    scan_id (path, required)

Evidence

  • GET/api/v1/scans/{scan_id}/findings/{finding_id}/evidence

    Full evidence trace for a finding

    Return the structured evidence trace for (scan_id, finding_id).

    Signed-in accountAccepts an API key200

    scan_id (path, required), finding_id (path, required)

  • GET/api/v1/scans/{scan_id}/findings/{finding_id}/evidence.zip

    Downloadable evidence bundle (JSON + transcript)

    Return a zip archive containing trace.json and transcript.txt.

    Signed-in accountAccepts an API key200

    scan_id (path, required), finding_id (path, required)

Reports

  • GET/api/v1/reports/{scan_id}/pdf

    Download PDF pentest report for a scan

    Generate and stream a professional PDF pentest report for the given scan.

    Signed-in accountAccepts an API key200

    scan_id (path, required)

  • GET/api/v1/reports/{scan_id}/summary

    Get 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 key200

    scan_id (path, required)

Remediation

  • GET/api/v1/findings/{finding_id}/remediation

    Get Remediation

    Return the cached remediation plan, or generate one on first access.

    Signed-in account200

    finding_id (path, required)

  • POST/api/v1/findings/{finding_id}/remediation/feedback

    Submit Feedback

    Persist helpful/not-helpful feedback for the cached plan.

    Signed-in account201

    finding_id (path, required), JSON body

  • POST/api/v1/findings/{finding_id}/remediation/regenerate

    Regenerate Remediation

    Force regeneration of the plan, bypassing the cache.

    Signed-in account200

    finding_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 account200

    agent_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 account200

    scan_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 account200

    scan_id (path, required), baseline_id (path, required)

Schedules

  • GET/api/v1/schedules

    List Schedules

    One page of the user's schedules, newest first.

    Signed-in account200

    limit (query), offset (query)

  • POST/api/v1/schedules

    Create Schedule

    Create a new scan schedule.

    Signed-in account201

    JSON body

  • GET/api/v1/schedules/trends/{agent_id}

    Get Risk Trends

    Get security-score trend data for an agent.

    Signed-in account200

    agent_id (path, required), days (query)

  • GET/api/v1/schedules/{schedule_id}

    Get Schedule

    Get details of a specific schedule.

    Signed-in account200

    schedule_id (path, required)

  • PUT/api/v1/schedules/{schedule_id}

    Update Schedule

    Update a schedule.

    Signed-in account200

    schedule_id (path, required), JSON body

  • DELETE/api/v1/schedules/{schedule_id}

    Delete Schedule

    Delete a schedule.

    Signed-in account204

    schedule_id (path, required)

  • GET/api/v1/schedules/{schedule_id}/runs

    List Schedule Runs

    One page of the schedule's run history, newest first.

    Signed-in account200

    schedule_id (path, required), limit (query), offset (query)

  • POST/api/v1/schedules/{schedule_id}/trigger

    Trigger Schedule

    Manually trigger a scheduled scan immediately.

    Signed-in account202

    schedule_id (path, required)

Frameworks

  • GET/api/v1/frameworks

    List Frameworks

    The framework catalogue: every framework the compliance engine tracks.

    Signed-in account200
  • GET/api/v1/frameworks/coverage

    Get Tenant Coverage

    The caller's evidence per framework and control.

    Signed-in account200

    agent_id (query)

  • GET/api/v1/frameworks/registry/{framework_id}/tests

    List Control Tests

    The exact corpus tests mapped to one control, in test id order.

    Signed-in account200

    framework_id (path, required), control (query, required), limit (query), offset (query)

Policies

  • GET/api/v1/policies

    List Policies

    One page of the authenticated user's policies (active and inactive).

    Signed-in account200

    limit (query), offset (query)

  • POST/api/v1/policies

    Create Policy

    Create a new policy from raw YAML.

    Signed-in account201

    JSON body

  • POST/api/v1/policies/gate

    Deploy Gate

    CI/CD deploy gate: aggregate the caller's active policies into a verdict.

    No sign-in200

    JSON body

  • GET/api/v1/policies/gate/decisions

    List Gate Decisions

    Recent CI/CD gate decisions for the caller, newest first.

    Signed-in account200

    limit (query)

  • POST/api/v1/policies/gate/verify

    Verify Gate Decision

    Check that a gate decision is genuine, and say what it decided and when.

    Signed-in account200

    JSON body

  • POST/api/v1/policies/validate

    Validate Policy Route

    Check a policy document's structure with the engine's own parser.

    Signed-in account200

    JSON body

  • GET/api/v1/policies/waivers

    List Waivers

    One page of the caller's waivers, newest first.

    Signed-in account200

    active (query), limit (query), offset (query)

  • POST/api/v1/policies/waivers

    Create Waiver

    Create a waiver that suppresses a matching gate failure.

    Signed-in account201

    JSON body

  • DELETE/api/v1/policies/waivers/{waiver_id}

    Delete Waiver

    Soft-delete a waiver (is_active = False). Owner-scoped.

    Signed-in account204

    waiver_id (path, required)

  • GET/api/v1/policies/{policy_id}

    Get Policy

    Signed-in account200

    policy_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 account200

    policy_id (path, required), JSON body

  • DELETE/api/v1/policies/{policy_id}

    Delete Policy

    Signed-in account204

    policy_id (path, required)

  • POST/api/v1/policies/{policy_id}/evaluate

    Evaluate Policy Route

    Evaluate a policy against a scan owned by the same user.

    Signed-in account200

    policy_id (path, required), JSON body

  • GET/api/v1/policies/{policy_id}/evaluations

    List Policy Evaluations

    A policy's stored evaluations, newest first, one page at a time.

    Signed-in account200

    policy_id (path, required), limit (query), offset (query)

  • POST/api/v1/policies/{policy_id}/impact

    Policy Impact

    Dry-run a policy against the caller's most recent completed scans.

    Signed-in account200

    policy_id (path, required), JSON body

Benchmark

  • GET/api/v1/benchmark/posture/current

    Current security posture

    The caller's security posture now, from each agent's latest scored scan.

    Signed-in account200
  • GET/api/v1/benchmark/posture/history

    Security posture snapshot history

    Return the caller's own daily security posture snapshots, newest first.

    Signed-in account200

    days (query)

Audit Packs

  • GET/api/v1/audit-packs

    List Packs

    Signed-in account200

    limit (query), offset (query)

  • POST/api/v1/audit-packs

    Queue Pack

    Signed-in account202

    JSON body

  • GET/api/v1/audit-packs/{pack_id}

    Get Pack

    Signed-in account200

    pack_id (path, required)

  • DELETE/api/v1/audit-packs/{pack_id}

    Delete Pack

    Signed-in account204

    pack_id (path, required)

  • GET/api/v1/audit-packs/{pack_id}/download

    Download Pack

    Signed-in account200

    pack_id (path, required), format (query)

Guardian

  • GET/api/v1/guardian/rules

    List Builtin Rules

    List available built-in guardian rules.

    Signed-in account200
  • GET/api/v1/guardian/{agent_id}/activity

    Get Guardian Activity

    Get recent guardian inspection events for an agent (newest first).

    Signed-in account200

    agent_id (path, required), limit (query)

  • GET/api/v1/guardian/{agent_id}/anomalies

    Get Guardian Anomalies

    Detect behavioral anomalies for an agent over its Guardian telemetry.

    Signed-in account200

    agent_id (path, required)

  • GET/api/v1/guardian/{agent_id}/config

    Get Guardian Config

    Get guardian configuration for an agent.

    Signed-in account200

    agent_id (path, required)

  • POST/api/v1/guardian/{agent_id}/config

    Create Update Guardian Config

    Create or update guardian configuration for an agent.

    Signed-in account201

    agent_id (path, required), JSON body

  • DELETE/api/v1/guardian/{agent_id}/config

    Delete Guardian Config

    Disable guardian for an agent.

    Signed-in account204

    agent_id (path, required)

  • GET/api/v1/guardian/{agent_id}/gateway-keys

    List Gateway Keys

    Signed-in account200

    agent_id (path, required)

  • POST/api/v1/guardian/{agent_id}/gateway-keys

    Create Gateway Key

    Signed-in account201

    agent_id (path, required), JSON body

  • DELETE/api/v1/guardian/{agent_id}/gateway-keys/{key_id}

    Revoke Gateway Key

    Signed-in account204

    agent_id (path, required), key_id (path, required)

  • POST/api/v1/guardian/{agent_id}/inspect

    Inspect Message

    Inspect a message through the guardian.

    Signed-in account200

    agent_id (path, required), JSON body

  • GET/api/v1/guardian/{agent_id}/latency

    Per-agent Guardian latency summary (JSON)

    Return a JSON p50/p95/p99 latency summary for a single agent.

    Signed-in account200

    agent_id (path, required)

  • POST/api/v1/guardian/{agent_id}/rules

    Add Custom Rule

    Add a custom rule to an agent's guardian.

    Signed-in account201

    agent_id (path, required), JSON body

  • GET/api/v1/guardian/{agent_id}/stats

    Get Guardian Stats

    Get guardian statistics for an agent.

    Signed-in account200

    agent_id (path, required)

Guardian BYOK Gateway

  • POST/api/v1/proxy/anthropic/v1/messages

    Anthropic

    No sign-in200
  • POST/api/v1/proxy/openai/v1/chat/completions

    Openai

    No sign-in200

Guardian Runtime Decisions

  • GET/api/v1/runtime/events

    Events

    Signed-in account200

    limit (query), offset (query), agent_id (query), reason (query), verdict (query)

  • GET/api/v1/runtime/export

    Export

    Signed-in account200

Agent Sessions

  • GET/api/v1/sessions

    List Sessions

    List the caller's agent sessions, optionally filtered by agent.

    Signed-in account200

    agent_id (query), limit (query), offset (query)

  • GET/api/v1/sessions/{session_id}

    Get Session

    Fetch a single session header. Ownership-checked.

    Signed-in account200

    session_id (path, required)

  • GET/api/v1/sessions/{session_id}/replay

    Replay Session

    Return the ordered, redaction-safe timeline for a session.

    Signed-in account200

    session_id (path, required)

Teams

  • GET/api/v1/teams

    List Teams

    The workspaces you belong to, the one you founded first.

    Signed-in account200
  • POST/api/v1/teams/invites/accept

    Accept Invite

    Join a workspace with an invitation addressed to your account.

    Signed-in account200

    JSON body

  • POST/api/v1/teams/invites/lookup

    Lookup Invite

    What an invitation link offers the signed-in account.

    Signed-in account200

    JSON body

  • GET/api/v1/teams/{team_id}

    Get Team

    One workspace: your role, what it lets you do, and its seats.

    Signed-in account200

    team_id (path, required)

  • GET/api/v1/teams/{team_id}/dashboard

    Get Team Dashboard

    The workspace's own completed assessments (scans:read).

    Signed-in account200

    team_id (path, required)

  • GET/api/v1/teams/{team_id}/invites

    List Invites

    Open invitations, newest first (team:invite).

    Signed-in account200

    team_id (path, required), limit (query), cursor (query)

  • POST/api/v1/teams/{team_id}/invites

    Create Invite

    Invite an address with a role (team:invite), within the plan's seats.

    Signed-in account201

    team_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 account204

    team_id (path, required), invite_id (path, required)

  • POST/api/v1/teams/{team_id}/invites/{invite_id}/resend

    Resend Invite

    A fresh link and expiry for an open invitation; the old link stops working.

    Signed-in account200

    team_id (path, required), invite_id (path, required)

  • GET/api/v1/teams/{team_id}/members

    List Members

    The workspace's members, the founder first. Any member may read it.

    Signed-in account200

    team_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 account204

    team_id (path, required), user_id (path, required)

  • PUT/api/v1/teams/{team_id}/members/{user_id}/role

    Change Member Role

    Give a member another role (rbac:manage).

    Signed-in account200

    team_id (path, required), user_id (path, required), JSON body

RBAC

  • GET/api/v1/rbac/permissions

    List Permissions

    The permission catalogue custom roles are built from.

    Signed-in account200
  • GET/api/v1/rbac/roles

    List Roles

    Built-in and custom roles, each with its permissions and pages.

    Signed-in account200

    org_id (query)

  • POST/api/v1/rbac/roles

    Create Custom Role

    Create a custom role from catalogue permissions (rbac:manage).

    Signed-in account201

    JSON body

  • PUT/api/v1/rbac/roles/{role_id}

    Update Custom Role

    Rename a custom role or replace its permissions (rbac:manage).

    Signed-in account200

    role_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 account204

    role_id (path, required), org_id (query)

SSO

  • GET/api/v1/sso/admin/configs

    List Configs

    Signed-in account200

    org_id (query, required)

  • POST/api/v1/sso/admin/configs

    Create Config

    Signed-in account201

    JSON body

  • PUT/api/v1/sso/admin/configs/{config_id}

    Update Config

    Signed-in account200

    config_id (path, required), org_id (query, required), JSON body

  • DELETE/api/v1/sso/admin/configs/{config_id}

    Delete Config

    Signed-in account204

    config_id (path, required), org_id (query, required)

  • POST/api/v1/sso/admin/configs/{config_id}/link

    Link Identity

    Signed-in account200

    config_id (path, required), org_id (query, required)

  • DELETE/api/v1/sso/admin/configs/{config_id}/link

    Unlink Identity

    Signed-in account204

    config_id (path, required), org_id (query, required)

  • GET/api/v1/sso/mfa/challenge

    Mfa Challenge

    No sign-in200
  • GET/api/v1/sso/{org_slug}/callback

    Sso Callback

    No sign-in200

    org_slug (path, required)

  • POST/api/v1/sso/{org_slug}/callback

    Sso Callback

    No sign-in200

    org_slug (path, required)

  • GET/api/v1/sso/{org_slug}/login

    Sso Login

    No sign-in200

    org_slug (path, required)

  • GET/api/v1/sso/{org_slug}/metadata.xml

    Metadata

    No sign-in200

    org_slug (path, required)

SCIM

  • GET/scim/admin/tokens

    List Tokens

    Signed-in account200

    org_id (query, required)

  • POST/scim/admin/tokens

    Issue Token

    Signed-in account201

    JSON body

  • DELETE/scim/admin/tokens/{token_id}

    Revoke Token

    Signed-in account204

    token_id (path, required), org_id (query, required)

  • GET/scim/v2/Groups

    List Groups

    No sign-in200

    startIndex (query), count (query)

  • POST/scim/v2/Groups

    Create Group

    No sign-in201
  • GET/scim/v2/Groups/{group_id}

    Get Group

    No sign-in200

    group_id (path, required)

  • PUT/scim/v2/Groups/{group_id}

    Update Group

    No sign-in200

    group_id (path, required)

  • PATCH/scim/v2/Groups/{group_id}

    Update Group

    No sign-in200

    group_id (path, required)

  • DELETE/scim/v2/Groups/{group_id}

    Delete Group

    No sign-in204

    group_id (path, required)

  • GET/scim/v2/ResourceTypes

    Types Route

    No sign-in200
  • GET/scim/v2/Schemas

    Schemas Route

    No sign-in200
  • GET/scim/v2/ServiceProviderConfig

    Config Route

    No sign-in200
  • GET/scim/v2/Users

    List Users

    No sign-in200

    filter (query), startIndex (query), count (query)

  • POST/scim/v2/Users

    Create User

    No sign-in201
  • GET/scim/v2/Users/{user_id}

    Get User

    No sign-in200

    user_id (path, required)

  • PUT/scim/v2/Users/{user_id}

    Replace User

    No sign-in200

    user_id (path, required)

  • PATCH/scim/v2/Users/{user_id}

    Patch User

    No sign-in200

    user_id (path, required)

  • DELETE/scim/v2/Users/{user_id}

    Delete User

    No sign-in204

    user_id (path, required)

SCIM Admin

  • GET/api/v1/scim/admin/tokens

    List Tokens

    Signed-in account200

    org_id (query, required)

  • POST/api/v1/scim/admin/tokens

    Issue Token

    Signed-in account201

    JSON body

  • DELETE/api/v1/scim/admin/tokens/{token_id}

    Revoke Token

    Signed-in account204

    token_id (path, required), org_id (query, required)

Retention

  • GET/api/v1/retention/config

    Get Config

    The workspace's retention windows, its plan's bounds and the purge.

    Signed-in account200

    org_id (query)

  • PUT/api/v1/retention/config

    Update Config

    Set the workspace's windows within its plan (retention:manage).

    Signed-in account200

    JSON body

Webhooks

  • GET/api/v1/webhooks

    List Webhooks

    One page of the workspace's channels (integrations:read).

    Signed-in account200

    org_id (query), limit (query), cursor (query)

  • POST/api/v1/webhooks

    Create Webhook

    Add a channel to the workspace (integrations:manage).

    Signed-in account201

    org_id (query), JSON body

  • GET/api/v1/webhooks/events

    List Events

    What a channel can subscribe to, and the channel types this release has.

    Signed-in account200
  • GET/api/v1/webhooks/history

    Get Webhook History

    The delivery log: up to 20 recent outcomes per channel, with status codes, attempt numbers and scheduled retries (integrations:read).

    Signed-in account200

    org_id (query), limit (query), cursor (query)

  • GET/api/v1/webhooks/{webhook_id}

    Get Webhook

    One channel of the workspace (integrations:read).

    Signed-in account200

    webhook_id (path, required), org_id (query)

  • PUT/api/v1/webhooks/{webhook_id}

    Update Webhook

    Change a channel (integrations:manage).

    Signed-in account200

    webhook_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 account204

    webhook_id (path, required), org_id (query)

  • POST/api/v1/webhooks/{webhook_id}/rotate-secret

    Rotate Signing Secret

    Replace a signed channel's secret; the new one is returned once and signs every later delivery (integrations:manage).

    Signed-in account200

    webhook_id (path, required), org_id (query)

  • POST/api/v1/webhooks/{webhook_id}/test

    Test Webhook

    Send one REAL test delivery and report its REAL outcome.

    Signed-in account202

    webhook_id (path, required), org_id (query)

API Keys

  • GET/api/v1/api-keys

    List Api Keys

    Signed-in account200

    limit (query), offset (query)

  • POST/api/v1/api-keys

    Create Api Key

    Signed-in account201

    JSON body

  • DELETE/api/v1/api-keys/{key_id}

    Revoke Api Key

    Signed-in account204

    key_id (path, required)

Billing

  • POST/api/v1/billing/checkout

    Create Checkout Session

    Create a Stripe Checkout session for the requested plan.

    Signed-in account200
  • GET/api/v1/billing/plans

    Get Public Plans

    Public, cacheable plan catalogue for the pricing and upgrade surfaces.

    No sign-in200
  • POST/api/v1/billing/portal

    Create Portal Session

    Create a Stripe customer portal session for self-serve billing management.

    Signed-in account200
  • GET/api/v1/billing/status

    Get Billing Status

    Return legacy Stripe state plus authoritative organisation entitlements.

    Signed-in account200

Product

  • GET/api/v1/product/capabilities

    Get Product Capabilities

    No sign-in200

Blog

  • GET/api/v1/blog

    List Blog Posts

    List published blog posts with optional category filter and pagination.

    No sign-in200

    category (query), page (query), page_size (query)

  • GET/api/v1/blog/categories

    List 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-in200

    slug (path, required)

Facts

  • GET/api/v1/facts

    List Module Facts

    List every module fact, ordered by module name.

    No sign-in200

Contact

  • POST/api/v1/contact

    Submit Contact

    Record a contact-form message from the public site.

    No sign-in201

    JSON body

Newsletter

  • POST/api/newsletter/confirm

    Confirm

    Record consent only after the mailbox holder uses the emailed link.

    No sign-in200

    JSON body

  • POST/api/newsletter/subscribe

    Subscribe

    Send a confirmation email; no one is subscribed by this request alone.

    No sign-in200

    JSON body

  • POST/api/newsletter/unsubscribe

    Unsubscribe

    Withdraw marketing consent using the token included in email.

    No sign-in200

    JSON body

Email Preferences

  • GET/api/v1/email-preferences/me

    Read My Email Preferences

    Whether this account has current, confirmed newsletter consent.

    Signed-in account200
  • PUT/api/v1/email-preferences/me

    Update My Email Preferences

    Withdraw marketing consent for the signed-in account's address.

    Signed-in account200

    JSON body

  • POST/api/v1/email-preferences/onboarding/unsubscribe

    Unsubscribe Onboarding

    Stop the onboarding emails (founder note and nudge) for one account.

    No sign-in200

    token (query)

Feedback

  • POST/api/v1/feedback

    Submit Feedback

    Record feedback from the signed-in user and notify the founder inbox.

    Signed-in account201

    JSON body

Health

  • GET/health

    Health Check

    Public health: is this API process up and serving.

    No sign-in200

Root

  • GET/

    Root

    Root endpoint with API information.

    No sign-in200