Skip to main content
services/api/main.py registers 279 distinct paths — 334 method+path operations (per app.openapi()). That number is too large to read route-by-route, so this page groups it by domain instead of registration order. For why this surface exists and isn’t deployed, see Research workbench overview and Research API; this page is the detailed reference for what’s in it.
Every route below lives only in services/api/main.py (or a router it mounts, like services/api/clients_api.py). None of it is reachable from api.causeloop.ai, none of it is on the product allowlist described in API reference overview, and its shape can change without the deprecation process a real product contract would get.

Explore it locally

The fastest way to see the live, authoritative shape of this surface — more reliable than any document, including this one — is to run it and open its interactive schema:
Then open:
  • Swagger UI: http://127.0.0.1:8000/docs
  • Machine-readable schema: http://127.0.0.1:8000/openapi.json
This is basic mode, the lightest of the three research modes — no Docker, no OpenAI key. See Research modes for mvp1 and relational, which add a real analysis run on top of the same API.

Graph schema and registry

The provenance graph model this entire research pipeline is built around, plus the internal-consistency checks that keep artifact bookkeeping honest.

Datasets and records

Loads and inspects datasets into the process-global CauseLoopState, including the public-dataset acquisition program.

Embeddings and indexes

Runs, artifacts, and lineage

Themes, clustering, and review

Clustering execution, theme interpretation, and the process-global predecessor of the tenant remediation system.

Process discovery and conformance

causegraph.tasks (TASK_SPECS) is a 16-task catalog spanning process mining, issue intelligence, safety/cyber/reliability classification, and more; this section tours its event-log/process-mining family — process discovery, conformance/deviation, predictive process monitoring, process anomaly detection, and process-stub stitching. Each of those five tasks lists an implemented baseline plus named future providers that are cataloged but not wired (status adapter_ready) — Split Miner, alignment-based checking, ProcessTransformer, and graph autoencoders, for example. The other 11 tasks in the catalog (e.g. issue classification, narrative failure extraction, CAPA recommendation, maintenance RUL, cyber prioritization) target datasets such as OSHA, MAUDE, NASA C-MAPSS, and VCDB; six of them have no implemented baseline yet, only adapter_ready provider slots.

Strict MVP1 reports

A stable, explicitly-versioned sub-contract defined separately in services/api/mvp1_contract.py (MVP1_ENDPOINTS, all under /mvp1/*) rather than inline in main.py, specifically so its transport shape can’t silently drift from its own analysis logic. Every entry there is tagged product or support audience and a minimum permission (read/review/operate); product routes are the ones the Vite workbench’s browser client actually calls. See MVP1 pipeline for the analysis contract itself. Every Mvp1Request subclass sets model_config = ConfigDict(extra="forbid"), so an unexpected field is a 422 rather than a silently-ignored typo — useful when frontend and backend drift during active research work. The full contract, including the operator/developer-only support routes intentionally absent from the browser client, is in docs/MVP1_API_CONTRACT.md.

File-based /clients onboarding API

services/api/clients_api.py (mounted into main.py, not a standalone module) is the client onboarding flow that predates the real tenant-schema pipeline in onboarding_api.py. Its state is a flat directory tree, not Postgres: ClientAssetStore persists one manifest.json per client under data/clients/<client_id>/ (path overridable with CAUSELOOP_CLIENTS_ROOT) — no schema-per-tenant, no row-level security, no migrations. Its connector registry (GET /connectors, causegraph.onboarding.connectors.CONNECTORS) is the source of the documented 409 not_enabled stub behavior: only file_upload is enabled = True; postgres, s3_dump, and kafka_pubsub are registered — visible in the schema, listable, schema-validated — but raise ConnectorNotEnabledError, surfaced as 409 {"detail": {"status": "not_enabled", "message": "..."}}, the moment you try to activate one. See Errors and conventions for the exact response shape.

What this page leaves out

main.py also registers a large /runtime/production-promotion/* family (evidence bundles, checklists, bootstrap scripts) and a /product/* family that shadows some product-router names — these are operational tooling for the platform’s own promotion process, not part of the research analysis surface this page tours, and are out of scope here. Use /docs locally if you need to look one up.