SMR API Surface
This reference is the control-plane route map used by scripts/smr_control.py.
Public project controls
POST /smr/projects
GET /smr/projects
GET /smr/projects/{project_id}
PATCH /smr/projects/{project_id}
GET /smr/projects/{project_id}/status
POST /smr/projects/{project_id}/pause
POST /smr/projects/{project_id}/resume
POST /smr/projects/{project_id}/archive
POST /smr/projects/{project_id}/unarchive
POST /smr/projects/archive-oldest
Onboarding and provider keys
POST /smr/projects/{project_id}/onboarding/start
POST /smr/projects/{project_id}/onboarding/complete_step
POST /smr/projects/{project_id}/onboarding/dry_run
GET /smr/projects/{project_id}/onboarding/status
POST /smr/projects/{project_id}/provider_keys
GET /smr/projects/{project_id}/provider_keys/{provider}/{funding_source}/status
Starting data
POST /smr/projects/{project_id}/starting-data/upload-urls
Runs and human-in-the-loop surfaces
Canonical run routes (always available):
POST /smr/projects/{project_id}/trigger
GET /smr/runs?project_id=...
GET /smr/runs/{run_id}
POST /smr/runs/{run_id}/pause
POST /smr/runs/{run_id}/resume
POST /smr/runs/{run_id}/stop
GET /smr/runs/{run_id}/questions
POST /smr/runs/{run_id}/questions/{question_id}/respond
GET /smr/projects/{project_id}/questions?status_filter=...
GET /smr/runs/{run_id}/approvals
GET /smr/projects/{project_id}/approvals?status_filter=...
POST /smr/runs/{run_id}/approvals/{approval_id}/approve
POST /smr/runs/{run_id}/approvals/{approval_id}/deny
GET /smr/runs/{run_id}/artifacts
GET /smr/artifacts/{artifact_id}
GET /smr/artifacts/{artifact_id}/content
Project-scoped run aliases (enforce project_id + org_id scoping):
GET /smr/projects/{project_id}/runs
GET /smr/projects/{project_id}/runs/active
GET /smr/projects/{project_id}/runs/{run_id}
POST /smr/projects/{project_id}/runs/{run_id}/pause
POST /smr/projects/{project_id}/runs/{run_id}/resume
POST /smr/projects/{project_id}/runs/{run_id}/stop
GET /smr/projects/{project_id}/runs/{run_id}/questions
POST /smr/projects/{project_id}/runs/{run_id}/questions/{question_id}/respond
GET /smr/projects/{project_id}/runs/{run_id}/approvals
POST /smr/projects/{project_id}/runs/{run_id}/approvals/{approval_id}/approve
POST /smr/projects/{project_id}/runs/{run_id}/approvals/{approval_id}/deny
GET /smr/projects/{project_id}/runs/{run_id}/artifacts
Results, logs, and orchestrator status (run-scoped)
GET /smr/projects/{project_id}/runs/{run_id}/results — outcome + artifacts-by-type + log debug hint
GET /smr/projects/{project_id}/runs/{run_id}/orchestrator — orchestrator phase, heartbeat, turn count, and full turn history (phase, started_at, finished_at, completed, error, duration_seconds per turn)
GET /smr/projects/{project_id}/runs/{run_id}/logs — structured VictoriaLogs query (task_key, component, limit, start, end)
GET /smr/projects/{project_id}/victoria-logs/search — free-text LogSQL search across a project
Ops and observability
GET /smr/projects/{project_id}/usage
GET /smr/projects/{project_id}/ops_status
Runtime surfaces
- SDK client:
synth_ai.sdk.managed_research.SmrControlClient
- CLI group:
synth-ai managed-research ...
- MCP server:
synth-ai-mcp-managed-research or synth-ai managed-research mcp-server
Workspace git status
GET /smr/projects/{project_id}/workspace/git — read-only git status: configured, commit_sha, last_pushed_at, default_branch, vcs_provider, remote_repo. Storage internals (bucket, archive key) are intentionally omitted.
Agent model and kind selection
Three levels of override, in priority order (highest first):
| Level |
How to set |
Scope |
| Per-run override |
trigger_run(agent_model=..., agent_kind=...) or POST /trigger body |
Single run only |
| Per-project default |
set_agent_config(project_id, model=..., agent_kind=...) → writes execution.agent_model / execution.agent_kind |
All future runs |
| Server default |
SMR_AGENT_KIND + SMR_AGENT_MODEL env vars on orchestrator host |
Process-wide |
Valid agent_kind values: codex (default, uses OpenAI), claude (Claude Code), opencode.
When agent_kind changes, the orchestrator rebuilds its runtime for that run (MCP server is reused). The same model and kind is forwarded to all dispatched workers.
MCP tools (31 total)
| Tool |
Description |
smr_list_projects |
List managed research projects |
smr_get_project |
Fetch a project by id |
smr_get_project_status |
Get project status |
smr_create_project |
Create a new project |
smr_pause_project |
Pause a project |
smr_resume_project |
Resume a paused project |
smr_archive_project |
Archive a project |
smr_unarchive_project |
Unarchive a project |
smr_get_starting_data_upload_urls |
Get presigned upload URLs for starting data |
smr_upload_starting_data |
Upload starting data files (text) |
smr_trigger_run |
Trigger a new run (supports agent_model + agent_kind per-run override) |
smr_set_agent_config |
Set default agent model / kind for all future runs of a project |
smr_list_runs |
List runs (all or active-only) |
smr_get_run |
Fetch a run by id |
smr_pause_run |
Pause a run |
smr_resume_run |
Resume a paused run |
smr_stop_run |
Stop a run |
smr_list_project_questions |
List project-level questions |
smr_respond_question |
Respond to a question |
smr_list_project_approvals |
List project-level approvals |
smr_resolve_approval |
Approve or deny an approval |
smr_get_usage |
Fetch project usage metrics |
smr_get_ops_status |
Fetch ops/task status |
smr_get_run_logs |
Query VictoriaLogs for a run (structured) |
smr_search_project_logs |
Free-text LogSQL search across a project |
smr_list_run_artifacts |
List run artifacts |
smr_get_artifact |
Fetch artifact metadata |
smr_get_run_results |
Run result summary: outcome, artifacts, log hint |
smr_get_project_git_status |
Read-only workspace git: commit SHA, last push, branch, remote repo |
smr_get_orchestrator_status |
Orchestrator phase, heartbeat, turn count, and full turn history |
1---2name: 2922-api-surface-956ec1cb3description: SMR API Surface4---5# SMR API Surface67This reference is the control-plane route map used by `scripts/smr_control.py`.89## Public project controls1011- `POST /smr/projects`12- `GET /smr/projects`13- `GET /smr/projects/{project_id}`14- `PATCH /smr/projects/{project_id}`15- `GET /smr/projects/{project_id}/status`16- `POST /smr/projects/{project_id}/pause`17- `POST /smr/projects/{project_id}/resume`18- `POST /smr/projects/{project_id}/archive`19- `POST /smr/projects/{project_id}/unarchive`20- `POST /smr/projects/archive-oldest`2122## Onboarding and provider keys2324- `POST /smr/projects/{project_id}/onboarding/start`25- `POST /smr/projects/{project_id}/onboarding/complete_step`26- `POST /smr/projects/{project_id}/onboarding/dry_run`27- `GET /smr/projects/{project_id}/onboarding/status`28- `POST /smr/projects/{project_id}/provider_keys`29- `GET /smr/projects/{project_id}/provider_keys/{provider}/{funding_source}/status`3031## Starting data3233- `POST /smr/projects/{project_id}/starting-data/upload-urls`3435## Runs and human-in-the-loop surfaces3637Canonical run routes (always available):3839- `POST /smr/projects/{project_id}/trigger`40- `GET /smr/runs?project_id=...`41- `GET /smr/runs/{run_id}`42- `POST /smr/runs/{run_id}/pause`43- `POST /smr/runs/{run_id}/resume`44- `POST /smr/runs/{run_id}/stop`45- `GET /smr/runs/{run_id}/questions`46- `POST /smr/runs/{run_id}/questions/{question_id}/respond`47- `GET /smr/projects/{project_id}/questions?status_filter=...`48- `GET /smr/runs/{run_id}/approvals`49- `GET /smr/projects/{project_id}/approvals?status_filter=...`50- `POST /smr/runs/{run_id}/approvals/{approval_id}/approve`51- `POST /smr/runs/{run_id}/approvals/{approval_id}/deny`52- `GET /smr/runs/{run_id}/artifacts`53- `GET /smr/artifacts/{artifact_id}`54- `GET /smr/artifacts/{artifact_id}/content`5556Project-scoped run aliases (enforce `project_id` + `org_id` scoping):5758- `GET /smr/projects/{project_id}/runs`59- `GET /smr/projects/{project_id}/runs/active`60- `GET /smr/projects/{project_id}/runs/{run_id}`61- `POST /smr/projects/{project_id}/runs/{run_id}/pause`62- `POST /smr/projects/{project_id}/runs/{run_id}/resume`63- `POST /smr/projects/{project_id}/runs/{run_id}/stop`64- `GET /smr/projects/{project_id}/runs/{run_id}/questions`65- `POST /smr/projects/{project_id}/runs/{run_id}/questions/{question_id}/respond`66- `GET /smr/projects/{project_id}/runs/{run_id}/approvals`67- `POST /smr/projects/{project_id}/runs/{run_id}/approvals/{approval_id}/approve`68- `POST /smr/projects/{project_id}/runs/{run_id}/approvals/{approval_id}/deny`69- `GET /smr/projects/{project_id}/runs/{run_id}/artifacts`7071## Results, logs, and orchestrator status (run-scoped)7273- `GET /smr/projects/{project_id}/runs/{run_id}/results` — outcome + artifacts-by-type + log debug hint74- `GET /smr/projects/{project_id}/runs/{run_id}/orchestrator` — orchestrator phase, heartbeat, turn count, and full turn history (`phase`, `started_at`, `finished_at`, `completed`, `error`, `duration_seconds` per turn)75- `GET /smr/projects/{project_id}/runs/{run_id}/logs` — structured VictoriaLogs query (task_key, component, limit, start, end)76- `GET /smr/projects/{project_id}/victoria-logs/search` — free-text LogSQL search across a project7778## Ops and observability7980- `GET /smr/projects/{project_id}/usage`81- `GET /smr/projects/{project_id}/ops_status`8283## Runtime surfaces8485- SDK client: `synth_ai.sdk.managed_research.SmrControlClient`86- CLI group: `synth-ai managed-research ...`87- MCP server: `synth-ai-mcp-managed-research` or `synth-ai managed-research mcp-server`8889## Workspace git status9091- `GET /smr/projects/{project_id}/workspace/git` — read-only git status: `configured`, `commit_sha`, `last_pushed_at`, `default_branch`, `vcs_provider`, `remote_repo`. Storage internals (bucket, archive key) are intentionally omitted.9293## Agent model and kind selection9495Three levels of override, in priority order (highest first):9697| Level | How to set | Scope |98|---|---|---|99| Per-run override | `trigger_run(agent_model=..., agent_kind=...)` or `POST /trigger` body | Single run only |100| Per-project default | `set_agent_config(project_id, model=..., agent_kind=...)` → writes `execution.agent_model` / `execution.agent_kind` | All future runs |101| Server default | `SMR_AGENT_KIND` + `SMR_AGENT_MODEL` env vars on orchestrator host | Process-wide |102103Valid `agent_kind` values: `codex` (default, uses OpenAI), `claude` (Claude Code), `opencode`.104105When `agent_kind` changes, the orchestrator rebuilds its runtime for that run (MCP server is reused). The same model and kind is forwarded to all dispatched workers.106107## MCP tools (31 total)108109| Tool | Description |110|---|---|111| `smr_list_projects` | List managed research projects |112| `smr_get_project` | Fetch a project by id |113| `smr_get_project_status` | Get project status |114| `smr_create_project` | Create a new project |115| `smr_pause_project` | Pause a project |116| `smr_resume_project` | Resume a paused project |117| `smr_archive_project` | Archive a project |118| `smr_unarchive_project` | Unarchive a project |119| `smr_get_starting_data_upload_urls` | Get presigned upload URLs for starting data |120| `smr_upload_starting_data` | Upload starting data files (text) |121| `smr_trigger_run` | Trigger a new run (supports `agent_model` + `agent_kind` per-run override) |122| `smr_set_agent_config` | Set default agent model / kind for all future runs of a project |123| `smr_list_runs` | List runs (all or active-only) |124| `smr_get_run` | Fetch a run by id |125| `smr_pause_run` | Pause a run |126| `smr_resume_run` | Resume a paused run |127| `smr_stop_run` | Stop a run |128| `smr_list_project_questions` | List project-level questions |129| `smr_respond_question` | Respond to a question |130| `smr_list_project_approvals` | List project-level approvals |131| `smr_resolve_approval` | Approve or deny an approval |132| `smr_get_usage` | Fetch project usage metrics |133| `smr_get_ops_status` | Fetch ops/task status |134| `smr_get_run_logs` | Query VictoriaLogs for a run (structured) |135| `smr_search_project_logs` | Free-text LogSQL search across a project |136| `smr_list_run_artifacts` | List run artifacts |137| `smr_get_artifact` | Fetch artifact metadata |138| `smr_get_run_results` | Run result summary: outcome, artifacts, log hint |139| `smr_get_project_git_status` | Read-only workspace git: commit SHA, last push, branch, remote repo |140| `smr_get_orchestrator_status` | Orchestrator phase, heartbeat, turn count, and full turn history |