Skip to content

API reference

The Lockstep VM backend is a FastAPI application. Every route below is mounted under the global prefix /api/v1 (API_V1_PREFIX in app/core/config.py), and each router adds its own sub-prefix on top of that. The paths in the tables are the full paths a client calls.

Authentication

Except for POST /api/v1/auth/register, POST /api/v1/auth/login, and the public invite lookup/accept endpoints, every route depends on get_current_user. That dependency accepts either a Better Auth session cookie or a legacy Authorization: Bearer <JWT> token. POST /api/v1/auth/bridge-token swaps a Better Auth cookie for a short-lived legacy JWT so older localStorage-based components keep working.

Tenant scoping

Every authenticated request carries a tenant_id (plus user_id, email, role). All data access is filtered by tenant_id, so a tenant only ever sees its own devices, vulnerabilities, integrations, and uploads. Admin-only actions (invites, member management, org settings) additionally check role in {admin, owner}.

Common integration pattern

The endpoint integrations — SentinelOne, Intune, Rapid7, ConnectWise Automate, and Entra — all follow the same lifecycle contract. Wherever you see one of these, the others expose the equivalent route:

MethodPath suffixPurpose
GET/configRead stored config (secrets redacted)
POST/configStore/replace credentials for this tenant
DELETE/configRemove config (and usually the synced data)
POST/test-connectionValidate stored credentials with a live API call
POST/syncKick off a background sync job
GET/sync-statusPoll the current sync job status
GET/statsSummary counts for the integration

Most of these also expose /devices (or /assets//users), /apps, and a /device-by-name/{name} lookup used by the asset-detail page.

auth (/api/v1/auth)

MethodPathPurpose
POST/api/v1/auth/registerRegister a new user (rate-limited 5/min)
POST/api/v1/auth/loginExchange email/password for an access token (10/min)
GET/api/v1/auth/meCurrent signed-in user record
POST/api/v1/auth/refreshIssue a fresh access token
POST/api/v1/auth/bridge-tokenSwap a Better Auth cookie for a legacy JWT

tenant (/api/v1/tenant)

MethodPathPurpose
GET/api/v1/tenant/meCurrent-tenant summary for the signed-in user
PATCH/api/v1/tenant/meUpdate org name / notification email / timezone (admin)
GET/api/v1/tenant/membersList tenant members (Better Auth + legacy, deduped)
PATCH/api/v1/tenant/members/{member_id}Change a member’s role (admin)
DELETE/api/v1/tenant/members/{member_id}Remove a member from the tenant (admin)

invites (/api/v1/invites)

MethodPathPurpose
POST/api/v1/invitesCreate + email a team invite (admin, 20/hour)
GET/api/v1/invitesList invites this user issued (admins see all tenant invites)
GET/api/v1/invites/{token}Public: verify an invite token and pre-fill signup
POST/api/v1/invites/{token}/acceptPublic: stamp tenant/role on a freshly signed-up user
DELETE/api/v1/invites/{invite_id}Revoke a pending invite (admin)

inventory (/api/v1/inventory)

MethodPathPurpose
POST/api/v1/inventory/uploadUpload a software-inventory CSV (processed in background)
GET/api/v1/inventory/uploadsList inventory uploads
GET/api/v1/inventory/uploads/{upload_id}Get one upload’s status/details
GET/api/v1/inventory/applicationsList applications (search/vendor filter, paginated)
POST/api/v1/inventory/applications/searchStructured query-builder search over applications
GET/api/v1/inventory/applications/{app_id}Get one application
GET/api/v1/inventory/statsInventory stats (apps, devices, vendors, vulns)
GET/api/v1/inventory/itemsInventory items for a device or application
GET/api/v1/inventory/vendorsDistinct vendors with device/app/CVE counts
GET/api/v1/inventory/apps-listDistinct app names with device + CVE counts (autocomplete)

devices (/api/v1/devices)

MethodPathPurpose
GET/api/v1/devices/itemsList inventory items (paginated, searchable)
GET/api/v1/devices/devicesUnique devices across all sources (Intune + S1 + more)
POST/api/v1/devices/devices/searchStructured query-builder search over assets
GET/api/v1/devices/device/{device_id}Device detail by Intune device UUID
GET/api/v1/devices/by-name/{device_name}Device detail by device name
GET/api/v1/devices/statsDevice stats per integration collection
GET/api/v1/devices/by-application/{application_name}Distinct devices with a given app installed

vulnerabilities — scan router (/api/v1/vulnerabilities)

The scan router is mounted at /vulnerabilities alongside the vulnerabilities router.

MethodPathPurpose
POST/api/v1/vulnerabilities/scan-deviceTrigger a vulnerability scan for all apps on a device
GET/api/v1/vulnerabilities/scans/{scan_id}Get results of a specific scan

vulnerabilities (/api/v1/vulnerabilities)

MethodPathPurpose
POST/api/v1/vulnerabilities/scanStart a vulnerability scan
GET/api/v1/vulnerabilities/scansList vulnerability scans
GET/api/v1/vulnerabilities/scans/{scan_id}Get one scan
GET/api/v1/vulnerabilities/scans/{scan_id}/vulnerabilitiesVulnerabilities found in a scan
GET/api/v1/vulnerabilities/scans/{scan_id}/vulnerabilities/{cve_id}/devicesDevices affected by a CVE in a scan
GET/api/v1/vulnerabilities/List vulnerabilities
GET/api/v1/vulnerabilities/cve/{cve_id}/devicesAll devices affected by a given CVE
GET/api/v1/vulnerabilities/statsVulnerability summary statistics

research (/api/v1/research)

MethodPathPurpose
GET/api/v1/research/cve/{cve_id}Research a specific CVE
GET/api/v1/research/productResearch a product
GET/api/v1/research/historyResearch history

reports (/api/v1/reports)

Mounted from reports_enhanced.py.

MethodPathPurpose
GET/api/v1/reports/List generated reports for the tenant
POST/api/v1/reports/generateGenerate a new report in the background
GET/api/v1/reports/{report_id}/statusReport generation status
GET/api/v1/reports/{report_id}/downloadDownload a generated report
DELETE/api/v1/reports/{report_id}Delete a report and its file

versions (/api/v1/versions)

MethodPathPurpose
GET/api/v1/versions/summaryVersion summary
GET/api/v1/versions/complianceVersion compliance
GET/api/v1/versions/outdatedOutdated software

integrations (/api/v1/integrations)

MethodPathPurpose
POST/api/v1/integrations/credentialsStore credentials for a platform
GET/api/v1/integrations/credentials/{platform}Get stored credentials for a platform
GET/api/v1/integrations/List configured integrations
DELETE/api/v1/integrations/credentials/{platform}Delete a platform’s credentials

subscriptions (/api/v1/subscriptions)

MethodPathPurpose
GET/api/v1/subscriptions/List subscriptions with CVE counts + last-sync
POST/api/v1/subscriptions/Subscribe to a vendor/product and pull CVEs from NVD
DELETE/api/v1/subscriptions/by-name/{sub_type}/{name}Delete a subscription by type + name
DELETE/api/v1/subscriptions/{subscription_id}Delete a subscription by id
GET/api/v1/subscriptions/checkCheck whether something is subscribed
POST/api/v1/subscriptions/syncPull latest NVD CVEs for all active subscriptions
GET/api/v1/subscriptions/cves/searchSearch NVD for vendor/product CVEs and save them
GET/api/v1/subscriptions/activityRecent CVE activity for subscribed vendors/products
GET/api/v1/subscriptions/cpe/searchSearch the NVD CPE dictionary (paginated)

tags (/api/v1/tags)

MethodPathPurpose
GET/api/v1/tags/List tags for the tenant
POST/api/v1/tags/Create a tag
PUT/api/v1/tags/{tag_id}Update a tag
DELETE/api/v1/tags/{tag_id}Delete a tag and its assignments
POST/api/v1/tags/{tag_id}/assignAssign a tag to a CVE
DELETE/api/v1/tags/{tag_id}/assign/{cve_id}Remove a tag from a CVE
GET/api/v1/tags/entity/bulkAll tag assignments for a given entity type
POST/api/v1/tags/entity/assignAssign a tag to a vendor/product/CVE by name
DELETE/api/v1/tags/entity/unassignRemove a tag from a vendor/product/CVE
GET/api/v1/tags/entity/{entity_type}/{entity_name}Tags for a vendor/product/CVE
GET/api/v1/tags/cve/{cve_id}Tags assigned to a specific CVE

weaknesses (/api/v1/weaknesses)

MethodPathPurpose
GET/api/v1/weaknesses/List CWE weaknesses with real CVE counts
GET/api/v1/weaknesses/{cwe_id}CWE detail including associated CVEs

projects (/api/v1/projects)

MethodPathPurpose
GET/api/v1/projects/List projects for the tenant
POST/api/v1/projects/Create a project
GET/api/v1/projects/{project_id}Get a project
PUT/api/v1/projects/{project_id}Update a project
DELETE/api/v1/projects/{project_id}Delete a project
POST/api/v1/projects/{project_id}/vendors/{vendor_name}Add a vendor to a project
DELETE/api/v1/projects/{project_id}/vendors/{vendor_name}Remove a vendor from a project
POST/api/v1/projects/{project_id}/products/{product_name}Add a product to a project
DELETE/api/v1/projects/{project_id}/products/{product_name}Remove a product from a project
GET/api/v1/projects/{project_id}/vulnerabilitiesCVEs matching a project’s vendors/products

sentinelone (/api/v1/sentinelone)

Follows the common integration pattern.

MethodPathPurpose
POST/api/v1/sentinelone/configStore SentinelOne API credentials
GET/api/v1/sentinelone/configGet config (token redacted)
DELETE/api/v1/sentinelone/configRemove config + synced data
POST/api/v1/sentinelone/test-connectionTest stored credentials
POST/api/v1/sentinelone/syncKick off a background sync
GET/api/v1/sentinelone/sync-statusCurrent sync job status
GET/api/v1/sentinelone/devicesList synced S1 agents
GET/api/v1/sentinelone/threatsList synced S1 threats
GET/api/v1/sentinelone/statsIntegration summary stats
GET/api/v1/sentinelone/appsS1 installed apps aggregated by name
GET/api/v1/sentinelone/device-by-name/{computer_name}Agent + threats + apps by computer name
GET/api/v1/sentinelone/device/{agent_id}Single agent with threats and apps

connectwise (/api/v1/connectwise)

ConnectWise PSA — ticketing and configuration management.

MethodPathPurpose
GET/api/v1/connectwise/statusCheck ConnectWise connection status
POST/api/v1/connectwise/auto-configPersist env-var credentials into DB config
GET/api/v1/connectwise/companiesList companies (clients)
GET/api/v1/connectwise/service/boardsList service boards
GET/api/v1/connectwise/service/tickets/recentList recent service tickets
POST/api/v1/connectwise/configConfigure the PSA integration
GET/api/v1/connectwise/ticketsList tickets
POST/api/v1/connectwise/ticketsCreate a service ticket
POST/api/v1/connectwise/syncSync recent tickets
GET/api/v1/connectwise/boardsList available service boards
GET/api/v1/connectwise/prioritiesList ticket priorities
GET/api/v1/connectwise/service/tickets/{ticket_id}/fullFull ticket detail (live + cache)
GET/api/v1/connectwise/service/tickets/{ticket_id}/notesTicket notes
POST/api/v1/connectwise/service/tickets/{ticket_id}/notesAdd a ticket note
GET/api/v1/connectwise/service/tickets/{ticket_id}/configurationsLinked configurations (assets)
POST/api/v1/connectwise/service/tickets/{ticket_id}/configurationsLink a configuration to a ticket
DELETE/api/v1/connectwise/service/tickets/{ticket_id}/configurations/{config_id}Unlink a configuration
GET/api/v1/connectwise/service/tickets/{ticket_id}/timeentriesTicket time entries
POST/api/v1/connectwise/service/tickets/{ticket_id}/timeLog a time entry
PATCH/api/v1/connectwise/service/tickets/{ticket_id}Patch a ticket (JSON Patch)
GET/api/v1/connectwise/configurationsSearch company configurations (devices/assets)
GET/api/v1/connectwise/service/tickets/{ticket_id}/scheduleentriesTicket schedule entries
POST/api/v1/connectwise/tickets/from-vulnCreate a ticket from vulnerability data
GET/api/v1/connectwise/service/tickets/{ticket_id}/contextAnalyst context (CVE, inventory, S1)
GET/api/v1/connectwise/bulk-pull/statusStatus of the most recent bulk-pull job
GET/api/v1/connectwise/bulk-ticketsList locally-stored bulk-pulled tickets
GET/api/v1/connectwise/bulk-tickets/export.csvExport matching bulk tickets as CSV
GET/api/v1/connectwise/bulk-tickets/{ticket_id}/notesNotes for a bulk-pulled ticket
POST/api/v1/connectwise/bulk-pullStart a background bulk pull of a board

connectwise-automate (/api/v1/connectwise-automate)

ConnectWise Automate (RMM). Follows the common integration pattern.

MethodPathPurpose
POST/api/v1/connectwise-automate/configStore Automate credentials
GET/api/v1/connectwise-automate/configGet config (secrets redacted)
DELETE/api/v1/connectwise-automate/configRemove config + synced data
GET/api/v1/connectwise-automate/clientsList Automate clients (companies) to scope ingestion
POST/api/v1/connectwise-automate/test-connectionTest stored credentials
POST/api/v1/connectwise-automate/syncKick off a background sync
GET/api/v1/connectwise-automate/sync-statusCurrent sync job status
GET/api/v1/connectwise-automate/statsIntegration summary stats
GET/api/v1/connectwise-automate/device-by-name/{device_name}Automate record for one asset (asset-detail)
GET/api/v1/connectwise-automate/devicesList synced devices

csv-sources (/api/v1/csv-sources)

Generic CSV-ingestion hub. {key} selects a registered source (e.g. autoelevate); each source declares whether it targets device-enrichment or free-form records.

MethodPathPurpose
GET/api/v1/csv-sources/List CSV sources (registry descriptors) with per-tenant stats
GET/api/v1/csv-sources/{key}Get one source descriptor + stats
POST/api/v1/csv-sources/{key}/uploadUpload + process a CSV for a source
GET/api/v1/csv-sources/{key}/uploadsList a source’s uploads
GET/api/v1/csv-sources/{key}/uploads/{upload_id}One upload’s job detail + sample rows + fill-rate
DELETE/api/v1/csv-sources/{key}/dataPurge all ingested data for a source
GET/api/v1/csv-sources/{key}/device-by-name/{device_name}Source’s record for one asset (device-target)
GET/api/v1/csv-sources/{key}/recordsPreview parsed records (records-target)

entra (/api/v1/entra)

Microsoft Entra ID. Follows the common integration pattern.

MethodPathPurpose
POST/api/v1/entra/configStore Entra credentials
GET/api/v1/entra/configGet config (secrets redacted)
DELETE/api/v1/entra/configRemove config + synced data
POST/api/v1/entra/test-connectionTest stored credentials
POST/api/v1/entra/syncKick off a background sync
GET/api/v1/entra/sync-statusCurrent sync job status
GET/api/v1/entra/statsIntegration summary stats
GET/api/v1/entra/usersList synced Entra users
GET/api/v1/entra/user/{upn}Get one user (with linked devices) by UPN

rapid7 (/api/v1/rapid7)

Rapid7 InsightVM. Follows the common integration pattern.

MethodPathPurpose
GET/api/v1/rapid7/configGet config (secrets redacted)
POST/api/v1/rapid7/configStore Rapid7 credentials
DELETE/api/v1/rapid7/configRemove config + synced data
POST/api/v1/rapid7/test-connectionTest stored credentials
GET/api/v1/rapid7/sync-statusCurrent sync job status
POST/api/v1/rapid7/syncKick off a background sync
GET/api/v1/rapid7/statsIntegration summary stats
GET/api/v1/rapid7/assetsList synced Rapid7 assets
POST/api/v1/rapid7/research-findingResolve a finding’s CVE via NVD lookup
GET/api/v1/rapid7/findings/{asset_id}Vulnerability findings for an asset
GET/api/v1/rapid7/device-by-name/{hostname}Rapid7 asset by hostname (full or short match)
GET/api/v1/rapid7/appsList Rapid7 apps

threat-intel (/api/v1/threat-intel)

MethodPathPurpose
POST/api/v1/threat-intel/configConfigure threat-intel integrations
GET/api/v1/threat-intel/cve/{cve_id}Threat intel for a CVE
GET/api/v1/threat-intel/ip/{ip_address}Threat intel for an IP address
GET/api/v1/threat-intel/hash/{file_hash}Threat intel for a file hash
GET/api/v1/threat-intel/epss/high-riskHigh-risk CVEs by EPSS score
POST/api/v1/threat-intel/enrich/{cve_id}Enrich a CVE from multiple sources
GET/api/v1/threat-intel/research/{cve_id}Comprehensive CVE research-panel data

intune (/api/v1/intune)

Microsoft Intune. Follows the common integration pattern.

MethodPathPurpose
POST/api/v1/intune/configStore Azure app-registration credentials
GET/api/v1/intune/configGet config (secrets redacted)
DELETE/api/v1/intune/configRemove config + synced data
POST/api/v1/intune/test-connectionTest stored credentials via Graph API
POST/api/v1/intune/syncKick off a background sync
GET/api/v1/intune/sync-statusCurrent sync job status
GET/api/v1/intune/devicesList synced managed devices
GET/api/v1/intune/appsDeduplicated detected apps by device count
GET/api/v1/intune/statsIntegration summary stats

news-feeds (/api/v1/news-feeds)

Security RSS ingestion + AI classification.

MethodPathPurpose
GET/api/v1/news-feeds/feedsList configured feeds
POST/api/v1/news-feeds/feedsAdd a feed
DELETE/api/v1/news-feeds/feeds/{feed_id}Delete a feed
POST/api/v1/news-feeds/feeds/seedAdd all default security feeds
POST/api/v1/news-feeds/feeds/refreshRefresh all feeds and classify new items
POST/api/v1/news-feeds/classifyTrigger AI classification for a batch of items
GET/api/v1/news-feeds/itemsList feed items
GET/api/v1/news-feeds/items/statsFeed-item stats
PUT/api/v1/news-feeds/items/{item_id}/readMark an item read
PUT/api/v1/news-feeds/items/{item_id}/assignAssign an item
POST/api/v1/news-feeds/items/{item_id}/classifyForce re-classify a single item

advisories (/api/v1/advisories)

MethodPathPurpose
GET/api/v1/advisories/search/cvesPartial-match search over CVE ids/descriptions
GET/api/v1/advisories/search/appsPartial-match search over application names
POST/api/v1/advisories/draftAI-draft advisory content for a CVE/app
POST/api/v1/advisories/affected-usersFind users/devices with the affected apps installed
POST/api/v1/advisories/sendSend advisory email(s) via Resend and record them
GET/api/v1/advisoriesList advisories
GET/api/v1/advisories/{advisory_id}Get one advisory

dashboards (/api/v1/dashboards)

Configurable dashboards and widgets.

MethodPathPurpose
GET/api/v1/dashboardsList dashboards
POST/api/v1/dashboardsCreate a dashboard
GET/api/v1/dashboards/defaultGet the user’s default dashboard
GET/api/v1/dashboards/{dashboard_id}Get a dashboard
PATCH/api/v1/dashboards/{dashboard_id}Update a dashboard
DELETE/api/v1/dashboards/{dashboard_id}Delete a dashboard
POST/api/v1/dashboards/{dashboard_id}/cloneClone a dashboard
POST/api/v1/dashboards/{dashboard_id}/widgetsAdd a widget
PATCH/api/v1/dashboards/{dashboard_id}/widgets/{widget_id}Update a widget
DELETE/api/v1/dashboards/{dashboard_id}/widgets/{widget_id}Delete a widget
POST/api/v1/dashboards/widgets/{widget_id}/dataEvaluate a saved widget’s data source
POST/api/v1/dashboards/widgets/previewEvaluate an unsaved data source (editor preview)
GET/api/v1/dashboards/catalog/metricsNamed metric catalog for the widget editor
GET/api/v1/dashboards/catalog/widget-typesSupported widget types