Skip to content

REST API

The SocTalk API is a FastAPI app. Its full surface is generated from the code as an OpenAPI schema and served under /api/ (the ingress routes /api/* to the API and everything else to the web console):

  • OpenAPI JSON: https://mssp.your-mssp.example/api/openapi.json
  • Swagger UI: https://mssp.your-mssp.example/api/docs
  • ReDoc: https://mssp.your-mssp.example/api/redoc

The OpenAPI surface is the source of truth. A snapshot of it ships with these docs at /openapi.json, and the catalog below is generated from that schema: it cannot drift from the code.

Regenerating the catalog

The endpoint catalog is produced by npm run gen:api, which reads docs/public/openapi.json. Refresh the schema from the API code first:

bash
# in the soctalk repo
python scripts/dump_openapi.py <soctalk-docs>/docs/public/openapi.json
# in soctalk-docs
npm run gen:api

Everything between the GENERATED markers is overwritten; the prose around it is curated by hand.

Endpoint catalog

The Auth column is derived from each route's require_role / require_tenant_role guard. A label of session cookie means any authenticated session is accepted at the handler, but tenant-scoped roles are still confined to their own data by row-level security, so a tenant_admin sees only their tenant's rows even on an ungated MSSP-style route.

146 operations across 33 groups, generated from the OpenAPI schema (API version 0.2.1). Auth is derived from the route's require_role / require_tenant_role guards.

auth

MethodPathSummaryAuth
POST/api/auth/assume-tenantAssume Tenantsession cookie (login) / none
POST/api/auth/loginLoginsession cookie (login) / none
POST/api/auth/logoutLogoutsession cookie (login) / none
GET/api/auth/meMesession cookie (login) / none
POST/api/auth/password/changePassword Changesession cookie (login) / none

auth-admin

MethodPathSummaryAuth
POST/api/mssp/users/{user_id}/password/resetAdmin Resetsession cookie

authz-facts-mssp

MethodPathSummaryAuth
POST/api/mssp/tenants/{tenant_id}/authorization/answerMssp Answer Authorizationsession cookie
GET/api/mssp/tenants/{tenant_id}/authorization/factsMssp List Factssession cookie
POST/api/mssp/tenants/{tenant_id}/authorization/factsMssp Create Factsession cookie
POST/api/mssp/tenants/{tenant_id}/authorization/facts/{fact_id}/reviewMssp Review Factsession cookie
POST/api/mssp/tenants/{tenant_id}/authorization/facts/{fact_id}/revokeMssp Revoke Factsession cookie

chat

MethodPathSummaryAuth
GET/api/chat/conversationsList Conversationssession cookie
POST/api/chat/conversationsCreate Conversationsession cookie
GET/api/chat/conversations/{conv_id}Get Conversationsession cookie
DELETE/api/chat/conversations/{conv_id}Delete Conversationsession cookie
POST/api/chat/conversations/{conv_id}/messagesPost Messagesession cookie
POST/api/chat/conversations/{conv_id}/messages/{msg_id}/confirmConfirm Actionsession cookie
POST/api/chat/conversations/{conv_id}/stopStop Conversationsession cookie

health

MethodPathSummaryAuth
GET/health/liveLivenone (public)
GET/health/readyReadynone (public)

internal-adapter

MethodPathSummaryAuth
GET/api/internal/adapter/checkpointGet Checkpointservice JWT (adapter token)
PUT/api/internal/adapter/checkpointPut Checkpointservice JWT (adapter token)
GET/api/internal/adapter/configFetch Configservice JWT (adapter token)
POST/api/internal/adapter/eventsIngest Eventsservice JWT (adapter token)
POST/api/internal/adapter/heartbeatHeartbeatservice JWT (adapter token)

internal-authorization

MethodPathSummaryAuth
GET/api/internal/authorization/factsList Factssession cookie
POST/api/internal/authorization/factsSubmit Factssession cookie
POST/api/internal/authorization/facts/{fact_id}/revokeRevokesession cookie

internal-worker

MethodPathSummaryAuth
POST/api/internal/worker/runs/{run_id}/completeComplete Runservice JWT (worker token)
POST/api/internal/worker/runs/{run_id}/heartbeatHeartbeat Runservice JWT (worker token)
POST/api/internal/worker/runs/claimClaim Runservice JWT (worker token)

investigations-bridge

MethodPathSummaryAuth
GET/api/investigationsList Investigationssession cookie
GET/api/investigations/{investigation_id}Get Investigationsession cookie
POST/api/investigations/{investigation_id}/cancelPost Cancel Investigationsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/investigations/{investigation_id}/eventsGet Eventssession cookie

ir-alerts

MethodPathSummaryAuth
GET/api/mssp/alertsList Alertssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

ir-engagements

MethodPathSummaryAuth
GET/api/mssp/tenants/{tenant_id}/engagementsList Engagements Routesession cookie
POST/api/mssp/tenants/{tenant_id}/engagementsDeclare Engagement Routesession cookie
POST/api/mssp/tenants/{tenant_id}/engagements/{engagement_id}/revokeRevoke Engagement Routesession cookie

ir-integrations

MethodPathSummaryAuth
GET/api/mssp/tenants/{tenant_id}/integrationsGet Integrationssession (roles: mssp_admin / platform_admin)
PATCH/api/mssp/tenants/{tenant_id}/integrationsPatch Integrationssession (roles: mssp_admin / platform_admin)

ir-mssp

MethodPathSummaryAuth
GET/api/mssp/investigationsList Cases Msspsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/investigations/{investigation_id}Get Case Msspsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/investigations/{investigation_id}/eventsList Case Events Msspsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
PATCH/api/mssp/investigations/{investigation_id}/factsPatch Case Factssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/investigations/{investigation_id}/messagesPost Analyst Messagesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

ir-playbooks

MethodPathSummaryAuth
GET/api/mssp/playbooksList Triage Policies Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/tenants/{tenant_id}/playbooksList Authored Triage Policies Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/tenants/{tenant_id}/playbooksCreate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
PUT/api/mssp/tenants/{tenant_id}/playbooks/{triage_policy_id}Update Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
DELETE/api/mssp/tenants/{tenant_id}/playbooks/{triage_policy_id}Retire Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/playbooks/{triage_policy_id}/activateActivate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/playbooks/{triage_policy_id}/deactivateDeactivate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}/playbooks/{triage_policy_id}/exportExport Authored Triage Policy Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/tenants/{tenant_id}/triage-policiesList Authored Triage Policies Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/tenants/{tenant_id}/triage-policiesCreate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
PUT/api/mssp/tenants/{tenant_id}/triage-policies/{triage_policy_id}Update Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
DELETE/api/mssp/tenants/{tenant_id}/triage-policies/{triage_policy_id}Retire Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/triage-policies/{triage_policy_id}/activateActivate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/triage-policies/{triage_policy_id}/deactivateDeactivate Authored Triage Policy Routesession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}/triage-policies/{triage_policy_id}/exportExport Authored Triage Policy Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

ir-proposals

MethodPathSummaryAuth
GET/api/mssp/proposalsList Pending Proposalssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/proposals/{proposal_id}/approveApprove Proposal Routesession cookie
POST/api/mssp/proposals/{proposal_id}/rejectReject Proposal Routesession cookie

ir-response-playbooks

MethodPathSummaryAuth
GET/api/mssp/tenants/{tenant_id}/response-playbooksList Authored Response Playbooks Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/tenants/{tenant_id}/response-playbooksCreate Authored Response Playbook Routesession (roles: mssp_admin / platform_admin)
PUT/api/mssp/tenants/{tenant_id}/response-playbooks/{response_playbook_id}Update Authored Response Playbook Routesession (roles: mssp_admin / platform_admin)
DELETE/api/mssp/tenants/{tenant_id}/response-playbooks/{response_playbook_id}Retire Authored Response Playbook Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/response-playbooks/{response_playbook_id}/activateActivate Authored Response Playbook Routesession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}/response-playbooks/{response_playbook_id}/deactivateDeactivate Authored Response Playbook Routesession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}/response-playbooks/{response_playbook_id}/exportExport Authored Response Playbook Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

ir-tenant

MethodPathSummaryAuth
GET/api/tenant/investigationsList Cases Tenanttenant session (customer_viewer / tenant_admin / tenant_analyst / tenant_manager)
GET/api/tenant/investigations/{investigation_id}Get Case Tenanttenant session (customer_viewer / tenant_admin / tenant_analyst / tenant_manager)
PATCH/api/tenant/investigations/{investigation_id}/factsTenant Patch Case Factstenant session
POST/api/tenant/investigations/{investigation_id}/messagesTenant Post Analyst Messagetenant session

ir-triage-policies

MethodPathSummaryAuth
GET/api/mssp/triage-policiesList Triage Policies Routesession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

l2-agent

MethodPathSummaryAuth
POST/api/agent/heartbeatHeartbeatL2 agent install token (bearer)
POST/api/agent/jobs:claimClaim JobL2 agent install token (bearer)
POST/api/agent/jobs/{job_id}/completeComplete JobL2 agent install token (bearer)
POST/api/agent/jobs/{job_id}/eventsPost EventL2 agent install token (bearer)
POST/api/agent/registerRegisterL2 agent install token (bearer)

legacy-stubs

MethodPathSummaryAuth
GET/api/analytics/ai-behaviorAnalytics Ai Behaviorsession cookie
GET/api/analytics/human-reviewAnalytics Human Reviewsession cookie
GET/api/analytics/kpisAnalytics Kpissession cookie
GET/api/analytics/outcomesAnalytics Outcomessession cookie
GET/api/analytics/summaryAnalytics Summarysession cookie
GET/api/auditAudit Listsession cookie
GET/api/audit/event-typesAudit Event Typessession cookie
GET/api/audit/investigation/{investigation_id}Audit Investigationsession cookie
GET/api/audit/statsAudit Statssession cookie
GET/api/events/streamEvents Streamsession cookie
GET/api/review/{review_id}Review Detailsession cookie
POST/api/review/{review_id}/approveReview Approvesession cookie
POST/api/review/{review_id}/expireReview Expiresession cookie
POST/api/review/{review_id}/rejectReview Rejectsession cookie
POST/api/review/{review_id}/request-infoReview Request Infosession cookie
GET/api/review/pendingReview Pendingsession cookie
GET/api/settingsSettings Getsession cookie

metrics-bridge

MethodPathSummaryAuth
GET/api/metrics/hourlyHourlysession cookie
GET/api/metrics/overviewOverviewsession cookie

mssp-analytics

MethodPathSummaryAuth
GET/api/mssp/analytics/heatmapHeatmapsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/analytics/rankingRankingsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/analytics/trendsTrendssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

mssp-dashboard

MethodPathSummaryAuth
GET/api/mssp/dashboard/open-by-tenantOpen By Tenantsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/dashboard/pending-reviewsPending Reviewssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/dashboard/repeated-iocsRepeated Iocssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/dashboard/stuck-investigationsStuck Investigationssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/dashboard/tenant-healthTenant Healthsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)

mssp-tenant-branding

MethodPathSummaryAuth
PATCH/api/mssp/tenants/{tenant_id}/brandingUpdate Tenant Brandingsession (roles: mssp_admin / platform_admin)

mssp-tenant-llm

MethodPathSummaryAuth
GET/api/mssp/tenants/{tenant_id}/llmGet Tenant Llmsession (roles: mssp_admin / platform_admin)
PATCH/api/mssp/tenants/{tenant_id}/llmUpdate Tenant Llmsession (roles: mssp_admin / platform_admin)
DELETE/api/mssp/tenants/{tenant_id}/llm/api-keyClear Tenant Llm Api Keysession (roles: mssp_admin / platform_admin)

mssp-tenants

MethodPathSummaryAuth
GET/api/mssp/tenantsList Tenantssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/tenantsCreate Tenantsession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}Get Tenantsession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
POST/api/mssp/tenants/{tenant_id}:decommissionDecommission Tenantsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}:issue-agentIssue Agentsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}:resumeResume Tenantsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}:retryRetry Provisioningsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}:retry-installRetry Installsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/{tenant_id}:suspendSuspend Tenantsession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}/adapter-statusGet Tenant Adapter Statussession (roles: mssp_admin / platform_admin)
GET/api/mssp/tenants/{tenant_id}/eventsList Eventssession (roles: analyst / mssp_admin / mssp_manager / platform_admin)
GET/api/mssp/tenants/{tenant_id}/external-siemGet Tenant External Siemsession (roles: mssp_admin / platform_admin)
PATCH/api/mssp/tenants/{tenant_id}/external-siemUpdate Tenant External Siemsession (roles: mssp_admin / platform_admin)
POST/api/mssp/tenants/onboardOnboard Tenantsession (roles: mssp_admin / platform_admin)

mssp-users

MethodPathSummaryAuth
GET/api/mssp/usersList Mssp Userssession cookie
POST/api/mssp/usersCreate Mssp Usersession cookie
PATCH/api/mssp/users/{user_id}Update Mssp Usersession cookie
POST/api/mssp/users/{user_id}/deactivateDeactivate Mssp Usersession cookie

public-tenant

MethodPathSummaryAuth
GET/api/public/mssp-by-slug/{slug}Mssp By Slugnone (public)
GET/api/public/scope-by-slug/{slug}Scope By Slugnone (public)
GET/api/public/tenant-by-slug/{slug}Tenant By Slugnone (public)

tenant-authz-facts

MethodPathSummaryAuth
GET/api/tenant/authorization/factsTenant List Own Factstenant session
POST/api/tenant/authorization/factsTenant Assert Facttenant session

tenant-branding

MethodPathSummaryAuth
GET/api/tenant/brandingGet Own Brandingtenant session (customer_viewer / tenant_admin / tenant_analyst / tenant_manager)

tenant-engagements

MethodPathSummaryAuth
GET/api/tenant/engagementsTenant List Engagements Routetenant session
POST/api/tenant/engagementsTenant Declare Engagement Routetenant session
POST/api/tenant/engagements/{engagement_id}/revokeTenant Revoke Engagement Routetenant session

tenant-llm

MethodPathSummaryAuth
GET/api/tenant/llmTenant Get Llmtenant session (tenant_admin)
PUT/api/tenant/llm/api-keyTenant Put Llm Keytenant session (tenant_admin)
DELETE/api/tenant/llm/api-keyTenant Clear Llm Keytenant session (tenant_admin)

tenant-users

MethodPathSummaryAuth
GET/api/tenant/usersList Tenant Userstenant session
POST/api/tenant/usersCreate Tenant Usertenant session
PATCH/api/tenant/users/{user_id}Update Tenant Usertenant session
POST/api/tenant/users/{user_id}/deactivateDeactivate Tenant Usertenant session

Auth scheme

Browsers use a session cookie set by POST /api/auth/login. Programmatic clients can either:

  1. Drive the login flow (preferred for short-lived scripts):
    bash
    curl -c jar -X POST https://mssp.../api/auth/login \
      -H 'Content-Type: application/json' \
      -d '{"email":"admin@example","password":"..."}'
    curl -b jar https://mssp.../api/mssp/tenants
  2. Issue a long-lived API token (planned; not yet exposed in the UI). Today, the only non-cookie callers are the per-tenant adapter and runs-worker pods, which authenticate to /api/internal/* with tenant-scoped tokens the API mints and rotates (see Internal endpoints).

In SOCTALK_AUTH_MODE=proxy, the API trusts upstream X-Forwarded-User / X-Forwarded-Email / X-Forwarded-Groups headers and the entire session auth surface is unmounted, /api/auth/* (login, logout, me, assume-tenant, password/change) and /api/mssp/users/{id}/password/reset return 404 (not 405). Your IdP owns the identity surface.

CSRF

CSRF is enforced globally, not per-prefix: internal_session_middleware validates the Origin / Referer header on every state-changing request (POST / PUT / PATCH / DELETE) that carries the session cookie. It is header validation, not a double-submit cookie token (that pattern appeared in earlier drafts but the runtime uses header validation). The accepted origins come from SOCTALK_PUBLIC_ORIGIN (and SOCTALK_PUBLIC_ORIGIN_BASE for slug-wildcard customer hosts), which the chart derives from ingress.hostnames. Requests that carry no session cookie (e.g. the adapter/worker bearer-token calls, or the login request itself) are exempt. Browsers send Origin automatically; non-browser clients can either:

  • Match Origin to one of the accepted hostnames, or
  • Set Host: <accepted-hostname> + Origin: https://<accepted-hostname> regardless of actual TCP target (the firstboot.sh onboarding step uses this trick).

Common flows

Onboard a tenant

bash
curl -b jar -X POST https://mssp.../api/mssp/tenants/onboard \
  -H 'Content-Type: application/json' \
  -d '{
    "slug": "acme-corp",
    "display_name": "Acme Corp",
    "profile": "persistent"
  }'

profile is validated server-side against ^(poc|persistent|provided)$. See tenant lifecycle / profiles for the semantics of each value. For provided (BYO-Wazuh), the payload additionally requires an external_siem object (indexer URL, Manager API URL, basic-auth creds) plus a per-tenant llm_api_key; the server returns 422 with field-level errors if any are missing.

Returns 202 with the new tenant ID. Watch GET /api/mssp/tenants/{id} for state transitions, or poll GET /api/mssp/tenants/{id}/events for the lifecycle event list. (/api/events/stream exists but emits keep-alive pings only in this release.)

Get the audit log

bash
curl -b jar 'https://mssp.../api/audit?start_date=2026-01-01T00:00:00Z&end_date=2026-02-01T00:00:00Z&event_type=review.completed&page=1&page_size=50'

The audit router is top-level (/api/audit), not under /api/mssp/. Filters: start_date / end_date (ISO 8601), event_type, aggregate_type, and investigation_id. Results are offset-paginated with page / page_size.

Submit a human-review decision

The review router exposes one endpoint per decision (no single /decision path). Pick the matching one:

bash
# Approve — payload field is `feedback` (free-text), not `rationale`
curl -b jar -X POST https://mssp.../api/review/<review-id>/approve \
  -H 'Content-Type: application/json' \
  -d '{"feedback":"Confirmed brute-force pattern."}'

# Reject — closes the case as auto_closed_fp; `feedback` is optional
curl -b jar -X POST https://mssp.../api/review/<review-id>/reject \
  -d '{"feedback":"Looks like a known scanner; benign."}'

# Need more info — payload is `questions: list[str]` (each renders as a bullet)
curl -b jar -X POST https://mssp.../api/review/<review-id>/request-info \
  -d '{"questions":["What is the source IP geo?","Any prior alerts on this user?"]}'

# Expire — retire a pending review without a verdict (optional reason)
curl -b jar -X POST https://mssp.../api/review/<review-id>/expire \
  -d '{"reason":"superseded by newer investigation"}'

All four return 409 if the review is no longer pending.

For IR proposals (the case-management surface), the equivalent endpoints are under /api/mssp/proposals/{id}/approve and /api/mssp/proposals/{id}/reject.

Stream events

bash
curl -N -b jar 'https://mssp.../api/events/stream'

Server-Sent Events. In this release the stream emits keep-alive pings only (a ping roughly every 25 s), broadcasting domain events (investigation updates, tenant lifecycle, etc.) is on the roadmap. Treat the endpoint as a wire-level connectivity test today.

Generate a Python client

The schema generates cleanly, so the fastest way to call the API from Python is to generate a typed client with openapi-python-client rather than hand-rolling requests. Here it is end-to-end, reading investigations.

1. Generate + install the client

bash
pip install openapi-python-client
openapi-python-client generate \
  --url https://mssp.your-mssp.example/api/openapi.json --meta setup
pip install ./soc-talk-v1-client   # package name derives from the schema title

2. Consume investigations

python
import httpx
from soc_talk_v1_client import Client
from soc_talk_v1_client.api.investigations_bridge import (
    list_investigations_api_investigations_get as list_investigations,
    get_investigation_api_investigations_investigation_id_get as get_investigation,
)

BASE = "https://mssp.your-mssp.example"

# 1. Log in for a session cookie (the investigations routes take a session).
with httpx.Client(base_url=BASE) as h:
    h.post("/api/auth/login",
           json={"email": "admin@example", "password": "..."}).raise_for_status()
    session = h.cookies["soctalk_session"]

# 2. Drive the generated, typed client with that cookie.
client = Client(base_url=BASE, cookies={"soctalk_session": session})

page = list_investigations.sync(client=client, page=1, page_size=5)  # -> InvestigationList
print(f"{page.total} investigations")
for inv in page.items:                                               # -> Investigation
    print(inv.id, inv.status, inv.max_severity, inv.title)

detail = get_investigation.sync(client=client, investigation_id=str(page.items[0].id))
print(detail.phase, detail.alert_count, detail.verdict_decision)

The endpoint functions are named after the operationId FastAPI derives from the route (list_investigations_api_investigations_get), alias them on import, as above, for readability. sync() returns the deserialized model (InvestigationList, whose .items are Investigation); sync_detailed() returns the raw Response with the status code if you need it.

A runnable version, generate, log in, list + read, ships as the codegen smoke test tests/e2e/smoke_openapi_client.py, which the deploy pipeline runs against the live API so a schema that stops generating a working client fails the build.

Internal endpoints (/api/internal/*)

Used by the per-tenant adapter and runs-worker (see the internal-adapter and internal-worker groups in the catalog above). Not for human consumption, listed so MSSPs can see what those pods are doing.

Each call carries a tenant-scoped token the API mints at provision and auto-renews before it expires (adapter tokens live 7 days, worker tokens 30 days; the control plane re-mints them well inside that window). Tokens are tenant-bound, an adapter can only act on its own tenant's URLs.

Rate limits

The API itself does not impose per-route rate limits in this release. Use the ingress layer for global rate limiting (Traefik middleware, ingress-nginx annotations) if you need it.

Versioning

The OpenAPI document carries the app version. We aim for additive changes within a minor; breaking changes only on a major bump. The release notes call out every API-affecting change.

Source pointers

All routers live under src/soctalk/core/api/.

ConceptFile
Auth router + session middlewarecore/api/auth.py, core/auth/middleware.py
MSSP tenant lifecyclecore/api/tenants.py
Per-tenant LLM configcore/api/llm_config.py
Investigations / IR / proposalscore/api/investigations_bridge.py, core/api/ir.py
Audit / review / analytics / settings / events (stubs)core/api/legacy_stubs.py
Chatcore/api/chat.py
Worker (internal) routescore/api/worker_runs.py
Adapter (internal) routescore/api/adapter.py
OpenAPI generatorscripts/dump_openapi.py

Released under the Apache 2.0 License.